// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:math' as math;

import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
import 'package:ui/ui.dart';
import 'package:web_engine_tester/golden_tester.dart';

import 'utils.dart';

void main() {
  internalBootstrapBrowserTest(() => testMain);
}

Future<void> testMain() async {
  setUpUiTest();

  const Rect region = Rect.fromLTWH(0, 0, 300, 300);

  test('draw arc', () async {
    final PictureRecorder recorder = PictureRecorder();
    final Canvas canvas = Canvas(recorder, region);
    canvas.drawArc(
      const Rect.fromLTRB(100, 100, 200, 200),
      math.pi / 3.0,
      4.0 * math.pi / 3.0,
      false,
      Paint()
        ..style = PaintingStyle.stroke
        ..strokeWidth = 3.0
        ..color = const Color(0xFFFF00FF)
    );

    await drawPictureUsingCurrentRenderer(recorder.endRecording());

    await matchGoldenFile('ui_canvas_draw_arc.png', region: region);
  });

  test('draw circle', () async {
    final PictureRecorder recorder = PictureRecorder();
    final Canvas canvas = Canvas(recorder, region);
    canvas.drawCircle(
      const Offset(150, 150),
      50,
      Paint()
        ..style = PaintingStyle.stroke
        ..strokeWidth = 3.0
        ..color = const Color(0xFFFF0000)
    );

    await drawPictureUsingCurrentRenderer(recorder.endRecording());

    await matchGoldenFile('ui_canvas_draw_circle.png', region: region);
  });

  test('draw oval', () async {
    final PictureRecorder recorder = PictureRecorder();
    final Canvas canvas = Canvas(recorder, region);
    canvas.drawOval(
      const Rect.fromLTRB(100, 125, 200, 175),
      Paint()
        ..style = PaintingStyle.stroke
        ..strokeWidth = 3.0
        ..color = const Color(0xFF00FFFF)
    );

    await drawPictureUsingCurrentRenderer(recorder.endRecording());

    await matchGoldenFile('ui_canvas_draw_oval.png', region: region);
  });
}
