// Copyright (c) 2012, 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 'package:unittest/html_individual_config.dart';
import 'package:unittest/unittest.dart';

// Some rounding errors in the browsers.
checkPixel(List<int> pixel, List<int> expected) {
  expect(pixel[0], closeTo(expected[0], 2));
  expect(pixel[1], closeTo(expected[1], 2));
  expect(pixel[2], closeTo(expected[2], 2));
  expect(pixel[3], closeTo(expected[3], 2));
}

var canvas;
var context;
var otherCanvas;
var otherContext;
var video;

void createCanvas() {
  canvas = new CanvasElement();
  canvas.width = 100;
  canvas.height = 100;

  context = canvas.context2D;
}

void createOtherCanvas() {
  otherCanvas = new CanvasElement();
  otherCanvas.width = 10;
  otherCanvas.height = 10;
  otherContext = otherCanvas.context2D;
  otherContext.fillStyle = "red";
  otherContext.fillRect(0, 0, otherCanvas.width, otherCanvas.height);
}

void setupFunc() {
  createCanvas();
  createOtherCanvas();
  video = new VideoElement();
}

void tearDownFunc() {
  canvas = null;
  context = null;
  otherCanvas = null;
  otherContext = null;
  video = null;
}

List<int> readPixel(int x, int y) {
  var imageData = context.getImageData(x, y, 1, 1);
  return imageData.data;
}

/// Returns true if the pixel has some data in it, false otherwise.
bool isPixelFilled(int x, int y) => readPixel(x,y).any((p) => p != 0);

String pixelDataToString(List<int> data, int x, int y) {
  return '[${data.join(", ")}]';
}

String _filled(bool v) => v ? "filled" : "unfilled";

void expectPixelFilled(int x, int y, [bool filled = true]) {
  expect(isPixelFilled(x, y), filled, reason:
      'Pixel at ($x, $y) was expected to'
      ' be: <${_filled(filled)}> but was: <${_filled(!filled)}> with data: '
      '${pixelDataToString(readPixel(x, y), x, y)}');
}

void expectPixelUnfilled(int x, int y) {
  expectPixelFilled(x, y, false);
}

