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

// @dart = 2.6
import 'package:ui/src/engine.dart';
import 'package:ui/ui.dart' as ui;

import 'package:test/test.dart';

import 'mock_engine_canvas.dart';

void main() {
  setUpAll(() {
    WebExperiments.ensureInitialized();
    Profiler.ensureInitialized();
  });

  group('EngineCanvas', () {
    MockEngineCanvas mockCanvas;
    ui.Paragraph paragraph;

    void testCanvas(
        String description, void Function(EngineCanvas canvas) testFn,
        {ui.Rect canvasSize, ui.VoidCallback whenDone}) {
      canvasSize ??= const ui.Rect.fromLTWH(0, 0, 100, 100);
      test(description, () {
        testFn(BitmapCanvas(canvasSize));
        testFn(DomCanvas());
        testFn(HoudiniCanvas(canvasSize));
        testFn(mockCanvas = MockEngineCanvas());
        if (whenDone != null) {
          whenDone();
        }
      });
    }

    testCanvas('draws laid out paragraph', (EngineCanvas canvas) {
      final RecordingCanvas recordingCanvas =
          RecordingCanvas(const ui.Rect.fromLTWH(0, 0, 100, 100));
      final ui.ParagraphBuilder builder =
          ui.ParagraphBuilder(ui.ParagraphStyle());
      builder.addText('sample');
      paragraph = builder.build();
      paragraph.layout(const ui.ParagraphConstraints(width: 100));
      recordingCanvas.drawParagraph(paragraph, const ui.Offset(10, 10));
      canvas.clear();
      recordingCanvas.apply(canvas);
    }, whenDone: () {
      expect(mockCanvas.methodCallLog, hasLength(3));

      MockCanvasCall call = mockCanvas.methodCallLog[0];
      expect(call.methodName, 'clear');

      call = mockCanvas.methodCallLog[1];
      expect(call.methodName, 'drawParagraph');
      expect(call.arguments['paragraph'], paragraph);
      expect(call.arguments['offset'], const ui.Offset(10, 10));
    });

    testCanvas('ignores paragraphs that were not laid out',
        (EngineCanvas canvas) {
      final RecordingCanvas recordingCanvas =
          RecordingCanvas(const ui.Rect.fromLTWH(0, 0, 100, 100));
      final ui.ParagraphBuilder builder =
          ui.ParagraphBuilder(ui.ParagraphStyle());
      builder.addText('sample');
      final ui.Paragraph paragraph = builder.build();
      recordingCanvas.drawParagraph(paragraph, const ui.Offset(10, 10));
      canvas.clear();
      recordingCanvas.apply(canvas);
    }, whenDone: () {
      expect(mockCanvas.methodCallLog, hasLength(2));
      expect(mockCanvas.methodCallLog[0].methodName, 'clear');
      expect(mockCanvas.methodCallLog[1].methodName, 'endOfPaint');
    });
  });
}
