// 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.

// @dart = 2.9

library canvas_rendering_context_2d_test;

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

import 'canvas_rendering_util.dart';
import 'package:expect/minitest.dart';

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);
  });
}
