| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 world_test; | 5 library world_test; |
| 6 | 6 |
| 7 import 'package:expect/expect.dart'; | 7 import 'package:expect/expect.dart'; |
| 8 import 'package:async_helper/async_helper.dart'; | 8 import 'package:async_helper/async_helper.dart'; |
| 9 import 'type_test_helper.dart'; | 9 import 'type_test_helper.dart'; |
| 10 import 'package:compiler/src/common/names.dart'; | 10 import 'package:compiler/src/common/names.dart'; |
| 11 import 'package:compiler/src/elements/elements.dart' | 11 import 'package:compiler/src/elements/elements.dart' |
| 12 show Element, ClassElement, LibraryElement; | 12 show Element, ClassElement, LibraryElement; |
| 13 import 'package:compiler/src/universe/class_set.dart'; | 13 import 'package:compiler/src/universe/class_set.dart'; |
| 14 import 'package:compiler/src/world.dart' show ClosedWorld; | 14 import 'package:compiler/src/world.dart' show ClassQuery, ClosedWorld; |
| 15 | 15 |
| 16 void main() { | 16 void main() { |
| 17 asyncTest(() async { | 17 asyncTest(() async { |
| 18 await testClassSets(); | 18 await testClassSets(); |
| 19 await testProperties(); | 19 await testProperties(); |
| 20 await testNativeClasses(); | 20 await testNativeClasses(); |
| 21 await testCommonSubclasses(); |
| 21 }); | 22 }); |
| 22 } | 23 } |
| 23 | 24 |
| 24 testClassSets() async { | 25 testClassSets() async { |
| 25 var env = await TypeEnvironment.create( | 26 var env = await TypeEnvironment.create( |
| 26 r""" | 27 r""" |
| 27 class A implements X {} | 28 class A implements X {} |
| 28 class B {} | 29 class B {} |
| 29 class C_Super extends A {} | 30 class C_Super extends A {} |
| 30 class C extends C_Super {} | 31 class C extends C_Super {} |
| (...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 isDirectlyInstantiated: false, | 504 isDirectlyInstantiated: false, |
| 504 isAbstractlyInstantiated: true, | 505 isAbstractlyInstantiated: true, |
| 505 isIndirectlyInstantiated: false, | 506 isIndirectlyInstantiated: false, |
| 506 hasStrictSubtype: false, | 507 hasStrictSubtype: false, |
| 507 hasOnlySubclasses: true, | 508 hasOnlySubclasses: true, |
| 508 lubOfInstantiatedSubclasses: clsCanvasRenderingContext2D, | 509 lubOfInstantiatedSubclasses: clsCanvasRenderingContext2D, |
| 509 lubOfInstantiatedSubtypes: clsCanvasRenderingContext2D, | 510 lubOfInstantiatedSubtypes: clsCanvasRenderingContext2D, |
| 510 instantiatedSubclassCount: 0, | 511 instantiatedSubclassCount: 0, |
| 511 instantiatedSubtypeCount: 0); | 512 instantiatedSubtypeCount: 0); |
| 512 } | 513 } |
| 514 |
| 515 testCommonSubclasses() async { |
| 516 var env = await TypeEnvironment.create('', |
| 517 mainSource: r""" |
| 518 class A {} |
| 519 class B {} |
| 520 class C extends A {} |
| 521 class D implements A {} |
| 522 class E extends B {} |
| 523 class F implements C, E {} |
| 524 class G extends C implements E {} |
| 525 class H implements C {} |
| 526 class I extends D implements E {} |
| 527 class J extends E implements D {} |
| 528 main() { |
| 529 new A(); |
| 530 new B(); |
| 531 new C(); |
| 532 new D(); |
| 533 new E(); |
| 534 new F(); |
| 535 new G(); |
| 536 new H(); |
| 537 new I(); |
| 538 new J(); |
| 539 } |
| 540 """, |
| 541 useMockCompiler: false); |
| 542 ClosedWorld closedWorld = env.closedWorld; |
| 543 |
| 544 ClassElement Object_ = env.getElement("Object"); |
| 545 ClassElement A = env.getElement("A"); |
| 546 ClassElement B = env.getElement("B"); |
| 547 ClassElement C = env.getElement("C"); |
| 548 ClassElement D = env.getElement("D"); |
| 549 ClassElement F = env.getElement("F"); |
| 550 ClassElement G = env.getElement("G"); |
| 551 ClassElement H = env.getElement("H"); |
| 552 ClassElement I = env.getElement("I"); |
| 553 ClassElement J = env.getElement("J"); |
| 554 |
| 555 void check(ClassElement cls1, ClassQuery query1, ClassElement cls2, |
| 556 ClassQuery query2, List<ClassElement> expectedResult) { |
| 557 Iterable<ClassElement> result1 = |
| 558 closedWorld.commonSubclasses(cls1, query1, cls2, query2); |
| 559 Iterable<ClassElement> result2 = |
| 560 closedWorld.commonSubclasses(cls2, query2, cls1, query1); |
| 561 Expect.setEquals( |
| 562 result1, |
| 563 result2, |
| 564 "Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):" |
| 565 "\n a vs b: $result1\n b vs a: $result2"); |
| 566 Expect.setEquals( |
| 567 expectedResult, |
| 568 result1, |
| 569 "Unexpected results for ($cls1,$query1) vs ($cls2,$query2):" |
| 570 "\n expected: $expectedResult\n actual: $result1"); |
| 571 } |
| 572 |
| 573 check(A, ClassQuery.EXACT, A, ClassQuery.EXACT, []); |
| 574 check(A, ClassQuery.EXACT, A, ClassQuery.SUBCLASS, []); |
| 575 check(A, ClassQuery.EXACT, A, ClassQuery.SUBTYPE, []); |
| 576 check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBCLASS, [C]); |
| 577 check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBTYPE, [C]); |
| 578 check(A, ClassQuery.SUBTYPE, A, ClassQuery.SUBTYPE, [C, D]); |
| 579 |
| 580 check(A, ClassQuery.EXACT, B, ClassQuery.EXACT, []); |
| 581 check(A, ClassQuery.EXACT, B, ClassQuery.SUBCLASS, []); |
| 582 check(A, ClassQuery.SUBCLASS, B, ClassQuery.EXACT, []); |
| 583 check(A, ClassQuery.EXACT, B, ClassQuery.SUBTYPE, []); |
| 584 check(A, ClassQuery.SUBTYPE, B, ClassQuery.EXACT, []); |
| 585 check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBCLASS, []); |
| 586 check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBTYPE, [G]); |
| 587 check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBCLASS, [J]); |
| 588 check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE, [F, G, I, J]); |
| 589 |
| 590 check(A, ClassQuery.EXACT, C, ClassQuery.EXACT, []); |
| 591 check(A, ClassQuery.EXACT, C, ClassQuery.SUBCLASS, []); |
| 592 check(A, ClassQuery.SUBCLASS, C, ClassQuery.EXACT, []); |
| 593 check(A, ClassQuery.EXACT, C, ClassQuery.SUBTYPE, []); |
| 594 check(A, ClassQuery.SUBTYPE, C, ClassQuery.EXACT, []); |
| 595 check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS, [G]); |
| 596 check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE, [G]); |
| 597 check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS, [G]); |
| 598 check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE, [F, G, H]); |
| 599 |
| 600 check(B, ClassQuery.EXACT, C, ClassQuery.EXACT, []); |
| 601 check(B, ClassQuery.EXACT, C, ClassQuery.SUBCLASS, []); |
| 602 check(B, ClassQuery.SUBCLASS, C, ClassQuery.EXACT, []); |
| 603 check(B, ClassQuery.EXACT, C, ClassQuery.SUBTYPE, []); |
| 604 check(B, ClassQuery.SUBTYPE, C, ClassQuery.EXACT, []); |
| 605 check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS, []); |
| 606 check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE, []); |
| 607 check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS, [G]); |
| 608 check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE, [F, G]); |
| 609 } |
| OLD | NEW |