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

library jsTest;

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

import 'package:unittest/unittest.dart';
import 'package:unittest/html_individual_config.dart';

_injectJs() {
  final script = new ScriptElement();
  script.type = 'text/javascript';
  script.innerHtml = r"""
var x = 42;

var _x = 123;

var myArray = ["value1"];

var foreignDoc = (function(){
  var doc = document.implementation.createDocument("", "root", null);
  var element = doc.createElement('element');
  element.setAttribute('id', 'abc');
  doc.documentElement.appendChild(element);
  return doc;
})();

function razzle() {
  return x;
}

function returnThis() {
  return this;
}

function getTypeOf(o) {
  return typeof(o);
}

function varArgs() {
  var args = arguments;
  var sum = 0;
  for (var i = 0; i < args.length; ++i) {
    sum += args[i];
  }
  return sum;
}

function Foo(a) {
  this.a = a;
}

Foo.b = 38;

Foo.prototype.bar = function() {
  return this.a;
}
Foo.prototype.toString = function() {
  return "I'm a Foo a=" + this.a;
}

var container = new Object();
container.Foo = Foo;

function isArray(a) {
  return a instanceof Array;
}

function checkMap(m, key, value) {
  if (m.hasOwnProperty(key))
    return m[key] == value;
  else
    return false;
}

function invokeCallback() {
  return callback();
}

function invokeCallbackWith11params() {
  return callbackWith11params(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
}

function returnElement(element) {
  return element;
}

function getElementAttribute(element, attr) {
  return element.getAttribute(attr);
}

function addClassAttributes(list) {
  var result = "";
  for (var i=0; i < list.length; i++) {
    result += list[i].getAttribute("class");
  }
  return result;
}

function getNewDate() {
  return new Date(1995, 11, 17);
}

function getNewDivElement() {
  return document.createElement("div");
}

function getNewEvent() {
  return new CustomEvent('test');
}

function getNewBlob() {
  var fileParts = ['<a id="a"><b id="b">hey!</b></a>'];
  return new Blob(fileParts, {type : 'text/html'});
}

function getNewIDBKeyRange() {
  return IDBKeyRange.only(1);
}

function getNewImageData() {
  var canvas = document.createElement('canvas');
  var context = canvas.getContext('2d');
  return context.createImageData(1, 1);
}

function getNewInt32Array() {
  return new Int32Array([1, 2, 3, 4, 5, 6, 7, 8]);
}

function getNewArrayBuffer() {
  return new ArrayBuffer(8);
}

function isPropertyInstanceOf(property, type) {
  return window[property] instanceof type;
}

function testJsMap(callback) {
  var result = callback();
  return result['value'];
}

function addTestProperty(o) {
  o.testProperty = "test";
}

function fireClickEvent(w) {
  var event = w.document.createEvent('Events');
  event.initEvent('click', true, false);
  w.document.dispatchEvent(event);
}

function Bar() {
  return "ret_value";
}
Bar.foo = "property_value";

function Baz(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11) {
  this.f1 = p1;
  this.f2 = p2;
  this.f3 = p3;
  this.f4 = p4;
  this.f5 = p5;
  this.f6 = p6;
  this.f7 = p7;
  this.f8 = p8;
  this.f9 = p9;
  this.f10 = p10;
  this.f11 = p11;
}

function Liar(){}

Liar.prototype.toString = function() {
  return 1;
}

function identical(o1, o2) {
  return o1 === o2;
}

var someProto = { role: "proto" };
var someObject = Object.create(someProto);
someObject.role = "object";

""";
  document.body.append(script);
}

typedef bool StringToBool(String s);

// Some test are either causing other test to fail in IE9, or they are failing
// for unknown reasons
// useHtmlConfiguration+ImageData bug: dartbug.com/14355
skipIE9_test(String description, t()) {
  if (Platform.supportsTypedData) {
    test(description, t);
  }
}

