| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library jsTest; | |
| 6 | |
| 7 import 'dart:async'; | |
| 8 import 'dart:html'; | 5 import 'dart:html'; |
| 9 import 'dart:typed_data' show ByteBuffer, Int32List; | 6 import 'dart:typed_data' show ByteBuffer, Int32List; |
| 10 import 'dart:indexed_db' show IdbFactory, KeyRange; | 7 import 'dart:indexed_db' show IdbFactory, KeyRange; |
| 11 import 'dart:js'; | 8 import 'dart:js'; |
| 12 | 9 |
| 13 import 'package:unittest/unittest.dart'; | 10 import 'package:minitest/minitest.dart'; |
| 14 import 'package:unittest/html_individual_config.dart'; | |
| 15 | 11 |
| 16 _injectJs() { | 12 _injectJs() { |
| 17 final script = new ScriptElement(); | 13 final script = new ScriptElement(); |
| 18 script.type = 'text/javascript'; | 14 script.type = 'text/javascript'; |
| 19 script.innerHtml = r""" | 15 script.innerHtml = r""" |
| 20 var x = 42; | 16 var x = 42; |
| 21 | 17 |
| 22 var _x = 123; | 18 var _x = 123; |
| 23 | 19 |
| 24 var myArray = ["value1"]; | 20 var myArray = ["value1"]; |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 } | 219 } |
| 224 | 220 |
| 225 class TestDartObject {} | 221 class TestDartObject {} |
| 226 | 222 |
| 227 class Callable { | 223 class Callable { |
| 228 call() => 'called'; | 224 call() => 'called'; |
| 229 } | 225 } |
| 230 | 226 |
| 231 main() { | 227 main() { |
| 232 _injectJs(); | 228 _injectJs(); |
| 233 useHtmlIndividualConfiguration(); | |
| 234 | 229 |
| 235 group('identity', () { | 230 group('identity', () { |
| 236 | 231 |
| 237 test('context instances should be identical', () { | 232 test('context instances should be identical', () { |
| 238 var c1 = context; | 233 var c1 = context; |
| 239 var c2 = context; | 234 var c2 = context; |
| 240 expect(identical(c1, c2), isTrue); | 235 expect(identical(c1, c2), isTrue); |
| 241 }); | 236 }); |
| 242 | 237 |
| 243 test('identical JS objects should have identical proxies', () { | 238 test('identical JS objects should have identical proxies', () { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 267 expect(identical(f1, f2), isTrue); | 262 expect(identical(f1, f2), isTrue); |
| 268 }); | 263 }); |
| 269 | 264 |
| 270 // TODO(justinfagnani): old tests duplicate checks above, remove | 265 // TODO(justinfagnani): old tests duplicate checks above, remove |
| 271 // on test next cleanup pass | 266 // on test next cleanup pass |
| 272 test('test proxy equality', () { | 267 test('test proxy equality', () { |
| 273 var foo1 = new JsObject(context['Foo'], [1]); | 268 var foo1 = new JsObject(context['Foo'], [1]); |
| 274 var foo2 = new JsObject(context['Foo'], [2]); | 269 var foo2 = new JsObject(context['Foo'], [2]); |
| 275 context['foo1'] = foo1; | 270 context['foo1'] = foo1; |
| 276 context['foo2'] = foo2; | 271 context['foo2'] = foo2; |
| 277 expect(foo1, isNot(equals(context['foo2']))); | 272 expect(foo1, notEquals(context['foo2'])); |
| 278 expect(foo2, equals(context['foo2'])); | 273 expect(foo2, equals(context['foo2'])); |
| 279 context.deleteProperty('foo1'); | 274 context.deleteProperty('foo1'); |
| 280 context.deleteProperty('foo2'); | 275 context.deleteProperty('foo2'); |
| 281 }); | 276 }); |
| 282 | 277 |
| 283 test('retrieve same dart Object', () { | 278 test('retrieve same dart Object', () { |
| 284 final obj = new Object(); | 279 final obj = new Object(); |
| 285 context['obj'] = obj; | 280 context['obj'] = obj; |
| 286 expect(context['obj'], same(obj)); | 281 expect(context['obj'], same(obj)); |
| 287 context.deleteProperty('obj'); | 282 context.deleteProperty('obj'); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 318 }); | 313 }); |
| 319 | 314 |
| 320 }); | 315 }); |
| 321 | 316 |
| 322 group('new_JsObject', () { | 317 group('new_JsObject', () { |
| 323 | 318 |
| 324 test('new Foo()', () { | 319 test('new Foo()', () { |
| 325 var foo = new JsObject(context['Foo'], [42]); | 320 var foo = new JsObject(context['Foo'], [42]); |
| 326 expect(foo['a'], equals(42)); | 321 expect(foo['a'], equals(42)); |
| 327 expect(foo.callMethod('bar'), equals(42)); | 322 expect(foo.callMethod('bar'), equals(42)); |
| 328 expect(() => foo.callMethod('baz'), throwsA(isNoSuchMethodError)); | 323 expect(() => foo.callMethod('baz'), throwsNoSuchMethodError); |
| 329 }); | 324 }); |
| 330 | 325 |
| 331 test('new container.Foo()', () { | 326 test('new container.Foo()', () { |
| 332 final Foo2 = context['container']['Foo']; | 327 final Foo2 = context['container']['Foo']; |
| 333 final foo = new JsObject(Foo2, [42]); | 328 final foo = new JsObject(Foo2, [42]); |
| 334 expect(foo['a'], 42); | 329 expect(foo['a'], 42); |
| 335 expect(Foo2['b'], 38); | 330 expect(Foo2['b'], 38); |
| 336 }); | 331 }); |
| 337 | 332 |
| 338 test('new Array()', () { | 333 test('new Array()', () { |
| 339 var a = new JsObject(context['Array']); | 334 var a = new JsObject(context['Array']); |
| 340 expect(a, new isInstanceOf<JsArray>()); | 335 expect(a is JsArray, isTrue); |
| 341 | 336 |
| 342 // Test that the object still behaves via the base JsObject interface. | 337 // Test that the object still behaves via the base JsObject interface. |
| 343 // JsArray specific tests are below. | 338 // JsArray specific tests are below. |
| 344 expect(a['length'], 0); | 339 expect(a['length'], 0); |
| 345 | 340 |
| 346 a.callMethod('push', ["value 1"]); | 341 a.callMethod('push', ["value 1"]); |
| 347 expect(a['length'], 1); | 342 expect(a['length'], 1); |
| 348 expect(a[0], "value 1"); | 343 expect(a[0], "value 1"); |
| 349 | 344 |
| 350 a.callMethod('pop'); | 345 a.callMethod('pop'); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 expect(o["f$i"], i); | 432 expect(o["f$i"], i); |
| 438 } | 433 } |
| 439 expect(o['constructor'], equals(context['Baz'])); | 434 expect(o['constructor'], equals(context['Baz'])); |
| 440 }); | 435 }); |
| 441 }); | 436 }); |
| 442 | 437 |
| 443 group('JsFunction and callMethod', () { | 438 group('JsFunction and callMethod', () { |
| 444 | 439 |
| 445 test('new JsObject can return a JsFunction', () { | 440 test('new JsObject can return a JsFunction', () { |
| 446 var f = new JsObject(context['Function']); | 441 var f = new JsObject(context['Function']); |
| 447 expect(f, new isInstanceOf<JsFunction>()); | 442 expect(f is JsFunction, isTrue); |
| 448 }); | 443 }); |
| 449 | 444 |
| 450 test('JsFunction.apply on a function defined in JS', () { | 445 test('JsFunction.apply on a function defined in JS', () { |
| 451 expect(context['razzle'].apply([]), equals(42)); | 446 expect(context['razzle'].apply([]), equals(42)); |
| 452 }); | 447 }); |
| 453 | 448 |
| 454 test('JsFunction.apply on a function that uses this', () { | 449 test('JsFunction.apply on a function that uses this', () { |
| 455 var object = new Object(); | 450 var object = new Object(); |
| 456 expect(context['returnThis'].apply([], thisArg: object), same(object)); | 451 expect(context['returnThis'].apply([], thisArg: object), same(object)); |
| 457 }); | 452 }); |
| 458 | 453 |
| 459 test('JsObject.callMethod on a function defined in JS', () { | 454 test('JsObject.callMethod on a function defined in JS', () { |
| 460 expect(context.callMethod('razzle'), equals(42)); | 455 expect(context.callMethod('razzle'), equals(42)); |
| 461 expect(() => context.callMethod('dazzle'), throwsA(isNoSuchMethodError)); | 456 expect(() => context.callMethod('dazzle'), throwsNoSuchMethodError); |
| 462 }); | 457 }); |
| 463 | 458 |
| 464 test('callMethod with many arguments', () { | 459 test('callMethod with many arguments', () { |
| 465 expect(context.callMethod('varArgs', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), | 460 expect(context.callMethod('varArgs', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), |
| 466 equals(55)); | 461 equals(55)); |
| 467 }); | 462 }); |
| 468 | 463 |
| 469 test('access a property of a function', () { | 464 test('access a property of a function', () { |
| 470 expect(context.callMethod('Bar'), "ret_value"); | 465 expect(context.callMethod('Bar'), "ret_value"); |
| 471 expect(context['Bar']['foo'], "property_value"); | 466 expect(context['Bar']['foo'], "property_value"); |
| 472 }); | 467 }); |
| 473 /* | 468 /* |
| 474 TODO(jacobr): evaluate whether we should be in the business of throwing | 469 TODO(jacobr): evaluate whether we should be in the business of throwing |
| 475 ArgumentError outside of checked mode. In unchecked mode this should just | 470 ArgumentError outside of checked mode. In unchecked mode this should just |
| 476 return a NoSuchMethodError as the class lacks a method "true". | 471 return a NoSuchMethodError as the class lacks a method "true". |
| 477 | 472 |
| 478 test('callMethod throws if name is not a String or num', () { | 473 test('callMethod throws if name is not a String or num', () { |
| 479 expect(() => context.callMethod(true), | 474 expect(() => context.callMethod(true), |
| 480 throwsA(new isInstanceOf<ArgumentError>())); | 475 throwsArgumentError); |
| 481 }); | 476 }); |
| 482 */ | 477 */ |
| 483 }); | 478 }); |
| 484 | 479 |
| 485 group('JsArray', () { | 480 group('JsArray', () { |
| 486 | 481 |
| 487 test('new JsArray()', () { | 482 test('new JsArray()', () { |
| 488 var array = new JsArray(); | 483 var array = new JsArray(); |
| 489 var arrayType = context['Array']; | 484 var arrayType = context['Array']; |
| 490 expect(array.instanceof(arrayType), true); | 485 expect(array.instanceof(arrayType), true); |
| 491 expect(array, []); | 486 expect(array, []); |
| 492 // basic check that it behaves like a List | 487 // basic check that it behaves like a List |
| 493 array.addAll([1, 2, 3]); | 488 array.addAll([1, 2, 3]); |
| 494 expect(array, [1, 2, 3]); | 489 expect(array, [1, 2, 3]); |
| 495 }); | 490 }); |
| 496 | 491 |
| 497 test('new JsArray.from()', () { | 492 test('new JsArray.from()', () { |
| 498 var array = new JsArray.from([1, 2, 3]); | 493 var array = new JsArray.from([1, 2, 3]); |
| 499 var arrayType = context['Array']; | 494 var arrayType = context['Array']; |
| 500 expect(array.instanceof(arrayType), true); | 495 expect(array.instanceof(arrayType), true); |
| 501 expect(array, [1, 2, 3]); | 496 expect(array, [1, 2, 3]); |
| 502 }); | 497 }); |
| 503 | 498 |
| 504 test('get Array from JS', () { | 499 test('get Array from JS', () { |
| 505 context['a'] = new JsObject(context['Array'], [1, 2, 3]); | 500 context['a'] = new JsObject(context['Array'], [1, 2, 3]); |
| 506 expect(context.callMethod('isPropertyInstanceOf', | 501 expect(context.callMethod('isPropertyInstanceOf', |
| 507 ['a', context['Array']]), isTrue); | 502 ['a', context['Array']]), isTrue); |
| 508 var a = context['a']; | 503 var a = context['a']; |
| 509 expect(a, new isInstanceOf<JsArray>()); | 504 expect(a is JsArray, isTrue); |
| 510 expect(a, [1, 2, 3]); | 505 expect(a, [1, 2, 3]); |
| 511 context.deleteProperty('a'); | 506 context.deleteProperty('a'); |
| 512 }); | 507 }); |
| 513 | 508 |
| 514 test('pass Array to JS', () { | 509 test('pass Array to JS', () { |
| 515 context['a'] = [1, 2, 3]; | 510 context['a'] = [1, 2, 3]; |
| 516 expect(context.callMethod('isPropertyInstanceOf', | 511 expect(context.callMethod('isPropertyInstanceOf', |
| 517 ['a', context['Array']]), isTrue); | 512 ['a', context['Array']]), isTrue); |
| 518 var a = context['a']; | 513 var a = context['a']; |
| 519 expect(a, new isInstanceOf<List>()); | 514 expect(a is List, isTrue); |
| 520 expect(a, isNot(new isInstanceOf<JsArray>())); | 515 expect(a is JsArray, isFalse); |
| 521 expect(a, [1, 2, 3]); | 516 expect(a, [1, 2, 3]); |
| 522 context.deleteProperty('a'); | 517 context.deleteProperty('a'); |
| 523 }); | 518 }); |
| 524 | 519 |
| 525 test('[]', () { | 520 test('[]', () { |
| 526 var array = new JsArray.from([1, 2]); | 521 var array = new JsArray.from([1, 2]); |
| 527 expect(array[0], 1); | 522 expect(array[0], 1); |
| 528 expect(array[1], 2); | 523 expect(array[1], 2); |
| 529 expect(() => array[-1], throwsA(isRangeError)); | 524 expect(() => array[-1], throwsRangeError); |
| 530 expect(() => array[2], throwsA(isRangeError)); | 525 expect(() => array[2], throwsRangeError); |
| 531 }); | 526 }); |
| 532 | 527 |
| 533 test('[]=', () { | 528 test('[]=', () { |
| 534 var array = new JsArray.from([1, 2]); | 529 var array = new JsArray<Object>.from([1, 2]); |
| 535 array[0] = 'd'; | 530 array[0] = 'd'; |
| 536 array[1] = 'e'; | 531 array[1] = 'e'; |
| 537 expect(array, ['d', 'e']); | 532 expect(array, ['d', 'e']); |
| 538 expect(() => array[-1] = 3, throwsA(isRangeError)); | 533 expect(() => array[-1] = 3, throwsRangeError); |
| 539 expect(() => array[2] = 3, throwsA(isRangeError)); | 534 expect(() => array[2] = 3, throwsRangeError); |
| 540 }); | 535 }); |
| 541 | 536 |
| 542 test('length', () { | 537 test('length', () { |
| 543 var array = new JsArray.from([1, 2, 3]); | 538 var array = new JsArray.from([1, 2, 3]); |
| 544 expect(array.length, 3); | 539 expect(array.length, 3); |
| 545 array.add(4); | 540 array.add(4); |
| 546 expect(array.length, 4); | 541 expect(array.length, 4); |
| 547 array.length = 2; | 542 array.length = 2; |
| 548 expect(array, [1, 2]); | 543 expect(array, [1, 2]); |
| 549 array.length = 3; | 544 array.length = 3; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 568 }); | 563 }); |
| 569 | 564 |
| 570 test('insert', () { | 565 test('insert', () { |
| 571 var array = new JsArray.from([]); | 566 var array = new JsArray.from([]); |
| 572 array.insert(0, 'b'); | 567 array.insert(0, 'b'); |
| 573 expect(array, ['b']); | 568 expect(array, ['b']); |
| 574 array.insert(0, 'a'); | 569 array.insert(0, 'a'); |
| 575 expect(array, ['a', 'b']); | 570 expect(array, ['a', 'b']); |
| 576 array.insert(2, 'c'); | 571 array.insert(2, 'c'); |
| 577 expect(array, ['a', 'b', 'c']); | 572 expect(array, ['a', 'b', 'c']); |
| 578 expect(() => array.insert(4, 'e'), throwsA(isRangeError)); | 573 expect(() => array.insert(4, 'e'), throwsRangeError); |
| 579 expect(() => array.insert(-1, 'e'), throwsA(isRangeError)); | 574 expect(() => array.insert(-1, 'e'), throwsRangeError); |
| 580 }); | 575 }); |
| 581 | 576 |
| 582 test('removeAt', () { | 577 test('removeAt', () { |
| 583 var array = new JsArray.from(['a', 'b', 'c']); | 578 var array = new JsArray.from(['a', 'b', 'c']); |
| 584 expect(array.removeAt(1), 'b'); | 579 expect(array.removeAt(1), 'b'); |
| 585 expect(array, ['a', 'c']); | 580 expect(array, ['a', 'c']); |
| 586 expect(() => array.removeAt(2), throwsA(isRangeError)); | 581 expect(() => array.removeAt(2), throwsRangeError); |
| 587 expect(() => array.removeAt(-1), throwsA(isRangeError)); | 582 expect(() => array.removeAt(-1), throwsRangeError); |
| 588 }); | 583 }); |
| 589 | 584 |
| 590 test('removeLast', () { | 585 test('removeLast', () { |
| 591 var array = new JsArray.from(['a', 'b', 'c']); | 586 var array = new JsArray.from(['a', 'b', 'c']); |
| 592 expect(array.removeLast(), 'c'); | 587 expect(array.removeLast(), 'c'); |
| 593 expect(array, ['a', 'b']); | 588 expect(array, ['a', 'b']); |
| 594 array.length = 0; | 589 array.length = 0; |
| 595 expect(() => array.removeLast(), throwsA(isRangeError)); | 590 expect(() => array.removeLast(), throwsRangeError); |
| 596 }); | 591 }); |
| 597 | 592 |
| 598 test('removeRange', () { | 593 test('removeRange', () { |
| 599 var array = new JsArray.from(['a', 'b', 'c', 'd']); | 594 var array = new JsArray.from(['a', 'b', 'c', 'd']); |
| 600 array.removeRange(1, 3); | 595 array.removeRange(1, 3); |
| 601 expect(array, ['a', 'd']); | 596 expect(array, ['a', 'd']); |
| 602 expect(() => array.removeRange(-1, 2), throwsA(isRangeError)); | 597 expect(() => array.removeRange(-1, 2), throwsRangeError); |
| 603 expect(() => array.removeRange(0, 3), throwsA(isRangeError)); | 598 expect(() => array.removeRange(0, 3), throwsRangeError); |
| 604 expect(() => array.removeRange(2, 1), throwsA(isRangeError)); | 599 expect(() => array.removeRange(2, 1), throwsRangeError); |
| 605 }); | 600 }); |
| 606 | 601 |
| 607 test('setRange', () { | 602 test('setRange', () { |
| 608 var array = new JsArray.from(['a', 'b', 'c', 'd']); | 603 var array = new JsArray.from(['a', 'b', 'c', 'd']); |
| 609 array.setRange(1, 3, ['e', 'f']); | 604 array.setRange(1, 3, ['e', 'f']); |
| 610 expect(array, ['a', 'e', 'f', 'd']); | 605 expect(array, ['a', 'e', 'f', 'd']); |
| 611 array.setRange(3, 4, ['g', 'h', 'i'], 1); | 606 array.setRange(3, 4, ['g', 'h', 'i'], 1); |
| 612 expect(array, ['a', 'e', 'f', 'h']); | 607 expect(array, ['a', 'e', 'f', 'h']); |
| 613 }); | 608 }); |
| 614 | 609 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 632 var node = new JsObject.fromBrowserObject(new DivElement()); | 627 var node = new JsObject.fromBrowserObject(new DivElement()); |
| 633 context.callMethod('addTestProperty', [node]); | 628 context.callMethod('addTestProperty', [node]); |
| 634 expect(node is JsObject, isTrue); | 629 expect(node is JsObject, isTrue); |
| 635 // TODO(justinfagnani): make this work in IE9 | 630 // TODO(justinfagnani): make this work in IE9 |
| 636 // expect(node.instanceof(context['HTMLDivElement']), isTrue); | 631 // expect(node.instanceof(context['HTMLDivElement']), isTrue); |
| 637 expect(node['testProperty'], 'test'); | 632 expect(node['testProperty'], 'test'); |
| 638 }); | 633 }); |
| 639 | 634 |
| 640 test('primitives and null throw ArgumentError', () { | 635 test('primitives and null throw ArgumentError', () { |
| 641 for (var v in ['a', 1, 2.0, true, null]) { | 636 for (var v in ['a', 1, 2.0, true, null]) { |
| 642 expect(() => new JsObject.fromBrowserObject(v), | 637 expect(() => new JsObject.fromBrowserObject(v), throwsArgumentError); |
| 643 throwsA(new isInstanceOf<ArgumentError>())); | |
| 644 } | 638 } |
| 645 }); | 639 }); |
| 646 | 640 |
| 647 }); | 641 }); |
| 648 | 642 |
| 649 group('Dart_functions', () { | 643 group('Dart_functions', () { |
| 650 test('invoke Dart callback from JS', () { | 644 test('invoke Dart callback from JS', () { |
| 651 expect(() => context.callMethod('invokeCallback'), throws); | 645 expect(() => context.callMethod('invokeCallback'), throws); |
| 652 | 646 |
| 653 context['callback'] = () => 42; | 647 context['callback'] = () => 42; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 718 test('convert a Map', () { | 712 test('convert a Map', () { |
| 719 var map = {'a': 1, 'b': 2, 'c': 3}; | 713 var map = {'a': 1, 'b': 2, 'c': 3}; |
| 720 var jsMap = new JsObject.jsify(map); | 714 var jsMap = new JsObject.jsify(map); |
| 721 expect(!context.callMethod('isArray', [jsMap]), isTrue); | 715 expect(!context.callMethod('isArray', [jsMap]), isTrue); |
| 722 for (final key in map.keys) { | 716 for (final key in map.keys) { |
| 723 expect(context.callMethod('checkMap', [jsMap, key, map[key]]), isTrue); | 717 expect(context.callMethod('checkMap', [jsMap, key, map[key]]), isTrue); |
| 724 } | 718 } |
| 725 }); | 719 }); |
| 726 | 720 |
| 727 test('deep convert a complex object', () { | 721 test('deep convert a complex object', () { |
| 728 final object = { | 722 dynamic object = { |
| 729 'a': [1, [2, 3]], | 723 'a': [1, [2, 3]], |
| 730 'b': { | 724 'b': { |
| 731 'c': 3, | 725 'c': 3, |
| 732 'd': new JsObject(context['Foo'], [42]) | 726 'd': new JsObject(context['Foo'], [42]) |
| 733 }, | 727 }, |
| 734 'e': null | 728 'e': null |
| 735 }; | 729 }; |
| 736 var jsObject = new JsObject.jsify(object); | 730 var jsObject = new JsObject.jsify(object); |
| 737 expect(jsObject['a'][0], equals(object['a'][0])); | 731 expect(jsObject['a'][0], equals(object['a'][0])); |
| 738 expect(jsObject['a'][1][0], equals(object['a'][1][0])); | 732 expect(jsObject['a'][1][0], equals(object['a'][1][0])); |
| 739 expect(jsObject['a'][1][1], equals(object['a'][1][1])); | 733 expect(jsObject['a'][1][1], equals(object['a'][1][1])); |
| 740 expect(jsObject['b']['c'], equals(object['b']['c'])); | 734 expect(jsObject['b']['c'], equals(object['b']['c'])); |
| 741 expect(jsObject['b']['d'], equals(object['b']['d'])); | 735 expect(jsObject['b']['d'], equals(object['b']['d'])); |
| 742 expect(jsObject['b']['d'].callMethod('bar'), equals(42)); | 736 expect(jsObject['b']['d'].callMethod('bar'), equals(42)); |
| 743 expect(jsObject['e'], isNull); | 737 expect(jsObject['e'], isNull); |
| 744 }); | 738 }); |
| 745 | 739 |
| 746 test('throws if object is not a Map or Iterable', () { | 740 test('throws if object is not a Map or Iterable', () { |
| 747 expect(() => new JsObject.jsify('a'), | 741 expect(() => new JsObject.jsify('a'), throwsArgumentError); |
| 748 throwsA(new isInstanceOf<ArgumentError>())); | |
| 749 }); | 742 }); |
| 750 }); | 743 }); |
| 751 | 744 |
| 752 group('JsObject_methods', () { | 745 group('JsObject_methods', () { |
| 753 | 746 |
| 754 test('hashCode and ==', () { | 747 test('hashCode and ==', () { |
| 755 final o1 = context['Object']; | 748 final o1 = context['Object']; |
| 756 final o2 = context['Object']; | 749 final o2 = context['Object']; |
| 757 expect(o1 == o2, isTrue); | 750 expect(o1 == o2, isTrue); |
| 758 expect(o1.hashCode == o2.hashCode, isTrue); | 751 expect(o1.hashCode == o2.hashCode, isTrue); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 786 expect(context['Object'].callMethod('keys', [object])['length'], 1); | 779 expect(context['Object'].callMethod('keys', [object])['length'], 1); |
| 787 expect(context['Object'].callMethod('keys', [object])[0], "a"); | 780 expect(context['Object'].callMethod('keys', [object])[0], "a"); |
| 788 object.deleteProperty("a"); | 781 object.deleteProperty("a"); |
| 789 expect(context['Object'].callMethod('keys', [object])['length'], 0); | 782 expect(context['Object'].callMethod('keys', [object])['length'], 0); |
| 790 }); | 783 }); |
| 791 | 784 |
| 792 /* TODO(jacobr): this is another test that is inconsistent with JS semantics. | 785 /* TODO(jacobr): this is another test that is inconsistent with JS semantics. |
| 793 test('deleteProperty throws if name is not a String or num', () { | 786 test('deleteProperty throws if name is not a String or num', () { |
| 794 var object = new JsObject.jsify({}); | 787 var object = new JsObject.jsify({}); |
| 795 expect(() => object.deleteProperty(true), | 788 expect(() => object.deleteProperty(true), |
| 796 throwsA(new isInstanceOf<ArgumentError>())); | 789 throwsArgumentError); |
| 797 }); | 790 }); |
| 798 */ | 791 */ |
| 799 | 792 |
| 800 test('hasProperty', () { | 793 test('hasProperty', () { |
| 801 var object = new JsObject.jsify({}); | 794 var object = new JsObject.jsify({}); |
| 802 object['a'] = 1; | 795 object['a'] = 1; |
| 803 expect(object.hasProperty('a'), isTrue); | 796 expect(object.hasProperty('a'), isTrue); |
| 804 expect(object.hasProperty('b'), isFalse); | 797 expect(object.hasProperty('b'), isFalse); |
| 805 }); | 798 }); |
| 806 | 799 |
| 807 /* TODO(jacobr): is this really the correct unchecked mode behavior? | 800 /* TODO(jacobr): is this really the correct unchecked mode behavior? |
| 808 test('hasProperty throws if name is not a String or num', () { | 801 test('hasProperty throws if name is not a String or num', () { |
| 809 var object = new JsObject.jsify({}); | 802 var object = new JsObject.jsify({}); |
| 810 expect(() => object.hasProperty(true), | 803 expect(() => object.hasProperty(true), |
| 811 throwsA(new isInstanceOf<ArgumentError>())); | 804 throwsArgumentError); |
| 812 }); | 805 }); |
| 813 */ | 806 */ |
| 814 | 807 |
| 815 test('[] and []=', () { | 808 test('[] and []=', () { |
| 816 final myArray = context['myArray']; | 809 final myArray = context['myArray']; |
| 817 expect(myArray['length'], equals(1)); | 810 expect(myArray['length'], equals(1)); |
| 818 expect(myArray[0], equals("value1")); | 811 expect(myArray[0], equals("value1")); |
| 819 myArray[0] = "value2"; | 812 myArray[0] = "value2"; |
| 820 expect(myArray['length'], equals(1)); | 813 expect(myArray['length'], equals(1)); |
| 821 expect(myArray[0], equals("value2")); | 814 expect(myArray[0], equals("value2")); |
| 822 | 815 |
| 823 final foo = new JsObject(context['Foo'], [1]); | 816 final foo = new JsObject(context['Foo'], [1]); |
| 824 foo["getAge"] = () => 10; | 817 foo["getAge"] = () => 10; |
| 825 expect(foo.callMethod('getAge'), equals(10)); | 818 expect(foo.callMethod('getAge'), equals(10)); |
| 826 }); | 819 }); |
| 827 | 820 |
| 828 /* TODO(jacobr): remove as we should only throw this in checked mode. | 821 /* TODO(jacobr): remove as we should only throw this in checked mode. |
| 829 test('[] and []= throw if name is not a String or num', () { | 822 test('[] and []= throw if name is not a String or num', () { |
| 830 var object = new JsObject.jsify({}); | 823 var object = new JsObject.jsify({}); |
| 831 expect(() => object[true], | 824 expect(() => object[true], |
| 832 throwsA(new isInstanceOf<ArgumentError>())); | 825 throwsArgumentError); |
| 833 expect(() => object[true] = 1, | 826 expect(() => object[true] = 1, |
| 834 throwsA(new isInstanceOf<ArgumentError>())); | 827 throwsArgumentError); |
| 835 }); | 828 }); |
| 836 */ | 829 */ |
| 837 }); | 830 }); |
| 838 | 831 |
| 839 group('transferrables', () { | 832 group('transferrables', () { |
| 840 | 833 |
| 841 group('JS->Dart', () { | 834 group('JS->Dart', () { |
| 842 | 835 |
| 843 test('DateTime', () { | 836 test('DateTime', () { |
| 844 var date = context.callMethod('getNewDate'); | 837 var date = context.callMethod('getNewDate'); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 909 test('ImageData', () { | 902 test('ImageData', () { |
| 910 var node = context.callMethod('getNewImageData'); | 903 var node = context.callMethod('getNewImageData'); |
| 911 expect(node is ImageData, isTrue); | 904 expect(node is ImageData, isTrue); |
| 912 }); | 905 }); |
| 913 | 906 |
| 914 test('typed data: Int32Array', () { | 907 test('typed data: Int32Array', () { |
| 915 if (Platform.supportsTypedData) { | 908 if (Platform.supportsTypedData) { |
| 916 var list = context.callMethod('getNewInt32Array'); | 909 var list = context.callMethod('getNewInt32Array'); |
| 917 print(list); | 910 print(list); |
| 918 expect(list is Int32List, isTrue); | 911 expect(list is Int32List, isTrue); |
| 919 expect(list, orderedEquals([1, 2, 3, 4, 5, 6, 7, 8])); | 912 expect(list, equals([1, 2, 3, 4, 5, 6, 7, 8])); |
| 920 } | 913 } |
| 921 }); | 914 }); |
| 922 | 915 |
| 923 }); | 916 }); |
| 924 | 917 |
| 925 group('Dart->JS', () { | 918 group('Dart->JS', () { |
| 926 | 919 |
| 927 test('Date', () { | 920 test('Date', () { |
| 928 context['o'] = new DateTime(1995, 12, 17); | 921 context['o'] = new DateTime(1995, 12, 17); |
| 929 var dateType = context['Date']; | 922 var dateType = context['Date']; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 981 isTrue); | 974 isTrue); |
| 982 context.deleteProperty('o'); | 975 context.deleteProperty('o'); |
| 983 } | 976 } |
| 984 }); | 977 }); |
| 985 | 978 |
| 986 // this test fails in IE9 for very weird, but unknown, reasons | 979 // this test fails in IE9 for very weird, but unknown, reasons |
| 987 // the expression context['ImageData'] fails if useHtmlConfiguration() | 980 // the expression context['ImageData'] fails if useHtmlConfiguration() |
| 988 // is called, or if the other tests in this file are enabled | 981 // is called, or if the other tests in this file are enabled |
| 989 skipIE9_test('ImageData', () { | 982 skipIE9_test('ImageData', () { |
| 990 var canvas = new CanvasElement(); | 983 var canvas = new CanvasElement(); |
| 991 var ctx = canvas.getContext('2d'); | 984 var ctx = canvas.getContext('2d') as CanvasRenderingContext2D; |
| 992 context['o'] = ctx.createImageData(1, 1); | 985 context['o'] = ctx.createImageData(1, 1); |
| 993 var imageDataType = context['ImageData']; | 986 var imageDataType = context['ImageData']; |
| 994 expect(context.callMethod('isPropertyInstanceOf', ['o', imageDataType]), | 987 expect(context.callMethod('isPropertyInstanceOf', ['o', imageDataType]), |
| 995 isTrue); | 988 isTrue); |
| 996 context.deleteProperty('o'); | 989 context.deleteProperty('o'); |
| 997 }); | 990 }); |
| 998 | 991 |
| 999 test('typed data: Int32List', () { | 992 test('typed data: Int32List', () { |
| 1000 if (Platform.supportsTypedData) { | 993 if (Platform.supportsTypedData) { |
| 1001 context['o'] = new Int32List.fromList([1, 2, 3, 4]); | 994 context['o'] = new Int32List.fromList([1, 2, 3, 4]); |
| 1002 var listType = context['Int32Array']; | 995 var listType = context['Int32Array']; |
| 1003 // TODO(jacobr): make this test pass. Currently some type information | 996 // TODO(jacobr): make this test pass. Currently some type information |
| 1004 // is lost when typed arrays are passed between JS and Dart. | 997 // is lost when typed arrays are passed between JS and Dart. |
| 1005 // expect(context.callMethod('isPropertyInstanceOf', ['o', listType]), | 998 // expect(context.callMethod('isPropertyInstanceOf', ['o', listType]), |
| 1006 // isTrue); | 999 // isTrue); |
| 1007 context.deleteProperty('o'); | 1000 context.deleteProperty('o'); |
| 1008 } | 1001 } |
| 1009 }); | 1002 }); |
| 1010 | 1003 |
| 1011 }); | 1004 }); |
| 1012 }); | 1005 }); |
| 1013 | 1006 |
| 1014 } | 1007 } |
| OLD | NEW |