// 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/minitest.dart';

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