OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 instantiated_classes_test; | 5 library instantiated_classes_test; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'package:expect/expect.dart'; | 8 import 'package:expect/expect.dart'; |
9 import 'package:async_helper/async_helper.dart'; | 9 import 'package:async_helper/async_helper.dart'; |
10 import 'package:compiler/src/elements/entities.dart' | 10 import 'package:compiler/src/elements/entities.dart' |
11 show ClassEntity, LibraryEntity; | 11 show ClassEntity, LibraryEntity; |
12 import 'type_test_helper.dart'; | 12 import 'type_test_helper.dart'; |
13 | 13 |
14 void main() { | 14 void main() { |
15 asyncTest(() => Future.forEach([ | 15 asyncTest(() => Future.forEach([ |
16 () => test("class Class {}", ["Class"]), | 16 () => test("class Class {}", ["Class"]), |
17 () => test( | 17 () => test("""abstract class A {} |
18 """abstract class A {} | 18 class Class extends A {}""", ["Class"]), |
19 class Class extends A {}""", | 19 () => test("""class A {} |
20 ["Class"]), | 20 class Class extends A {}""", ["Class"]), |
21 () => test( | 21 () => test("""class A {} |
22 """class A {} | |
23 class Class extends A {}""", | |
24 ["Class"]), | |
25 () => test( | |
26 """class A {} | |
27 class B {} | 22 class B {} |
28 class Class extends A {}""", | 23 class Class extends A {}""", ["Class"]), |
29 ["Class"]), | 24 () => test("""class A {} |
30 () => test( | 25 class Class implements A {}""", ["Class"]), |
31 """class A {} | 26 () => test("""class A {} |
32 class Class implements A {}""", | 27 class Class extends Object with A {}""", ["Class"]), |
33 ["Class"]), | 28 () => test("""class A {} |
34 () => test( | |
35 """class A {} | |
36 class Class extends Object with A {}""", | |
37 ["Class"]), | |
38 () => test( | |
39 """class A {} | |
40 class B {} | 29 class B {} |
41 class Class extends Object with B implements A {}""", | 30 class Class extends Object with B implements A {}""", |
42 ["Class"]), | 31 ["Class"]), |
43 | 32 |
44 () => test( | 33 () => test("""class A {} |
45 """class A {} | 34 class Class {}""", ["Class", "A"], ["Class", "A"]), |
46 class Class {}""", | 35 () => test("""class A {} |
47 ["Class", "A"], | 36 class Class extends A {}""", ["Class", "A"], ["Class", "A"]), |
| 37 () => test("""class A {} |
| 38 class Class implements A {}""", ["Class", "A"], |
48 ["Class", "A"]), | 39 ["Class", "A"]), |
49 () => test( | 40 () => test("""class A {} |
50 """class A {} | |
51 class Class extends A {}""", | |
52 ["Class", "A"], | |
53 ["Class", "A"]), | |
54 () => test( | |
55 """class A {} | |
56 class Class implements A {}""", | |
57 ["Class", "A"], | |
58 ["Class", "A"]), | |
59 () => test( | |
60 """class A {} | |
61 class B extends A {} | 41 class B extends A {} |
62 class Class extends B {}""", | 42 class Class extends B {}""", ["Class", "A"], ["Class", "A"]), |
63 ["Class", "A"], | 43 () => test("""class A {} |
64 ["Class", "A"]), | |
65 () => test( | |
66 """class A {} | |
67 class B {} | 44 class B {} |
68 class Class extends B with A {}""", | 45 class Class extends B with A {}""", ["Class", "A"], |
69 ["Class", "A"], | |
70 ["Class", "A"]), | 46 ["Class", "A"]), |
71 | 47 |
72 // TODO(johnniwinther): Avoid registration of `Class` as instantiated. | 48 // TODO(johnniwinther): Avoid registration of `Class` as instantiated. |
73 () => test( | 49 () => test("""class A {} |
74 """class A {} | |
75 class Class implements A { | 50 class Class implements A { |
76 factory Class() = A; | 51 factory Class() = A; |
77 }""", | 52 }""", ["Class", "A"], ["Class"]), |
78 ["Class", "A"], | |
79 ["Class"]), | |
80 ], (f) => f())); | 53 ], (f) => f())); |
81 } | 54 } |
82 | 55 |
83 Future test(String source, List<String> directlyInstantiatedClasses, | 56 Future test(String source, List<String> directlyInstantiatedClasses, |
84 [List<String> newClasses = const <String>["Class"]]) { | 57 [List<String> newClasses = const <String>["Class"]]) { |
85 StringBuffer mainSource = new StringBuffer(); | 58 StringBuffer mainSource = new StringBuffer(); |
86 mainSource.write('main() {\n'); | 59 mainSource.write('main() {\n'); |
87 for (String newClass in newClasses) { | 60 for (String newClass in newClasses) { |
88 mainSource.write(' new $newClass();\n'); | 61 mainSource.write(' new $newClass();\n'); |
89 } | 62 } |
90 mainSource.write('}'); | 63 mainSource.write('}'); |
91 return TypeEnvironment | 64 return TypeEnvironment |
92 .create(source, mainSource: mainSource.toString(), useMockCompiler: true) | 65 .create(source, mainSource: mainSource.toString(), useMockCompiler: true) |
93 .then((dynamic env) { | 66 .then((dynamic env) { |
94 LibraryEntity mainLibrary = | 67 LibraryEntity mainLibrary = |
95 env.compiler.frontendStrategy.elementEnvironment.mainLibrary; | 68 env.compiler.frontendStrategy.elementEnvironment.mainLibrary; |
96 Iterable<ClassEntity> expectedClasses = | 69 Iterable<ClassEntity> expectedClasses = |
97 directlyInstantiatedClasses.map(env.getElement); | 70 directlyInstantiatedClasses.map(env.getElement); |
98 Iterable<ClassEntity> actualClasses = env | 71 Iterable<ClassEntity> actualClasses = env |
99 .compiler.resolutionWorldBuilder.directlyInstantiatedClasses | 72 .compiler.resolutionWorldBuilder.directlyInstantiatedClasses |
100 .where((c) => c.library == mainLibrary); | 73 .where((c) => c.library == mainLibrary); |
101 Expect.setEquals(expectedClasses, actualClasses); | 74 Expect.setEquals(expectedClasses, actualClasses); |
102 }); | 75 }); |
103 } | 76 } |
OLD | NEW |