// 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:async';
import 'dart:html';
import 'dart:math';

import 'canvas_rendering_util.dart';
import 'package:async_helper/async_helper.dart';

Future testWithThreeParams() async {
  setupFunc();
  // Draw an image to the canvas from an image element.
  var dataUrl = otherCanvas.toDataUrl('image/gif');
  var img = new ImageElement();

  var loadedFuture = img.onLoad.first;
  img.onError.listen((_) {
    throw ('URL failed to load.');
  });
  img.src = dataUrl;

  await loadedFuture;
  context.drawImage(img, 50, 50);

  expectPixelFilled(50, 50);
  expectPixelFilled(55, 55);
  expectPixelFilled(59, 59);
  expectPixelUnfilled(60, 60);
  expectPixelUnfilled(0, 0);
  expectPixelUnfilled(70, 70);
  tearDownFunc();
}

Future testWithFiveParams() async {
  setupFunc();
  // Draw an image to the canvas from an image element and scale it.
  var dataUrl = otherCanvas.toDataUrl('image/gif');
  var img = new ImageElement();

  var loadedFuture = img.onLoad.first;
  img.onError.listen((_) {
    throw ('URL failed to load.');
  });
  img.src = dataUrl;

  await loadedFuture;
  context.drawImageToRect(img, new Rectangle(50, 50, 20, 20));

  expectPixelFilled(50, 50);
  expectPixelFilled(55, 55);
  expectPixelFilled(59, 59);
  expectPixelFilled(60, 60);
  expectPixelFilled(69, 69);
  expectPixelUnfilled(70, 70);
  expectPixelUnfilled(0, 0);
  expectPixelUnfilled(80, 80);
  tearDownFunc();
}

Future testWithNineParams() async {
  setupFunc();
  // Draw an image to the canvas from an image element and scale it.
  otherContext.fillStyle = "blue";
  otherContext.fillRect(5, 5, 5, 5);
  var dataUrl = otherCanvas.toDataUrl('image/gif');
  var img = new ImageElement();

  var loadedFuture = img.onLoad.first;
  img.onError.listen((_) {
    throw ('URL failed to load.');
  });
  img.src = dataUrl;

  await loadedFuture;
  // This will take a 6x6 square from the first canvas from position 2,2
  // and then scale it to a 20x20 square and place it to the second
  // canvas at 50,50.
  context.drawImageToRect(img, new Rectangle(50, 50, 20, 20),
      sourceRect: new Rectangle(2, 2, 6, 6));

  checkPixel(readPixel(50, 50), [255, 0, 0, 255]);
  checkPixel(readPixel(55, 55), [255, 0, 0, 255]);
  checkPixel(readPixel(60, 50), [255, 0, 0, 255]);
  checkPixel(readPixel(65, 65), [0, 0, 255, 255]);
  checkPixel(readPixel(69, 69), [0, 0, 255, 255]);

  expectPixelFilled(50, 50);
  expectPixelFilled(55, 55);
  expectPixelFilled(59, 59);
  expectPixelFilled(60, 60);
  expectPixelFilled(69, 69);
  expectPixelUnfilled(70, 70);
  expectPixelUnfilled(0, 0);
  expectPixelUnfilled(80, 80);
  tearDownFunc();
}

main() {
  asyncTest(() async {
    await testWithThreeParams();
    await testWithFiveParams();
    await testWithNineParams();
  });
}
