library InstanceOfTest;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
import 'dart:html';

main() {
  CanvasElement canvas;

  canvas = new Element.tag('canvas');
  canvas.attributes['width'] = 100;
  canvas.attributes['height'] = 100;
  document.body.nodes.add(canvas);

  var isCanvasRenderingContext = predicate((x) => x is CanvasRenderingContext,
      'is a CanvasRenderingContext');
  var isCanvasRenderingContext2D = 
      predicate((x) => x is CanvasRenderingContext2D,
      'is a CanvasRenderingContext2D');
  var isElement = predicate((x) => x is Element, 'is an Element');
  var isCanvasElement = 
      predicate((x) => x is CanvasElement, 'is a CanvasElement');
  var isImageData = predicate((x) => x is ImageData, 'is an ImageData');
  //var isUint8ClampedArray =
  //  predicate((x) => x is Uint8ClampedArray, 'is a Uint8ClampedArray');
  var isIntList =
      predicate((x) => x is List<int>, 'is a List<int>');

  useHtmlConfiguration();
  test('Instanceof', () {
    expect(canvas, isNot(isCanvasRenderingContext));
    expect(canvas, isNot(isCanvasRenderingContext2D));
    expect(canvas, isElement);
    expect(canvas, isCanvasElement);
    expect(canvas, isNot(isImageData));
    // expect(canvas, isNot(isCanvasPixelArray));

    CanvasRenderingContext2D context = canvas.getContext('2d');
    expect(context, isCanvasRenderingContext);
    expect(context, isCanvasRenderingContext2D);
    expect(context, isNot(isElement));
    expect(context, isNot(isCanvasElement));
    expect(context, isNot(isImageData));
    // expect(context, isNot(isCanvasPixelArray));

    // FIXME(b/5286633): Interface injection type check workaround.
    var image = context.createImageData(canvas.width as dynamic,
                                        canvas.height as dynamic);
    expect(image, isNot(isCanvasRenderingContext));
    expect(image, isNot(isCanvasRenderingContext2D));
    expect(image, isNot(isElement));
    expect(image, isNot(isCanvasElement));
    expect(image, isImageData);
    // expect(image, isNot(isCanvasPixelArray));

    // Include CanvasPixelArray since constructor and prototype are not
    // available until one is created.
    var bytes = image.data;
    expect(bytes, isNot(isCanvasRenderingContext));
    expect(bytes, isNot(isCanvasRenderingContext2D));
    expect(bytes, isNot(isElement));
    expect(bytes, isNot(isCanvasElement));
    expect(bytes, isNot(isImageData));
    expect(bytes, isIntList);

    // FIXME: Ensure this is an SpanElement when we next update
    // WebKit IDL.
    var span = new Element.tag('span');
    expect(span, isElement);
  });
}
