// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library canvas_rendering_context_2d_test;

import 'dart:html';
import 'dart:math';

import 'canvas_rendering_util.dart';
import 'package:expect/legacy/minitest.dart'; // ignore: deprecated_member_use_from_same_package

main() {
  setUp(setupFunc);
  tearDown(tearDownFunc);

  test('default arc should be clockwise', () {
    context.beginPath();
    final r = 10;

    // Center of arc.
    final cx = 20;
    final cy = 20;
    // Arc centered at (20, 20) with radius 10 will go clockwise
    // from (20 + r, 20) to (20, 20 + r), which is 1/4 of a circle.
    context.arc(cx, cy, r, 0, pi / 2);

    context.strokeStyle = 'green';
    context.lineWidth = 2;
    context.stroke();

    // Center should not be filled.
    expectPixelUnfilled(cx, cy);

    // (cx + r, cy) should be filled.
    expectPixelFilled(cx + r, cy, true);
    // (cx, cy + r) should be filled.
    expectPixelFilled(cx, cy + r, true);
    // (cx - r, cy) should be empty.
    expectPixelFilled(cx - r, cy, false);
    // (cx, cy - r) should be empty.
    expectPixelFilled(cx, cy - r, false);

    // (cx + r/SQRT2, cy + r/SQRT2) should be filled.
    expectPixelFilled((cx + r / sqrt2).toInt(), (cy + r / sqrt2).toInt(), true);

    // (cx - r/SQRT2, cy - r/SQRT2) should be empty.
    expectPixelFilled(
      (cx - r / sqrt2).toInt(),
      (cy + r / sqrt2).toInt(),
      false,
    );

    // (cx + r/SQRT2, cy + r/SQRT2) should be empty.
    expectPixelFilled(
      (cx - r / sqrt2).toInt(),
      (cy - r / sqrt2).toInt(),
      false,
    );

    // (cx - r/SQRT2, cy - r/SQRT2) should be empty.
    expectPixelFilled(
      (cx + r / sqrt2).toInt(),
      (cy - r / sqrt2).toInt(),
      false,
    );
  });

  test('arc anticlockwise', () {
    context.beginPath();
    final r = 10;

    // Center of arc.
    final cx = 20;
    final cy = 20;
    // Arc centered at (20, 20) with radius 10 will go anticlockwise
    // from (20 + r, 20) to (20, 20 + r), which is 3/4 of a circle.
    // Because of the way arc work, when going anti-clockwise, the end points
    // are not included, so small values are added to radius to make a little
    // more than a 3/4 circle.
    context.arc(cx, cy, r, .1, pi / 2 - .1, true);

    context.strokeStyle = 'green';
    context.lineWidth = 2;
    context.stroke();

    // Center should not be filled.
    expectPixelUnfilled(cx, cy);

    // (cx + r, cy) should be filled.
    expectPixelFilled(cx + r, cy, true);
    // (cx, cy + r) should be filled.
    expectPixelFilled(cx, cy + r, true);
    // (cx - r, cy) should be filled.
    expectPixelFilled(cx - r, cy, true);
    // (cx, cy - r) should be filled.
    expectPixelFilled(cx, cy - r, true);

    // (cx + r/SQRT2, cy + r/SQRT2) should be empty.
    expectPixelFilled(
      (cx + r / sqrt2).toInt(),
      (cy + r / sqrt2).toInt(),
      false,
    );

    // (cx - r/SQRT2, cy - r/SQRT2) should be filled.
    expectPixelFilled((cx - r / sqrt2).toInt(), (cy + r / sqrt2).toInt(), true);

    // (cx + r/SQRT2, cy + r/SQRT2) should be filled.
    expectPixelFilled((cx - r / sqrt2).toInt(), (cy - r / sqrt2).toInt(), true);

    // (cx - r/SQRT2, cy - r/SQRT2) should be filled.
    expectPixelFilled((cx + r / sqrt2).toInt(), (cy - r / sqrt2).toInt(), true);
  });
}
