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

import 'dart:html';

import 'package:expect/minitest.dart';

main() {
  var canvas;

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

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

  test('Instanceof', () {
    expect(canvas, isNotCanvasRenderingContext);
    expect(canvas, isNotCanvasRenderingContext2D);
    expect(canvas, isElement);
    expect(canvas, isCanvasElement);
    expect(canvas, isNotImageData);
    // expect(canvas, isNot(isCanvasPixelArray));

    var context = canvas.getContext('2d');
    expect(context, isCanvasRenderingContext);
    expect(context, isCanvasRenderingContext2D);
    expect(context, isNotElement);
    expect(context, isNotCanvasElement);
    expect(context, isNotImageData);
    // expect(context, isNot(isCanvasPixelArray));

    // FIXME(b/5286633): Interface injection type check workaround.
    var image = (context as CanvasRenderingContext2D)
        .createImageData(canvas.width as dynamic, canvas.height as dynamic);
    expect(image, isNotCanvasRenderingContext);
    expect(image, isNotCanvasRenderingContext2D);
    expect(image, isNotElement);
    expect(image, isNotCanvasElement);
    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, isNotCanvasRenderingContext);
    expect(bytes, isNotCanvasRenderingContext2D);
    expect(bytes, isNotElement);
    expect(bytes, isNotCanvasElement);
    expect(bytes, isNotImageData);
    expect(bytes, isIntList);

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