class Foo {
  final JsObject _proxy;

  Foo(num a) : this._proxy = new JsObject(context['Foo'], [a]);

  JsObject toJs() => _proxy;

  num get a => _proxy['a'];
  num bar() => _proxy.callMethod('bar');
}

class Color {
  static final RED = new Color._("red");
  static final BLUE = new Color._("blue");
  String _value;
  Color._(this._value);
  String toJs() => this._value;
}

class TestDartObject {}

class Callable {
  call() => 'called';
}

main() {
  _injectJs();
  useHtmlIndividualConfiguration();

  group('identity', () {

    test('context instances should be identical', () {
      var c1 = context;
      var c2 = context;
      expect(identical(c1, c2), isTrue);
    });

    test('identical JS objects should have identical proxies', () {
      var o1 = new JsObject(context['Foo'], [1]);
      context['f1'] = o1;
      var o2 = context['f1'];
      expect(identical(o1, o2), isTrue);
    });

/*
 TODO(jacobr): enable this test when dartium supports maintaining proxy
    equality.
    test('identical Dart objects should have identical proxies', () {
      var o1 = new TestDartObject();
      expect(context.callMethod('identical', [o1, o1]), isTrue);
    });
    */

    test('identical Dart functions should have identical proxies', () {
      var f1 = allowInterop(() => print("I'm a Function!"));
      expect(context.callMethod('identical', [f1, f1]), isTrue);
    });

    test('identical JS functions should have identical proxies', () {
      var f1 = context['Object'];
      var f2 = context['Object'];
      expect(identical(f1, f2), isTrue);
    });

    // TODO(justinfagnani): old tests duplicate checks above, remove
    // on test next cleanup pass
    test('test proxy equality', () {
      var foo1 = new JsObject(context['Foo'], [1]);
      var foo2 = new JsObject(context['Foo'], [2]);
      context['foo1'] = foo1;
      context['foo2'] = foo2;
      expect(foo1, isNot(equals(context['foo2'])));
      expect(foo2, equals(context['foo2']));
      context.deleteProperty('foo1');
      context.deleteProperty('foo2');
    });

    test('retrieve same dart Object', () {
      final obj = new Object();
      context['obj'] = obj;
      expect(context['obj'], same(obj));
      context.deleteProperty('obj');
    });

    group('caching', () {
      test('JS->Dart', () {
        // Test that we are not pulling cached proxy from the prototype
        // when asking for a proxy for the object.
        final proto = context['someProto'];
        expect(proto['role'], equals('proto'));
        final obj = context['someObject'];
        expect(obj['role'], equals('object'));
      });
    });

  });

  group('context', () {

    test('read global field', () {
      expect(context['x'], equals(42));
      expect(context['y'], isNull);
    });

    test('read global field with underscore', () {
      expect(context['_x'], equals(123));
      expect(context['y'], isNull);
    });

    test('write global field', () {
      context['y'] = 42;
      expect(context['y'], equals(42));
    });

  });

  group('new_JsObject', () {

    test('new Foo()', () {
      var foo = new JsObject(context['Foo'], [42]);
      expect(foo['a'], equals(42));
      expect(foo.callMethod('bar'), equals(42));
      expect(() => foo.callMethod('baz'), throwsA(isNoSuchMethodError));
    });

    test('new container.Foo()', () {
      final Foo2 = context['container']['Foo'];
      final foo = new JsObject(Foo2, [42]);
      expect(foo['a'], 42);
      expect(Foo2['b'], 38);
    });

    test('new Array()', () {
      var a = new JsObject(context['Array']);
      expect(a, new isInstanceOf<JsArray>());

      // Test that the object still behaves via the base JsObject interface.
      // JsArray specific tests are below.
      expect(a['length'], 0);

      a.callMethod('push', ["value 1"]);
      expect(a['length'], 1);
      expect(a[0], "value 1");

      a.callMethod('pop');
      expect(a['length'], 0);
    });

    test('new Date()', () {
      final a = new JsObject(context['Date']);
      expect(a.callMethod('getTime'), isNotNull);
    });

    test('new Date(12345678)', () {
      final a = new JsObject(context['Date'], [12345678]);
      expect(a.callMethod('getTime'), equals(12345678));
    });

    test('new Date("December 17, 1995 03:24:00 GMT")', () {
      final a = new JsObject(context['Date'],
          ["December 17, 1995 03:24:00 GMT"]);
      expect(a.callMethod('getTime'), equals(819170640000));
    });

    test('new Date(1995,11,17)', () {
      // Note: JS Date counts months from 0 while Dart counts from 1.
      final a = new JsObject(context['Date'], [1995, 11, 17]);
      final b = new DateTime(1995, 12, 17);
      expect(a.callMethod('getTime'), equals(b.millisecondsSinceEpoch));
    });

    test('new Date(1995,11,17,3,24,0)', () {
      // Note: JS Date counts months from 0 while Dart counts from 1.
      final a = new JsObject(context['Date'],
          [1995, 11, 17, 3, 24, 0]);
      final b = new DateTime(1995, 12, 17, 3, 24, 0);
      expect(a.callMethod('getTime'), equals(b.millisecondsSinceEpoch));
    });

    test('new Object()', () {
      final a = new JsObject(context['Object']);
      expect(a, isNotNull);

      a['attr'] = "value";
      expect(a['attr'], equals("value"));
    });

    test(r'new RegExp("^\w+$")', () {
      final a = new JsObject(context['RegExp'], [r'^\w+$']);
      expect(a, isNotNull);
      expect(a.callMethod('test', ['true']), isTrue);
      expect(a.callMethod('test', [' false']), isFalse);
    });

    test('js instantiation via map notation : new Array()', () {
      final a = new JsObject(context['Array']);
      expect(a, isNotNull);
      expect(a['length'], equals(0));

      a.callMethod('push', ["value 1"]);
      expect(a['length'], equals(1));
      expect(a[0], equals("value 1"));

      a.callMethod('pop');
      expect(a['length'], equals(0));
    });

    test('js instantiation via map notation : new Date()', () {
      final a = new JsObject(context['Date']);
      expect(a.callMethod('getTime'), isNotNull);
    });

    test('typed array', () {
      if (Platform.supportsTypedData) {
        // Safari's ArrayBuffer is not a Function and so doesn't support bind
        // which JsObject's constructor relies on.
        // bug: https://bugs.webkit.org/show_bug.cgi?id=122976
        if (context['ArrayBuffer']['bind'] != null) {
          final codeUnits = "test".codeUnits;
          final buf = new JsObject(context['ArrayBuffer'], [codeUnits.length]);
          final bufView = new JsObject(context['Uint8Array'], [buf]);
          for (var i = 0; i < codeUnits.length; i++) {
            bufView[i] = codeUnits[i];
          }
        }
      }
    });

    test('>10 parameters', () {
      final o = new JsObject(context['Baz'], [1,2,3,4,5,6,7,8,9,10,11]);
      for (var i = 1; i <= 11; i++) {
        expect(o["f$i"], i);
      }
      expect(o['constructor'], equals(context['Baz']));
    });
  });

  group('JsFunction and callMethod', () {

    test('new JsObject can return a JsFunction', () {
      var f = new JsObject(context['Function']);
      expect(f, new isInstanceOf<JsFunction>());
    });

    test('JsFunction.apply on a function defined in JS', () {
      expect(context['razzle'].apply([]), equals(42));
    });

    test('JsFunction.apply on a function that uses this', () {
      var object = new Object();
      expect(context['returnThis'].apply([], thisArg: object), same(object));
    });

    test('JsObject.callMethod on a function defined in JS', () {
      expect(context.callMethod('razzle'), equals(42));
      expect(() => context.callMethod('dazzle'), throwsA(isNoSuchMethodError));
    });

    test('callMethod with many arguments', () {
      expect(context.callMethod('varArgs', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),
        equals(55));
    });

    test('access a property of a function', () {
      expect(context.callMethod('Bar'), "ret_value");
      expect(context['Bar']['foo'], "property_value");
    });
/*
 TODO(jacobr): evaluate whether we should be in the business of throwing
 ArgumentError outside of checked mode. In unchecked mode this should just
 return a NoSuchMethodError as the class lacks a method "true".

    test('callMethod throws if name is not a String or num', () {
      expect(() => context.callMethod(true),
          throwsA(new isInstanceOf<ArgumentError>()));
    });
*/
  });

  group('JsArray', () {

    test('new JsArray()', () {
      var array = new JsArray();
      var arrayType = context['Array'];
      expect(array.instanceof(arrayType), true);
      expect(array, []);
      // basic check that it behaves like a List
      array.addAll([1, 2, 3]);
      expect(array, [1, 2, 3]);
    });

    test('new JsArray.from()', () {
      var array = new JsArray.from([1, 2, 3]);
      var arrayType = context['Array'];
      expect(array.instanceof(arrayType), true);
      expect(array, [1, 2, 3]);
    });

    test('get Array from JS', () {
      context['a'] = new JsObject(context['Array'], [1, 2, 3]);
      expect(context.callMethod('isPropertyInstanceOf',
          ['a', context['Array']]), isTrue);
      var a = context['a'];
      expect(a, new isInstanceOf<JsArray>());
      expect(a, [1, 2, 3]);
      context.deleteProperty('a');
    });

    test('pass Array to JS', () {
      context['a'] = [1, 2, 3];
      expect(context.callMethod('isPropertyInstanceOf',
          ['a', context['Array']]), isTrue);
      var a = context['a'];
      expect(a, new isInstanceOf<List>());
      expect(a, isNot(new isInstanceOf<JsArray>()));
      expect(a, [1, 2, 3]);
      context.deleteProperty('a');
    });

    test('[]', () {
      var array = new JsArray.from([1, 2]);
      expect(array[0], 1);
      expect(array[1], 2);
      expect(() => array[-1], throwsA(isRangeError));
      expect(() => array[2], throwsA(isRangeError));
    });

   test('[]=', () {
      var array = new JsArray.from([1, 2]);
      array[0] = 'd';
      array[1] = 'e';
      expect(array, ['d', 'e']);
      expect(() => array[-1] = 3, throwsA(isRangeError));
      expect(() => array[2] = 3, throwsA(isRangeError));
    });

    test('length', () {
      var array = new JsArray.from([1, 2, 3]);
      expect(array.length, 3);
      array.add(4);
      expect(array.length, 4);
      array.length = 2;
      expect(array, [1, 2]);
      array.length = 3;
      expect(array, [1, 2, null]);
    });

     test('add', () {
      var array = new JsArray();
      array.add('a');
      expect(array, ['a']);
      array.add('b');
      expect(array, ['a', 'b']);
    });

    test('addAll', () {
      var array = new JsArray();
      array.addAll(['a', 'b']);
      expect(array, ['a', 'b']);
      // make sure addAll can handle Iterables
      array.addAll(new Set.from(['c']));
      expect(array, ['a', 'b', 'c']);
    });

    test('insert', () {
      var array = new JsArray.from([]);
      array.insert(0, 'b');
      expect(array, ['b']);
      array.insert(0, 'a');
      expect(array, ['a', 'b']);
      array.insert(2, 'c');
      expect(array, ['a', 'b', 'c']);
      expect(() => array.insert(4, 'e'), throwsA(isRangeError));
      expect(() => array.insert(-1, 'e'), throwsA(isRangeError));
    });

    test('removeAt', () {
      var array = new JsArray.from(['a', 'b', 'c']);
      expect(array.removeAt(1), 'b');
      expect(array, ['a', 'c']);
      expect(() => array.removeAt(2), throwsA(isRangeError));
      expect(() => array.removeAt(-1), throwsA(isRangeError));
    });

    test('removeLast', () {
      var array = new JsArray.from(['a', 'b', 'c']);
      expect(array.removeLast(), 'c');
      expect(array, ['a', 'b']);
      array.length = 0;
      expect(() => array.removeLast(), throwsA(isRangeError));
    });

    test('removeRange', () {
      var array = new JsArray.from(['a', 'b', 'c', 'd']);
      array.removeRange(1, 3);
      expect(array, ['a', 'd']);
      expect(() => array.removeRange(-1, 2), throwsA(isRangeError));
      expect(() => array.removeRange(0, 3), throwsA(isRangeError));
      expect(() => array.removeRange(2, 1), throwsA(isRangeError));
    });

    test('setRange', () {
      var array = new JsArray.from(['a', 'b', 'c', 'd']);
      array.setRange(1, 3, ['e', 'f']);
      expect(array, ['a', 'e', 'f', 'd']);
      array.setRange(3, 4, ['g', 'h', 'i'], 1);
      expect(array, ['a', 'e', 'f', 'h']);
    });

    test('sort', () {
      var array = new JsArray.from(['c', 'a', 'b']);
      array.sort();
      expect(array, ['a', 'b', 'c']);
    });

    test('sort with a Comparator', () {
      var array = new JsArray.from(['c', 'a', 'b']);
      array.sort((a, b) => -(a.compareTo(b)));
      expect(array, ['c', 'b', 'a']);
    });

  });

  group('JsObject.fromBrowserObject()', () {

    test('Nodes are proxied', () {
      var node = new JsObject.fromBrowserObject(new DivElement());
      context.callMethod('addTestProperty', [node]);
      expect(node is JsObject, isTrue);
      // TODO(justinfagnani): make this work in IE9
      // expect(node.instanceof(context['HTMLDivElement']), isTrue);
      expect(node['testProperty'], 'test');
    });

    test('primitives and null throw ArgumentError', () {
      for (var v in ['a', 1, 2.0, true, null]) {
        expect(() => new JsObject.fromBrowserObject(v),
            throwsA(new isInstanceOf<ArgumentError>()));
      }
    });

  });

  group('Dart_functions', () {
    test('invoke Dart callback from JS', () {
      expect(() => context.callMethod('invokeCallback'), throws);

      context['callback'] = () => 42;
      expect(context.callMethod('invokeCallback'), equals(42));

      context.deleteProperty('callback');
    });

    test('callback as parameter', () {
      expect(context.callMethod('getTypeOf', [context['razzle']]),
          equals("function"));
    });

    test('invoke Dart callback from JS with this', () {
      // A JavaScript constructor function implemented in Dart which
      // uses 'this'
      final constructor = new JsFunction.withThis(($this, arg1) {
        var t = $this;
        $this['a'] = 42;
      });
      var o = new JsObject(constructor, ["b"]);
      expect(o['a'], equals(42));
    });

    test('invoke Dart callback from JS with 11 parameters', () {
      context['callbackWith11params'] = (p1, p2, p3, p4, p5, p6, p7,
          p8, p9, p10, p11) => '$p1$p2$p3$p4$p5$p6$p7$p8$p9$p10$p11';
      expect(context.callMethod('invokeCallbackWith11params'),
          equals('1234567891011'));
    });

    test('return a JS proxy to JavaScript', () {
      var result = context.callMethod('testJsMap', [() => new JsObject.jsify({'value': 42})]);
      expect(result, 42);
    });

    test('emulated functions should be callable in JS', () {
      context['callable'] = new Callable();
      var result = context.callMethod('callable');
      expect(result, 'called');
      context.deleteProperty('callable');
    });

  });

  group('JsObject.jsify()', () {

    test('convert a List', () {
      final list = [1, 2, 3, 4, 5, 6, 7, 8];
      var array = new JsObject.jsify(list);
      expect(context.callMethod('isArray', [array]), isTrue);
      expect(array['length'], equals(list.length));
      for (var i = 0; i < list.length ; i++) {
        expect(array[i], equals(list[i]));
      }
    });

    test('convert an Iterable', () {
      final set = new Set.from([1, 2, 3, 4, 5, 6, 7, 8]);
      var array = new JsObject.jsify(set);
      expect(context.callMethod('isArray', [array]), isTrue);
      expect(array['length'], equals(set.length));
      for (var i = 0; i < array['length'] ; i++) {
        expect(set.contains(array[i]), isTrue);
      }
    });

    test('convert a Map', () {
      var map = {'a': 1, 'b': 2, 'c': 3};
      var jsMap = new JsObject.jsify(map);
      expect(!context.callMethod('isArray', [jsMap]), isTrue);
      for (final key in map.keys) {
        expect(context.callMethod('checkMap', [jsMap, key, map[key]]), isTrue);
      }
    });

    test('deep convert a complex object', () {
      final object = {
        'a': [1, [2, 3]],
        'b': {
          'c': 3,
          'd': new JsObject(context['Foo'], [42])
        },
        'e': null
      };
      var jsObject = new JsObject.jsify(object);
      expect(jsObject['a'][0], equals(object['a'][0]));
      expect(jsObject['a'][1][0], equals(object['a'][1][0]));
      expect(jsObject['a'][1][1], equals(object['a'][1][1]));
      expect(jsObject['b']['c'], equals(object['b']['c']));
      expect(jsObject['b']['d'], equals(object['b']['d']));
      expect(jsObject['b']['d'].callMethod('bar'), equals(42));
      expect(jsObject['e'], isNull);
    });

    test('throws if object is not a Map or Iterable', () {
      expect(() => new JsObject.jsify('a'),
          throwsA(new isInstanceOf<ArgumentError>()));
    });
  });

  group('JsObject_methods', () {

    test('hashCode and ==', () {
      final o1 = context['Object'];
      final o2 = context['Object'];
      expect(o1 == o2, isTrue);
      expect(o1.hashCode == o2.hashCode, isTrue);
      final d = context['document'];
      expect(o1 == d, isFalse);
    });

    test('toString', () {
      var foo = new JsObject(context['Foo'], [42]);
      expect(foo.toString(), equals("I'm a Foo a=42"));
      var container = context['container'];
      expect(container.toString(), equals("[object Object]"));
    });

    test('toString returns a String even if the JS object does not', () {
      var foo = new JsObject(context['Liar']);
      expect(foo.callMethod('toString'), 1);
      expect(foo.toString(), '1');
    });

    test('instanceof', () {
      var foo = new JsObject(context['Foo'], [1]);
      expect(foo.instanceof(context['Foo']), isTrue);
      expect(foo.instanceof(context['Object']), isTrue);
      expect(foo.instanceof(context['String']), isFalse);
    });

    test('deleteProperty', () {
      var object = new JsObject.jsify({});
      object['a'] = 1;
      expect(context['Object'].callMethod('keys', [object])['length'], 1);
      expect(context['Object'].callMethod('keys', [object])[0], "a");
      object.deleteProperty("a");
      expect(context['Object'].callMethod('keys', [object])['length'], 0);
    });

/* TODO(jacobr): this is another test that is inconsistent with JS semantics.
    test('deleteProperty throws if name is not a String or num', () {
      var object = new JsObject.jsify({});
      expect(() => object.deleteProperty(true),
          throwsA(new isInstanceOf<ArgumentError>()));
    });
  */

    test('hasProperty', () {
      var object = new JsObject.jsify({});
      object['a'] = 1;
      expect(object.hasProperty('a'), isTrue);
      expect(object.hasProperty('b'), isFalse);
    });

/* TODO(jacobr): is this really the correct unchecked mode behavior?
    test('hasProperty throws if name is not a String or num', () {
      var object = new JsObject.jsify({});
      expect(() => object.hasProperty(true),
          throwsA(new isInstanceOf<ArgumentError>()));
    });
*/

    test('[] and []=', () {
      final myArray = context['myArray'];
      expect(myArray['length'], equals(1));
      expect(myArray[0], equals("value1"));
      myArray[0] = "value2";
      expect(myArray['length'], equals(1));
      expect(myArray[0], equals("value2"));

      final foo = new JsObject(context['Foo'], [1]);
      foo["getAge"] = () => 10;
      expect(foo.callMethod('getAge'), equals(10));
    });

/* TODO(jacobr): remove as we should only throw this in checked mode.
    test('[] and []= throw if name is not a String or num', () {
      var object = new JsObject.jsify({});
      expect(() => object[true],
          throwsA(new isInstanceOf<ArgumentError>()));
      expect(() => object[true] = 1,
          throwsA(new isInstanceOf<ArgumentError>()));
    });
*/
  });

  group('transferrables', () {

    group('JS->Dart', () {

      test('DateTime', () {
        var date = context.callMethod('getNewDate');
        expect(date is DateTime, isTrue);
      });

      test('window', () {
        expect(context['window'] is Window, isTrue);
      });

      // Bug: dartbug.com/24520
      /*
      test('foreign browser objects should be proxied', () {
        var iframe = new IFrameElement();
        document.body.children.add(iframe);
        var proxy = new JsObject.fromBrowserObject(iframe);

        // Window
        var contentWindow = proxy['contentWindow'];
        expect(contentWindow, isNot(new isInstanceOf<Window>()));
        expect(contentWindow, new isInstanceOf<JsObject>());

        // Node
        var foreignDoc = contentWindow['document'];
        expect(foreignDoc, isNot(new isInstanceOf<Node>()));
        expect(foreignDoc, new isInstanceOf<JsObject>());

        // Event
        var clicked = false;
        foreignDoc['onclick'] = (e) {
          expect(e, isNot(new isInstanceOf<Event>()));
          expect(e, new isInstanceOf<JsObject>());
          clicked = true;
        };

        context.callMethod('fireClickEvent', [contentWindow]);
        expect(clicked, isTrue);
      });
      */

      test('document', () {
        expect(context['document'] is Document, isTrue);
      });

      skipIE9_test('Blob', () {
        var blob = context.callMethod('getNewBlob');
        expect(blob is Blob, isTrue);
        expect(blob.type, equals('text/html'));
      });

      test('unattached DivElement', () {
        var node = context.callMethod('getNewDivElement');
        expect(node is DivElement, isTrue);
      });

      test('Event', () {
        var event = context.callMethod('getNewEvent');
        expect(event is Event, true);
      });

      test('KeyRange', () {
        if (IdbFactory.supported) {
          var node = context.callMethod('getNewIDBKeyRange');
          expect(node is KeyRange, isTrue);
        }
      });

      test('ImageData', () {
        var node = context.callMethod('getNewImageData');
        expect(node is ImageData, isTrue);
      });

      test('typed data: Int32Array', () {
        if (Platform.supportsTypedData) {
          var list = context.callMethod('getNewInt32Array');
          print(list);
          expect(list is Int32List, isTrue);
          expect(list, orderedEquals([1, 2, 3, 4, 5, 6, 7, 8]));
        }
      });

    });

    group('JavaScriptFunction', () {
      test('is check', () {
        var fn = (String s) => true;
        var jsFn = allowInterop(fn);
        expect(fn is StringToBool, isTrue);
        expect(jsFn is StringToBool, isTrue);
        expect(jsFn is Function, isTrue);
        expect(jsFn is List, isFalse);
      });
    });

    group('Dart->JS', () {

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

    });
  });

}
