// 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. 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('new Foo()', () { var foo = new JsObject(context['Foo'], [42]); expect(foo['a'], equals(42)); expect(foo.callMethod('bar'), equals(42)); expect(() => foo.callMethod('baz'), throwsNoSuchMethodError); }); 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 is JsArray, isTrue); // 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'])); }); }