// Copyright (c) 2013, 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

import 'dart:html';
import 'dart:indexed_db' show IdbFactory, KeyRange;
import 'dart:typed_data' show Int32List;
import 'dart:js';

import 'package:js/js_util.dart' as js_util;
import 'package:expect/minitest.dart';

import 'js_test_util.dart';

main() {
  injectJs();

  test('Date', () {
    context['o'] = new DateTime(1995, 12, 17);
    var dateType = context['Date'];
    expect(context.callMethod('isPropertyInstanceOf', ['o', dateType]), isTrue);
    context.deleteProperty('o');
  });

  skipIE9_test('window', () {
    context['o'] = window;
    var windowType = context['Window'];
    expect(
        context.callMethod('isPropertyInstanceOf', ['o', windowType]), isTrue);
    context.deleteProperty('o');
  });

  skipIE9_test('document', () {
    context['o'] = document;
    var documentType = context['Document'];
    expect(context.callMethod('isPropertyInstanceOf', ['o', documentType]),
        isTrue);
    context.deleteProperty('o');
  });

  skipIE9_test('Blob', () {
    var fileParts = ['<a id="a"><b id="b">hey!</b></a>'];
    context['o'] = new Blob(fileParts, 'text/html');
    var blobType = context['Blob'];
    expect(context.callMethod('isPropertyInstanceOf', ['o', blobType]), isTrue);
    context.deleteProperty('o');
  });

  test('unattached DivElement', () {
    context['o'] = new DivElement();
    var divType = context['HTMLDivElement'];
    expect(context.callMethod('isPropertyInstanceOf', ['o', divType]), isTrue);
    context.deleteProperty('o');
  });

  test('Event', () {
    context['o'] = new CustomEvent('test');
    var eventType = context['Event'];
    expect(
        context.callMethod('isPropertyInstanceOf', ['o', eventType]), isTrue);
    context.deleteProperty('o');
  });

  test('KeyRange', () {
    if (IdbFactory.supported) {
      context['o'] = new KeyRange.only(1);
      var keyRangeType = context['IDBKeyRange'];
      expect(context.callMethod('isPropertyInstanceOf', ['o', keyRangeType]),
          isTrue);
      context.deleteProperty('o');
    }
  });

  // this test fails in IE9 for very weird, but unknown, reasons
  // the expression context['ImageData'] fails if useHtmlConfiguration()
  // is called, or if the other tests in this file are enabled
  skipIE9_test('ImageData', () {
    var canvas = new CanvasElement();
    var ctx = canvas.getContext('2d') as CanvasRenderingContext2D;
    context['o'] = ctx.createImageData(1, 1);
    var imageDataType = context['ImageData'];
    expect(context.callMethod('isPropertyInstanceOf', ['o', imageDataType]),
        isTrue);
    context.deleteProperty('o');
  });

  test('typed data: Int32List', () {
    if (Platform.supportsTypedData) {
      context['o'] = new Int32List.fromList([1, 2, 3, 4]);
      var listType = context['Int32Array'];
      // TODO(jacobr): make this test pass. Currently some type information
      // is lost when typed arrays are passed between JS and Dart.
      // expect(context.callMethod('isPropertyInstanceOf', ['o', listType]),
      //    isTrue);
      context.deleteProperty('o');
    }
  });
}
