// 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 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
import 'package:ui/src/engine.dart';
import 'package:ui/ui.dart';

import 'paragraph/helper.dart';
import 'screenshot.dart';

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

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

  /// Regression test for https://github.com/flutter/flutter/issues/64734.
  test('Clips using difference', () async {
    const Offset shift = Offset(8, 8);
    const Rect region = Rect.fromLTRB(0, 0, 400, 300);
    final RecordingCanvas canvas = RecordingCanvas(region);
    final Rect titleRect = const Rect.fromLTWH(20, 0, 50, 20).shift(shift);
    final SurfacePaint paint = SurfacePaint()
      ..style = PaintingStyle.stroke
      ..color = const Color(0xff000000)
      ..strokeWidth = 1;
    canvas.save();
    try {
      final Rect borderRect = Rect.fromLTRB(0, 10, region.width, region.height).shift(shift);
      canvas.clipRect(titleRect, ClipOp.difference);
      canvas.drawRect(borderRect, paint);
    } finally {
      canvas.restore();
    }
    canvas.drawRect(titleRect, paint);
    await canvasScreenshot(canvas, 'clip_op_difference',
        region: const Rect.fromLTRB(0, 0, 420, 360));
  });

  /// Regression test for https://github.com/flutter/flutter/issues/86345
  test('Clips with zero width or height', () async {
    const Rect region = Rect.fromLTRB(0, 0, 400, 300);
    final RecordingCanvas canvas = RecordingCanvas(region);

    final SurfacePaint paint = SurfacePaint()
      ..style = PaintingStyle.fill
      ..color = const Color(0xff00ff00);
    final SurfacePaint borderPaint = SurfacePaint()
      ..style = PaintingStyle.stroke
      ..color = const Color(0xffff0000)
      ..strokeWidth = 1;

    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        final double x = 10 + i * 70;
        final double y = 10 + j * 70;
        canvas.save();
        // Clip.
        canvas.clipRect(
          Rect.fromLTWH(x, y, i * 25, j * 25),
          ClipOp.intersect,
        );
        // Draw the blue (clipped) rect.
        canvas.drawRect(
          Rect.fromLTWH(x, y, 50, 50),
          paint,
        );
        final Paragraph p = plain(
          EngineParagraphStyle(fontFamily: 'Roboto', fontSize: 34),
          '23',
          textStyle: EngineTextStyle.only(color: const Color(0xff0000ff)),
        );
        p.layout(const ParagraphConstraints(width: double.infinity));
        canvas.drawParagraph(p, Offset(x, y));
        canvas.restore();
        // Draw the red border.
        canvas.drawRect(
          Rect.fromLTWH(x, y, 50, 50),
          borderPaint,
        );
      }
    }
    await canvasScreenshot(canvas, 'clip_zero_width_height', region: region);
  });
}