main() {
  useHtmlIndividualConfiguration();

  group('pixel_manipulation', () {
    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);
    });
  });

  group('arc', () {
    setUp(setupFunc);
    tearDown(tearDownFunc);

    test('default arc should be clockwise', () {
      context.beginPath();
      final r = 10;

      // Center of arc.
      final cx = 20;
      final cy = 20;
      // Arc centered at (20, 20) with radius 10 will go clockwise
      // from (20 + r, 20) to (20, 20 + r), which is 1/4 of a circle.
      context.arc(cx, cy, r, 0, PI/2);

      context.strokeStyle = 'green';
      context.lineWidth = 2;
      context.stroke();

      // Center should not be filled.
      expectPixelUnfilled(cx, cy);

      // (cx + r, cy) should be filled.
      expectPixelFilled(cx + r, cy, true);
      // (cx, cy + r) should be filled.
      expectPixelFilled(cx, cy + r, true);
      // (cx - r, cy) should be empty.
      expectPixelFilled(cx - r, cy, false);
      // (cx, cy - r) should be empty.
      expectPixelFilled(cx, cy - r, false);

      // (cx + r/SQRT2, cy + r/SQRT2) should be filled.
      expectPixelFilled((cx + r/SQRT2).toInt(), (cy + r/SQRT2).toInt(), true);

      // (cx - r/SQRT2, cy - r/SQRT2) should be empty.
      expectPixelFilled((cx - r/SQRT2).toInt(), (cy + r/SQRT2).toInt(), false);

      // (cx + r/SQRT2, cy + r/SQRT2) should be empty.
      expectPixelFilled((cx - r/SQRT2).toInt(), (cy - r/SQRT2).toInt(), false);

      // (cx - r/SQRT2, cy - r/SQRT2) should be empty.
      expectPixelFilled((cx + r/SQRT2).toInt(), (cy - r/SQRT2).toInt(), false);
    });

    test('arc anticlockwise', () {
      context.beginPath();
      final r = 10;

      // Center of arc.
      final cx = 20;
      final cy = 20;
      // Arc centered at (20, 20) with radius 10 will go anticlockwise
      // from (20 + r, 20) to (20, 20 + r), which is 3/4 of a circle.
      // Because of the way arc work, when going anti-clockwise, the end points
      // are not included, so small values are added to radius to make a little
      // more than a 3/4 circle.
      context.arc(cx, cy, r, .1, PI/2 - .1, true);

      context.strokeStyle = 'green';
      context.lineWidth = 2;
      context.stroke();

      // Center should not be filled.
      expectPixelUnfilled(cx, cy);

      // (cx + r, cy) should be filled.
      expectPixelFilled(cx + r, cy, true);
      // (cx, cy + r) should be filled.
      expectPixelFilled(cx, cy + r, true);
      // (cx - r, cy) should be filled.
      expectPixelFilled(cx - r, cy, true);
      // (cx, cy - r) should be filled.
      expectPixelFilled(cx, cy - r, true);

      // (cx + r/SQRT2, cy + r/SQRT2) should be empty.
      expectPixelFilled((cx + r/SQRT2).toInt(), (cy + r/SQRT2).toInt(), false);

      // (cx - r/SQRT2, cy - r/SQRT2) should be filled.
      expectPixelFilled((cx - r/SQRT2).toInt(), (cy + r/SQRT2).toInt(), true);

      // (cx + r/SQRT2, cy + r/SQRT2) should be filled.
      expectPixelFilled((cx - r/SQRT2).toInt(), (cy - r/SQRT2).toInt(), true);

      // (cx - r/SQRT2, cy - r/SQRT2) should be filled.
      expectPixelFilled((cx + r/SQRT2).toInt(), (cy - r/SQRT2).toInt(), true);
    });
  });

  group('drawImage_image_element', () {
    setUp(setupFunc);
    tearDown(tearDownFunc);
    // Draw an image to the canvas from an image element.
    test('with 3 params', () {
      var dataUrl = otherCanvas.toDataUrl('image/gif');
      var img = new ImageElement();

      img.onLoad.listen(expectAsync((_) {
        context.drawImage(img, 50, 50);

        expectPixelFilled(50, 50);
        expectPixelFilled(55, 55);
        expectPixelFilled(59, 59);
        expectPixelUnfilled(60, 60);
        expectPixelUnfilled(0, 0);
        expectPixelUnfilled(70, 70);
      }));
      img.onError.listen((_) {
        fail('URL failed to load.');
      });
      img.src = dataUrl;
    });

    // Draw an image to the canvas from an image element and scale it.
    test('with 5 params', () {
      var dataUrl = otherCanvas.toDataUrl('image/gif');
      var img = new ImageElement();

      img.onLoad.listen(expectAsync((_) {
        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);
      }));
      img.onError.listen((_) {
        fail('URL failed to load.');
      });
      img.src = dataUrl;
    });

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

      img.onLoad.listen(expectAsync((_) {
        // 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);
      }));
      img.onError.listen((_) {
        fail('URL failed to load.');
      });
      img.src = dataUrl;
    });
  });

  // These videos and base64 strings are the same video, representing 2
  // frames of 8x8 red pixels.
  // The videos were created with:
  //   convert -size 8x8 xc:red blank1.jpg
  //   convert -size 8x8 xc:red blank2.jpg
  //   avconv -f image2  -i "blank%d.jpg" -c:v libx264 small.mp4
  //   avconv -i small.mp4 small.webm
  //   python -m base64 -e small.mp4
  //   python -m base64 -e small.webm
  var mp4VideoUrl = '/root_dart/tests/html/small.mp4';
  var webmVideoUrl = '/root_dart/tests/html/small.webm';
  var mp4VideoDataUrl =
      'data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAA'
      'AIZnJlZQAAAsdtZGF0AAACmwYF//+X3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlID'
      'EyMCByMjE1MSBhM2Y0NDA3IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZW'
      'Z0IDIwMDMtMjAxMSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG'
      '9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MToweD'
      'ExMSBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj'
      '0wIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MCBjcW09MC'
      'BkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aH'
      'JlYWRzPTE4IHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZW'
      'Q9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl'
      '9weXJhbWlkPTAgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MCBvcG'
      'VuX2dvcD0xIHdlaWdodHA9MiBrZXlpbnQ9MjUwIGtleWludF9taW49MjUgc2NlbmVjdX'
      'Q9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPT'
      'EgY3JmPTUxLjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3'
      'JhdGlvPTEuMjUgYXE9MToxLjAwAIAAAAARZYiEB//3aoK5/tP9+8yeuIEAAAAHQZoi2P'
      '/wgAAAAzxtb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAAUAABAAABAAAAAAAAAA'
      'AAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAA'
      'AAAAAAAAAAAAAAAAAAAAACAAAAGGlvZHMAAAAAEICAgAcAT/////7/AAACUHRyYWsAAA'
      'BcdGtoZAAAAA8AAAAAAAAAAAAAAAEAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAQAAAA'
      'AAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAACAAAAAgAAAAAACRlZHRzAAAAHG'
      'Vsc3QAAAAAAAAAAQAAAFAAAAABAAEAAAAAAchtZGlhAAAAIG1kaGQAAAAAAAAAAAAAAA'
      'AAAAAZAAAAAlXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSG'
      'FuZGxlcgAAAAFzbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZg'
      'AAAAAAAAABAAAADHVybCAAAAABAAABM3N0YmwAAACXc3RzZAAAAAAAAAABAAAAh2F2Yz'
      'EAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAACAAIAEgAAABIAAAAAAAAAAEAAAAAAAAAAA'
      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAAxYXZjQwFNQAr/4QAYZ01ACuiPyy'
      '4C2QAAAwABAAADADIPEiUSAQAGaOvAZSyAAAAAGHN0dHMAAAAAAAAAAQAAAAIAAAABAA'
      'AAFHN0c3MAAAAAAAAAAQAAAAEAAAAYY3R0cwAAAAAAAAABAAAAAgAAAAEAAAAcc3RzYw'
      'AAAAAAAAABAAAAAQAAAAEAAAABAAAAHHN0c3oAAAAAAAAAAAAAAAIAAAK0AAAACwAAAB'
      'hzdGNvAAAAAAAAAAIAAAAwAAAC5AAAAGB1ZHRhAAAAWG1ldGEAAAAAAAAAIWhkbHIAAA'
      'AAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAAK2lsc3QAAAAjqXRvbwAAABtkYXRhAAAAAQ'
      'AAAABMYXZmNTMuMjEuMQ==';
  var webmVideoDataUrl =
      'data:video/webm;base64,GkXfowEAAAAAAAAfQoaBAUL3gQFC8oEEQvOBCEKChHdlY'
      'm1Ch4ECQoWBAhhTgGcBAAAAAAAB/hFNm3RALE27i1OrhBVJqWZTrIHfTbuMU6uEFlSua'
      '1OsggEsTbuMU6uEHFO7a1OsggHk7AEAAAAAAACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVSalmAQAAAAAAA'
      'EEq17GDD0JATYCLTGF2ZjUzLjIxLjFXQYtMYXZmNTMuMjEuMXOkkJatuHwTJ7cvFLSzB'
      'Smxbp5EiYhAVAAAAAAAABZUrmsBAAAAAAAAR64BAAAAAAAAPteBAXPFgQGcgQAitZyDd'
      'W5khoVWX1ZQOIOBASPjg4QCYloA4AEAAAAAAAASsIEIuoEIVLCBCFS6gQhUsoEDH0O2d'
      'QEAAAAAAABZ54EAo72BAACA8AIAnQEqCAAIAABHCIWFiIWEiAICAnWqA/gD+gINTRgA/'
      'v0hRf/kb+PnRv/I4//8WE8DijI//FRAo5WBACgAsQEAARAQABgAGFgv9AAIAAAcU7trA'
      'QAAAAAAAA67jLOBALeH94EB8YIBfw==';
  group('drawImage_video_element', () {
    setUp(setupFunc);
    tearDown(tearDownFunc);

    test('with 3 params', () {
      video.onCanPlay.listen(expectAsync((_) {
        context.drawImage(video, 50, 50);

        expectPixelFilled(50, 50);
        expectPixelFilled(54, 54);
        expectPixelFilled(57, 57);
        expectPixelUnfilled(58, 58);
        expectPixelUnfilled(0, 0);
        expectPixelUnfilled(70, 70);
      }));

      video.onError.listen((_) {
        fail('URL failed to load.');
      });

      if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') {
        video.src = webmVideoUrl;
      } else if(video.canPlayType('video/mp4; codecs="avc1.4D401E, mp4a.40.2"',
            null) != '') {
        video.src = mp4VideoUrl;
      } else {
        window.console.log('Video is not supported on this system.');
      }
    });

    test('with 5 params', () {
      video.onCanPlay.listen(expectAsync((_) {
        context.drawImageToRect(video, 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);
      }));
      video.onError.listen((_) {
        fail('URL failed to load.');
      });

      if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') {
        video.src = webmVideoUrl;
      } else if(video.canPlayType('video/mp4; codecs="avc1.4D401E, mp4a.40.2"',
            null) != '') {
        video.src = mp4VideoUrl;
      } else {
        // TODO(amouravski): Better fallback?
        window.console.log('Video is not supported on this system.');
      }
    });

    test('with 9 params', () {
      video.onCanPlay.listen(expectAsync((_) {
        context.drawImageToRect(video, new Rectangle(50, 50, 20, 20),
          sourceRect: new Rectangle(2, 2, 6, 6));

        expectPixelFilled(50, 50);
        expectPixelFilled(55, 55);
        expectPixelFilled(59, 59);
        expectPixelFilled(60, 60);
        expectPixelFilled(69, 69);
        expectPixelUnfilled(70, 70);
        expectPixelUnfilled(0, 0);
        expectPixelUnfilled(80, 80);
      }));
      video.onError.listen((_) {
        fail('URL failed to load.');
      });

      if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') {
        video.src = webmVideoUrl;
      } else if(video.canPlayType('video/mp4; codecs="avc1.4D401E, mp4a.40.2"',
            null) != '') {
        video.src = mp4VideoUrl;
      } else {
        // TODO(amouravski): Better fallback?
        window.console.log('Video is not supported on this system.');
      }
    });
  });

  group('drawImage_video_element_dataUrl', () {
    setUp(setupFunc);
    tearDown(tearDownFunc);

    test('with 9 params', () {
      video = new VideoElement();
      canvas = new CanvasElement();
      video.onCanPlay.listen(expectAsync((_) {
        context.drawImageToRect(video, new Rectangle(50, 50, 20, 20),
          sourceRect: new Rectangle(2, 2, 6, 6));

        expectPixelFilled(50, 50);
        expectPixelFilled(55, 55);
        expectPixelFilled(59, 59);
        expectPixelFilled(60, 60);
        expectPixelFilled(69, 69);
        expectPixelUnfilled(70, 70);
        expectPixelUnfilled(0, 0);
        expectPixelUnfilled(80, 80);
      }));
      video.onError.listen((_) {
        fail('URL failed to load.');
      });

      if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') {
        video.src = webmVideoDataUrl;
      } else if(video.canPlayType('video/mp4; codecs="avc1.4D401E, mp4a.40.2"',
            null) != '') {
        video.src = mp4VideoDataUrl;
      } else {
        // TODO(amouravski): Better fallback?
        window.console.log('Video is not supported on this system.');
      }
    });
  });

  group('drawImage_canvas_element', () {
    setUp(setupFunc);
    tearDown(tearDownFunc);

    test('with 3 params', () {
      // Draw an image to the canvas from a canvas element.
      context.drawImage(otherCanvas, 50, 50);

      expectPixelFilled(50, 50);
      expectPixelFilled(55, 55);
      expectPixelFilled(59, 59);
      expectPixelUnfilled(60, 60);
      expectPixelUnfilled(0, 0);
      expectPixelUnfilled(70, 70);
    });
    test('with 5 params', () {
      // Draw an image to the canvas from a canvas element.
      context.drawImageToRect(otherCanvas, 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);
    });
    test('with 9 params', () {
      // Draw an image to the canvas from a canvas element.
      otherContext.fillStyle = "blue";
      otherContext.fillRect(5, 5, 5, 5);
      context.drawImageToRect(otherCanvas, 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);
    });

    test('createImageData', () {
      var imageData = context.createImageData(15, 15);
      expect(imageData.width, 15);
      expect(imageData.height, 15);

      var other = context.createImageDataFromImageData(imageData);
      expect(other.width, 15);
      expect(other.height, 15);
    });

    test('createPattern', () {
      var pattern = context.createPattern(new CanvasElement(), '');
      //var pattern2 = context.createPatternFromImage(new ImageElement(), '');
    });
  });

  group('fillText', () {
    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, y);
      expectPixelUnfilled(x + width + 1, 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, y);
      expectPixelUnfilled(x + width + 1, 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);
    });
  });
}
