Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Side by Side Diff: tests/compiler/dart2js/world_test.dart

Issue 2813853002: Use entity WorldImpl where possible (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tests/compiler/dart2js/kernel/closed_world2_test.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 ClassElement, LibraryElement;
13 import 'package:compiler/src/elements/entities.dart';
13 import 'package:compiler/src/universe/class_set.dart'; 14 import 'package:compiler/src/universe/class_set.dart';
14 import 'package:compiler/src/world.dart' show ClassQuery, ClosedWorld; 15 import 'package:compiler/src/world.dart' show ClassQuery, ClosedWorld;
15 16
16 void main() { 17 void main() {
17 asyncTest(() async { 18 asyncTest(() async {
18 await testClassSets(); 19 await testClassSets();
19 await testProperties(); 20 await testProperties();
20 await testNativeClasses(); 21 await testNativeClasses();
21 await testCommonSubclasses(); 22 await testCommonSubclasses();
22 }); 23 });
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 ClassElement Object_ = env.getElement("Object"); 56 ClassElement Object_ = env.getElement("Object");
56 ClassElement A = env.getElement("A"); 57 ClassElement A = env.getElement("A");
57 ClassElement B = env.getElement("B"); 58 ClassElement B = env.getElement("B");
58 ClassElement C = env.getElement("C"); 59 ClassElement C = env.getElement("C");
59 ClassElement D = env.getElement("D"); 60 ClassElement D = env.getElement("D");
60 ClassElement E = env.getElement("E"); 61 ClassElement E = env.getElement("E");
61 ClassElement F = env.getElement("F"); 62 ClassElement F = env.getElement("F");
62 ClassElement G = env.getElement("G"); 63 ClassElement G = env.getElement("G");
63 ClassElement X = env.getElement("X"); 64 ClassElement X = env.getElement("X");
64 65
65 void checkClasses(String property, ClassElement cls, 66 void checkClasses(String property, ClassEntity cls,
66 Iterable<ClassElement> foundClasses, List<ClassElement> expectedClasses, 67 Iterable<ClassEntity> foundClasses, List<ClassEntity> expectedClasses,
67 {bool exact: true}) { 68 {bool exact: true}) {
68 for (ClassElement expectedClass in expectedClasses) { 69 for (ClassEntity expectedClass in expectedClasses) {
69 Expect.isTrue( 70 Expect.isTrue(
70 foundClasses.contains(expectedClass), 71 foundClasses.contains(expectedClass),
71 "Expect $expectedClass in '$property' on $cls. " 72 "Expect $expectedClass in '$property' on $cls. "
72 "Found:\n ${foundClasses.join('\n ')}\n" 73 "Found:\n ${foundClasses.join('\n ')}\n"
73 "${closedWorld.dump(cls)}"); 74 "${closedWorld.dump(cls)}");
74 } 75 }
75 if (exact) { 76 if (exact) {
76 Expect.equals( 77 Expect.equals(
77 expectedClasses.length, 78 expectedClasses.length,
78 foundClasses.length, 79 foundClasses.length,
79 "Unexpected classes " 80 "Unexpected classes "
80 "${foundClasses.where((c) => !expectedClasses.contains(c))} " 81 "${foundClasses.where((c) => !expectedClasses.contains(c))} "
81 "in '$property' on $cls.\n" 82 "in '$property' on $cls.\n"
82 "${closedWorld.dump(cls)}"); 83 "${closedWorld.dump(cls)}");
83 } 84 }
84 } 85 }
85 86
86 void check(String property, ClassElement cls, 87 void check(String property, ClassEntity cls,
87 Iterable<ClassElement> foundClasses, List<ClassElement> expectedClasses, 88 Iterable<ClassEntity> foundClasses, List<ClassEntity> expectedClasses,
88 {bool exact: true, 89 {bool exact: true,
89 void forEach(ClassElement cls, ForEachFunction f), 90 void forEach(ClassEntity cls, ForEachFunction f),
90 int getCount(ClassElement cls)}) { 91 int getCount(ClassEntity cls)}) {
91 checkClasses(property, cls, foundClasses, expectedClasses, exact: exact); 92 checkClasses(property, cls, foundClasses, expectedClasses, exact: exact);
92 93
93 if (forEach != null) { 94 if (forEach != null) {
94 List<ClassElement> visited = <ClassElement>[]; 95 List<ClassEntity> visited = <ClassEntity>[];
95 forEach(cls, (ClassElement c) { 96 forEach(cls, (ClassEntity c) {
96 visited.add(c); 97 visited.add(c);
97 }); 98 });
98 checkClasses('forEach($property)', cls, visited, expectedClasses, 99 checkClasses('forEach($property)', cls, visited, expectedClasses,
99 exact: exact); 100 exact: exact);
100 } 101 }
101 102
102 if (getCount != null && exact) { 103 if (getCount != null && exact) {
103 int count = getCount(cls); 104 int count = getCount(cls);
104 Expect.equals( 105 Expect.equals(
105 expectedClasses.length, 106 expectedClasses.length,
106 count, 107 count,
107 "Unexpected class count in '$property' on $cls.\n" 108 "Unexpected class count in '$property' on $cls.\n"
108 "${closedWorld.dump(cls)}"); 109 "${closedWorld.dump(cls)}");
109 } 110 }
110 } 111 }
111 112
112 void testSubclasses(ClassElement cls, List<ClassElement> expectedClasses, 113 void testSubclasses(ClassEntity cls, List<ClassEntity> expectedClasses,
113 {bool exact: true}) { 114 {bool exact: true}) {
114 check('subclassesOf', cls, closedWorld.subclassesOf(cls), expectedClasses, 115 check('subclassesOf', cls, closedWorld.subclassesOf(cls), expectedClasses,
115 exact: exact); 116 exact: exact);
116 } 117 }
117 118
118 void testStrictSubclasses( 119 void testStrictSubclasses(ClassEntity cls, List<ClassEntity> expectedClasses,
119 ClassElement cls, List<ClassElement> expectedClasses,
120 {bool exact: true}) { 120 {bool exact: true}) {
121 check('strictSubclassesOf', cls, closedWorld.strictSubclassesOf(cls), 121 check('strictSubclassesOf', cls, closedWorld.strictSubclassesOf(cls),
122 expectedClasses, 122 expectedClasses,
123 exact: exact, 123 exact: exact,
124 forEach: closedWorld.forEachStrictSubclassOf, 124 forEach: closedWorld.forEachStrictSubclassOf,
125 getCount: closedWorld.strictSubclassCount); 125 getCount: closedWorld.strictSubclassCount);
126 } 126 }
127 127
128 void testStrictSubtypes(ClassElement cls, List<ClassElement> expectedClasses, 128 void testStrictSubtypes(ClassEntity cls, List<ClassEntity> expectedClasses,
129 {bool exact: true}) { 129 {bool exact: true}) {
130 check('strictSubtypesOf', cls, closedWorld.strictSubtypesOf(cls), 130 check('strictSubtypesOf', cls, closedWorld.strictSubtypesOf(cls),
131 expectedClasses, 131 expectedClasses,
132 exact: exact, 132 exact: exact,
133 forEach: closedWorld.forEachStrictSubtypeOf, 133 forEach: closedWorld.forEachStrictSubtypeOf,
134 getCount: closedWorld.strictSubtypeCount); 134 getCount: closedWorld.strictSubtypeCount);
135 } 135 }
136 136
137 void testMixinUses(ClassElement cls, List<ClassElement> expectedClasses, 137 void testMixinUses(ClassEntity cls, List<ClassEntity> expectedClasses,
138 {bool exact: true}) { 138 {bool exact: true}) {
139 check('mixinUsesOf', cls, closedWorld.mixinUsesOf(cls), expectedClasses, 139 check('mixinUsesOf', cls, closedWorld.mixinUsesOf(cls), expectedClasses,
140 exact: exact); 140 exact: exact);
141 } 141 }
142 142
143 testSubclasses(Object_, [A, B, C, D, E, F, G], exact: false); 143 testSubclasses(Object_, [A, B, C, D, E, F, G], exact: false);
144 testSubclasses(A, [A, C]); 144 testSubclasses(A, [A, C]);
145 testSubclasses(B, [B, E]); 145 testSubclasses(B, [B, E]);
146 testSubclasses(C, [C]); 146 testSubclasses(C, [C]);
147 testSubclasses(D, [D]); 147 testSubclasses(D, [D]);
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 new F2(); 236 new F2();
237 new G2(); 237 new G2();
238 new G3(); 238 new G3();
239 new H4(); 239 new H4();
240 } 240 }
241 """, 241 """,
242 useMockCompiler: false); 242 useMockCompiler: false);
243 ClosedWorld closedWorld = env.closedWorld; 243 ClosedWorld closedWorld = env.closedWorld;
244 244
245 check(String name, {bool hasStrictSubtype, bool hasOnlySubclasses}) { 245 check(String name, {bool hasStrictSubtype, bool hasOnlySubclasses}) {
246 ClassElement cls = env.getElement(name); 246 ClassEntity cls = env.getElement(name);
247 Expect.equals(hasStrictSubtype, closedWorld.hasAnyStrictSubtype(cls), 247 Expect.equals(hasStrictSubtype, closedWorld.hasAnyStrictSubtype(cls),
248 "Unexpected hasAnyStrictSubtype property on $cls."); 248 "Unexpected hasAnyStrictSubtype property on $cls.");
249 Expect.equals(hasOnlySubclasses, closedWorld.hasOnlySubclasses(cls), 249 Expect.equals(hasOnlySubclasses, closedWorld.hasOnlySubclasses(cls),
250 "Unexpected hasOnlySubclasses property on $cls."); 250 "Unexpected hasOnlySubclasses property on $cls.");
251 } 251 }
252 252
253 check("Object", hasStrictSubtype: true, hasOnlySubclasses: true); 253 check("Object", hasStrictSubtype: true, hasOnlySubclasses: true);
254 254
255 // No instantiated Ax classes. 255 // No instantiated Ax classes.
256 check("A", hasStrictSubtype: false, hasOnlySubclasses: true); 256 check("A", hasStrictSubtype: false, hasOnlySubclasses: true);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 ClassElement clsEventTarget = dart_html.findExported('EventTarget'); 324 ClassElement clsEventTarget = dart_html.findExported('EventTarget');
325 ClassElement clsWindow = dart_html.findExported('Window'); 325 ClassElement clsWindow = dart_html.findExported('Window');
326 ClassElement clsAbstractWorker = dart_html.findExported('AbstractWorker'); 326 ClassElement clsAbstractWorker = dart_html.findExported('AbstractWorker');
327 ClassElement clsWorker = dart_html.findExported('Worker'); 327 ClassElement clsWorker = dart_html.findExported('Worker');
328 ClassElement clsCanvasElement = dart_html.findExported('CanvasElement'); 328 ClassElement clsCanvasElement = dart_html.findExported('CanvasElement');
329 ClassElement clsCanvasRenderingContext = 329 ClassElement clsCanvasRenderingContext =
330 dart_html.findExported('CanvasRenderingContext'); 330 dart_html.findExported('CanvasRenderingContext');
331 ClassElement clsCanvasRenderingContext2D = 331 ClassElement clsCanvasRenderingContext2D =
332 dart_html.findExported('CanvasRenderingContext2D'); 332 dart_html.findExported('CanvasRenderingContext2D');
333 333
334 List<ClassElement> allClasses = [ 334 List<ClassEntity> allClasses = [
335 clsEventTarget, 335 clsEventTarget,
336 clsWindow, 336 clsWindow,
337 clsAbstractWorker, 337 clsAbstractWorker,
338 clsWorker, 338 clsWorker,
339 clsCanvasElement, 339 clsCanvasElement,
340 clsCanvasRenderingContext, 340 clsCanvasRenderingContext,
341 clsCanvasRenderingContext2D 341 clsCanvasRenderingContext2D
342 ]; 342 ];
343 343
344 check(ClassElement cls, 344 check(ClassEntity cls,
345 {bool isDirectlyInstantiated, 345 {bool isDirectlyInstantiated,
346 bool isAbstractlyInstantiated, 346 bool isAbstractlyInstantiated,
347 bool isIndirectlyInstantiated, 347 bool isIndirectlyInstantiated,
348 bool hasStrictSubtype, 348 bool hasStrictSubtype,
349 bool hasOnlySubclasses, 349 bool hasOnlySubclasses,
350 ClassElement lubOfInstantiatedSubclasses, 350 ClassEntity lubOfInstantiatedSubclasses,
351 ClassElement lubOfInstantiatedSubtypes, 351 ClassEntity lubOfInstantiatedSubtypes,
352 int instantiatedSubclassCount, 352 int instantiatedSubclassCount,
353 int instantiatedSubtypeCount, 353 int instantiatedSubtypeCount,
354 List<ClassElement> subclasses: const <ClassElement>[], 354 List<ClassEntity> subclasses: const <ClassEntity>[],
355 List<ClassElement> subtypes: const <ClassElement>[]}) { 355 List<ClassEntity> subtypes: const <ClassEntity>[]}) {
356 ClassSet classSet = closedWorld.getClassSet(cls); 356 ClassSet classSet = closedWorld.getClassSet(cls);
357 ClassHierarchyNode node = classSet.node; 357 ClassHierarchyNode node = classSet.node;
358 358
359 String dumpText = '\n${closedWorld.dump(cls)}'; 359 String dumpText = '\n${closedWorld.dump(cls)}';
360 360
361 Expect.equals( 361 Expect.equals(
362 isDirectlyInstantiated, 362 isDirectlyInstantiated,
363 closedWorld.isDirectlyInstantiated(cls), 363 closedWorld.isDirectlyInstantiated(cls),
364 "Unexpected isDirectlyInstantiated property on $cls.$dumpText"); 364 "Unexpected isDirectlyInstantiated property on $cls.$dumpText");
365 Expect.equals( 365 Expect.equals(
(...skipping 17 matching lines...) Expand all
383 classSet.getLubOfInstantiatedSubtypes(), 383 classSet.getLubOfInstantiatedSubtypes(),
384 "Unexpected getLubOfInstantiatedSubtypes() result on $cls.$dumpText"); 384 "Unexpected getLubOfInstantiatedSubtypes() result on $cls.$dumpText");
385 if (instantiatedSubclassCount != null) { 385 if (instantiatedSubclassCount != null) {
386 Expect.equals(instantiatedSubclassCount, node.instantiatedSubclassCount, 386 Expect.equals(instantiatedSubclassCount, node.instantiatedSubclassCount,
387 "Unexpected instantiatedSubclassCount property on $cls.$dumpText"); 387 "Unexpected instantiatedSubclassCount property on $cls.$dumpText");
388 } 388 }
389 if (instantiatedSubtypeCount != null) { 389 if (instantiatedSubtypeCount != null) {
390 Expect.equals(instantiatedSubtypeCount, classSet.instantiatedSubtypeCount, 390 Expect.equals(instantiatedSubtypeCount, classSet.instantiatedSubtypeCount,
391 "Unexpected instantiatedSubtypeCount property on $cls.$dumpText"); 391 "Unexpected instantiatedSubtypeCount property on $cls.$dumpText");
392 } 392 }
393 for (ClassElement other in allClasses) { 393 for (ClassEntity other in allClasses) {
394 if (other == cls) continue; 394 if (other == cls) continue;
395 if (!closedWorld.isExplicitlyInstantiated(other)) continue; 395 if (!closedWorld.isExplicitlyInstantiated(other)) continue;
396 Expect.equals( 396 Expect.equals(
397 subclasses.contains(other), 397 subclasses.contains(other),
398 closedWorld.isSubclassOf(other, cls), 398 closedWorld.isSubclassOf(other, cls),
399 "Unexpected subclass relation between $other and $cls."); 399 "Unexpected subclass relation between $other and $cls.");
400 Expect.equals( 400 Expect.equals(
401 subtypes.contains(other), 401 subtypes.contains(other),
402 closedWorld.isSubtypeOf(other, cls), 402 closedWorld.isSubtypeOf(other, cls),
403 "Unexpected subtype relation between $other and $cls."); 403 "Unexpected subtype relation between $other and $cls.");
404 } 404 }
405 405
406 Set<ClassElement> strictSubclasses = new Set<ClassElement>(); 406 Set<ClassEntity> strictSubclasses = new Set<ClassEntity>();
407 closedWorld.forEachStrictSubclassOf(cls, (ClassElement other) { 407 closedWorld.forEachStrictSubclassOf(cls, (ClassEntity other) {
408 if (allClasses.contains(other)) { 408 if (allClasses.contains(other)) {
409 strictSubclasses.add(other); 409 strictSubclasses.add(other);
410 } 410 }
411 }); 411 });
412 Expect.setEquals(subclasses, strictSubclasses, 412 Expect.setEquals(subclasses, strictSubclasses,
413 "Unexpected strict subclasses of $cls: ${strictSubclasses}."); 413 "Unexpected strict subclasses of $cls: ${strictSubclasses}.");
414 414
415 Set<ClassElement> strictSubtypes = new Set<ClassElement>(); 415 Set<ClassEntity> strictSubtypes = new Set<ClassEntity>();
416 closedWorld.forEachStrictSubtypeOf(cls, (ClassElement other) { 416 closedWorld.forEachStrictSubtypeOf(cls, (ClassEntity other) {
417 if (allClasses.contains(other)) { 417 if (allClasses.contains(other)) {
418 strictSubtypes.add(other); 418 strictSubtypes.add(other);
419 } 419 }
420 }); 420 });
421 Expect.setEquals(subtypes, strictSubtypes, 421 Expect.setEquals(subtypes, strictSubtypes,
422 "Unexpected strict subtypes of $cls: $strictSubtypes."); 422 "Unexpected strict subtypes of $cls: $strictSubtypes.");
423 } 423 }
424 424
425 // Extended by Window. 425 // Extended by Window.
426 check(clsEventTarget, 426 check(clsEventTarget,
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 ClassElement A = env.getElement("A"); 545 ClassElement A = env.getElement("A");
546 ClassElement B = env.getElement("B"); 546 ClassElement B = env.getElement("B");
547 ClassElement C = env.getElement("C"); 547 ClassElement C = env.getElement("C");
548 ClassElement D = env.getElement("D"); 548 ClassElement D = env.getElement("D");
549 ClassElement F = env.getElement("F"); 549 ClassElement F = env.getElement("F");
550 ClassElement G = env.getElement("G"); 550 ClassElement G = env.getElement("G");
551 ClassElement H = env.getElement("H"); 551 ClassElement H = env.getElement("H");
552 ClassElement I = env.getElement("I"); 552 ClassElement I = env.getElement("I");
553 ClassElement J = env.getElement("J"); 553 ClassElement J = env.getElement("J");
554 554
555 void check(ClassElement cls1, ClassQuery query1, ClassElement cls2, 555 void check(ClassEntity cls1, ClassQuery query1, ClassEntity cls2,
556 ClassQuery query2, List<ClassElement> expectedResult) { 556 ClassQuery query2, List<ClassEntity> expectedResult) {
557 Iterable<ClassElement> result1 = 557 Iterable<ClassEntity> result1 =
558 closedWorld.commonSubclasses(cls1, query1, cls2, query2); 558 closedWorld.commonSubclasses(cls1, query1, cls2, query2);
559 Iterable<ClassElement> result2 = 559 Iterable<ClassEntity> result2 =
560 closedWorld.commonSubclasses(cls2, query2, cls1, query1); 560 closedWorld.commonSubclasses(cls2, query2, cls1, query1);
561 Expect.setEquals( 561 Expect.setEquals(
562 result1, 562 result1,
563 result2, 563 result2,
564 "Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):" 564 "Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):"
565 "\n a vs b: $result1\n b vs a: $result2"); 565 "\n a vs b: $result1\n b vs a: $result2");
566 Expect.setEquals( 566 Expect.setEquals(
567 expectedResult, 567 expectedResult,
568 result1, 568 result1,
569 "Unexpected results for ($cls1,$query1) vs ($cls2,$query2):" 569 "Unexpected results for ($cls1,$query1) vs ($cls2,$query2):"
(...skipping 30 matching lines...) Expand all
600 check(B, ClassQuery.EXACT, C, ClassQuery.EXACT, []); 600 check(B, ClassQuery.EXACT, C, ClassQuery.EXACT, []);
601 check(B, ClassQuery.EXACT, C, ClassQuery.SUBCLASS, []); 601 check(B, ClassQuery.EXACT, C, ClassQuery.SUBCLASS, []);
602 check(B, ClassQuery.SUBCLASS, C, ClassQuery.EXACT, []); 602 check(B, ClassQuery.SUBCLASS, C, ClassQuery.EXACT, []);
603 check(B, ClassQuery.EXACT, C, ClassQuery.SUBTYPE, []); 603 check(B, ClassQuery.EXACT, C, ClassQuery.SUBTYPE, []);
604 check(B, ClassQuery.SUBTYPE, C, ClassQuery.EXACT, []); 604 check(B, ClassQuery.SUBTYPE, C, ClassQuery.EXACT, []);
605 check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS, []); 605 check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS, []);
606 check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE, []); 606 check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE, []);
607 check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS, [G]); 607 check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS, [G]);
608 check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE, [F, G]); 608 check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE, [F, G]);
609 } 609 }
OLDNEW
« no previous file with comments | « tests/compiler/dart2js/kernel/closed_world2_test.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698