| // 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/legacy/minitest.dart'; // ignore: deprecated_member_use_from_same_package | |
| import 'js_test_util.dart'; | |
| main() { | |
| injectJs(); | |
| 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), | |
| throwsArgumentError); | |
| }); | |
| */ | |
| 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), | |
| throwsArgumentError); | |
| }); | |
| */ | |
| 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], | |
| throwsArgumentError); | |
| expect(() => object[true] = 1, | |
| throwsArgumentError); | |
| }); | |
| */ | |
| } |