// 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/legacy/minitest.dart'; // ignore: deprecated_member_use_from_same_package

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