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

  final x = 20;
  final y = 20;

  test('without maxWidth', () {
    context.font = '40pt Garamond';
    context.fillStyle = 'blue';

    // Draw a blue box.
    context.fillText('█', x, y);

    var width = context.measureText('█').width.ceil();

    checkPixel(readPixel(x, y), [0, 0, 255, 255]);
    checkPixel(readPixel(x + 10, y), [0, 0, 255, 255]);

    expectPixelUnfilled(x - 10, y);
    expectPixelFilled(x, y);
    expectPixelFilled(x + 10, y);

    // The box does not draw after `width` pixels.
    // Check -2 rather than -1 because this seems
    // to run into a rounding error on Mac bots.
    expectPixelFilled((x + width - 2).toInt(), y);
    expectPixelUnfilled((x + width + 1).toInt(), y);
  });

  test('with maxWidth null', () {
    context.font = '40pt Garamond';
    context.fillStyle = 'blue';

    // Draw a blue box with null maxWidth.
    context.fillText('█', x, y, null);

    var width = context.measureText('█').width.ceil();

    checkPixel(readPixel(x, y), [0, 0, 255, 255]);
    checkPixel(readPixel(x + 10, y), [0, 0, 255, 255]);

    expectPixelUnfilled(x - 10, y);
    expectPixelFilled(x, y);
    expectPixelFilled(x + 10, y);

    // The box does not draw after `width` pixels.
    // Check -2 rather than -1 because this seems
    // to run into a rounding error on Mac bots.
    expectPixelFilled((x + width - 2).toInt(), y);
    expectPixelUnfilled((x + width + 1).toInt(), y);
  });

  test('with maxWidth defined', () {
    context.font = '40pt Garamond';
    context.fillStyle = 'blue';

    final maxWidth = 20;

    // Draw a blue box that's at most 20 pixels wide.
    context.fillText('█', x, y, maxWidth);

    checkPixel(readPixel(x, y), [0, 0, 255, 255]);
    checkPixel(readPixel(x + 10, y), [0, 0, 255, 255]);

    // The box does not draw after 20 pixels.
    expectPixelUnfilled(x - 10, y);
    expectPixelUnfilled(x + maxWidth + 1, y);
    expectPixelUnfilled(x + maxWidth + 20, y);
    expectPixelFilled(x, y);
    expectPixelFilled(x + 10, y);
  });
}
