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

// @dart = 2.9

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

  test('setFillColorRgb', () {
    context.setFillColorRgb(255, 0, 255, 1);
    context.fillRect(0, 0, canvas.width, canvas.height);
    expect(readPixel(2, 2), [255, 0, 255, 255]);
  });

  test('setFillColorHsl hue', () {
    context.setFillColorHsl(0, 100, 50);
    context.fillRect(0, 0, canvas.width, canvas.height);
    checkPixel(readPixel(2, 2), [255, 0, 0, 255]);
  });

  test('setFillColorHsl hue 2', () {
    context.setFillColorHsl(240, 100, 50);
    context.fillRect(0, 0, canvas.width, canvas.height);
    checkPixel(readPixel(2, 2), [0, 0, 255, 255]);
  });

  test('setFillColorHsl sat', () {
    context.setFillColorHsl(0, 0, 50);
    context.fillRect(0, 0, canvas.width, canvas.height);
    checkPixel(readPixel(2, 2), [127, 127, 127, 255]);
  });

  test('setStrokeColorRgb', () {
    context.setStrokeColorRgb(255, 0, 255, 1);
    context.lineWidth = 10;
    context.strokeRect(0, 0, canvas.width, canvas.height);
    expect(readPixel(2, 2), [255, 0, 255, 255]);
  });

  test('setStrokeColorHsl hue', () {
    context.setStrokeColorHsl(0, 100, 50);
    context.lineWidth = 10;
    context.strokeRect(0, 0, canvas.width, canvas.height);
    expect(readPixel(2, 2), [255, 0, 0, 255]);
  });

  test('setStrokeColorHsl hue 2', () {
    context.setStrokeColorHsl(240, 100, 50);
    context.lineWidth = 10;
    context.strokeRect(0, 0, canvas.width, canvas.height);
    expect(readPixel(2, 2), [0, 0, 255, 255]);
  });

  test('setStrokeColorHsl sat', () {
    context.setStrokeColorHsl(0, 0, 50);
    context.lineWidth = 10;
    context.strokeRect(0, 0, canvas.width, canvas.height);
    checkPixel(readPixel(2, 2), [127, 127, 127, 255]);
  });

  test('fillStyle', () {
    context.fillStyle = "red";
    context.fillRect(0, 0, canvas.width, canvas.height);
    checkPixel(readPixel(2, 2), [255, 0, 0, 255]);
  });

  test('strokeStyle', () {
    context.strokeStyle = "blue";
    context.lineWidth = 10;
    context.strokeRect(0, 0, canvas.width, canvas.height);
    expect(readPixel(2, 2), [0, 0, 255, 255]);
  });

  test('fillStyle linearGradient', () {
    var gradient = context.createLinearGradient(0, 0, 20, 20);
    gradient.addColorStop(0, 'red');
    gradient.addColorStop(1, 'blue');
    context.fillStyle = gradient;
    context.fillRect(0, 0, canvas.width, canvas.height);
    expect(context.fillStyle is CanvasGradient, isTrue);
  });

  test('putImageData', () {
    context.fillStyle = 'green';
    context.fillRect(0, 0, canvas.width, canvas.height);

    ImageData expectedData = context.getImageData(0, 0, 10, 10);
    expectedData.data[0] = 25;
    expectedData.data[1] = 65;
    expectedData.data[2] = 255;
    // Set alpha to 255 to make the pixels show up.
    expectedData.data[3] = 255;

    context.putImageData(expectedData, 0, 0);

    var resultingData = context.getImageData(0, 0, 10, 10);
    // Make sure that we read back what we wrote.
    expect(resultingData.data, expectedData.data);
  });

  test('putImageData dirty rectangle', () {
    context.fillStyle = 'green';
    context.fillRect(0, 0, canvas.width, canvas.height);

    ImageData drawnData = context.getImageData(0, 0, 10, 10);
    drawnData.data[0] = 25;
    drawnData.data[1] = 65;
    drawnData.data[2] = 255;
    drawnData.data[3] = 255;

    // Draw these pixels to the 2nd pixel.
    drawnData.data[2 * 4 + 0] = 25;
    drawnData.data[2 * 4 + 1] = 65;
    drawnData.data[2 * 4 + 2] = 255;
    drawnData.data[2 * 4 + 3] = 255;

    // Draw these pixels to the 8th pixel.
    drawnData.data[7 * 4 + 0] = 25;
    drawnData.data[7 * 4 + 1] = 65;
    drawnData.data[7 * 4 + 2] = 255;
    drawnData.data[7 * 4 + 3] = 255;

    // Use a dirty rectangle to limit what pixels are drawn.
    context.putImageData(drawnData, 0, 0, 1, 0, 5, 5);

    // Expect the data to be all green, as we skip all drawn pixels.
    ImageData expectedData = context.createImageData(10, 10);
    for (int i = 0; i < expectedData.data.length; i++) {
      switch (i % 4) {
        case 0:
          expectedData.data[i] = 0;
          break;
        case 1:
          expectedData.data[i] = 128;
          break;
        case 2:
          expectedData.data[i] = 0;
          break;
        case 3:
          expectedData.data[i] = 255;
          break;
      }
    }
    // Third pixel was copied.
    expectedData.data[2 * 4 + 0] = 25;
    expectedData.data[2 * 4 + 1] = 65;
    expectedData.data[2 * 4 + 2] = 255;
    expectedData.data[2 * 4 + 3] = 255;

    // Make sure that our data is all green.
    var resultingData = context.getImageData(0, 0, 10, 10);
    expect(resultingData.data, expectedData.data);
  });

  test('putImageData throws with wrong number of arguments', () {
    ImageData expectedData = context.getImageData(0, 0, 10, 10);

    // TODO(antonm): in Dartium ArgumentError should be thrown too.
    expect(() => context.putImageData(expectedData, 0, 0, 1), throws);
    expect(() => context.putImageData(expectedData, 0, 0, 1, 1), throws);
    expect(() => context.putImageData(expectedData, 0, 0, 1, 1, 5), throws);
  });
}
