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

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

Issue 1234053002: Add SubclassNode to prepare for optimized queries on ClassWorld. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 5 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
OLDNEW
(Empty)
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
3 // BSD-style license that can be found in the LICENSE file.
4
5 // Test for iterators on for [SubclassNode].
6
7 library world_test;
8
9 import 'package:expect/expect.dart';
10 import 'package:async_helper/async_helper.dart';
11 import 'type_test_helper.dart';
12 import 'package:compiler/src/elements/elements.dart'
13 show Element, ClassElement;
14 import 'package:compiler/src/dart2jslib.dart';
15 import 'package:compiler/src/universe/class_set.dart';
16 import 'package:compiler/src/util/util.dart';
17
18 void main() {
19 asyncTest(() => TypeEnvironment.create(r"""
20 /// A
21 /// / \
22 /// B C
23 /// / /|\
24 /// D E F G
25 ///
26 class A {}
27 class B extends A {}
28 class C extends A {}
29 class D extends B {}
30 class E extends C {}
31 class F extends C {}
32 class G extends C {}
33 """,
34 mainSource: r"""
35 main() {
36 new A();
37 new C();
38 new D();
39 new E();
40 new F();
41 new G();
42 }
43 """,
44 useMockCompiler: false).then((env) {
45 World world = env.compiler.world;
46
47 ClassElement A = env.getElement("A");
48 ClassElement B = env.getElement("B");
49 ClassElement C = env.getElement("C");
50 ClassElement D = env.getElement("D");
51 ClassElement E = env.getElement("E");
52 ClassElement F = env.getElement("F");
53 ClassElement G = env.getElement("G");
54
55 void checkClass(ClassElement cls,
56 {bool directlyInstantiated: false,
57 bool indirectlyInstantiated: false}) {
58 SubclassNode node = world.subclassNode(cls);
59 Expect.isNotNull(node, "Expected SubclassNode for $cls.");
60 Expect.equals(
61 directlyInstantiated || indirectlyInstantiated,
62 node.isInstantiated,
63 "Unexpected `isInstantiated` on SubclassNode for $cls.");
64 Expect.equals(
65 directlyInstantiated,
66 node.isDirectlyInstantiated,
67 "Unexpected `isDirectlyInstantiated` on SubclassNode for $cls.");
68 Expect.equals(
69 indirectlyInstantiated,
70 node.isIndirectlyInstantiated,
71 "Unexpected `isIndirectlyInstantiated` on SubclassNode for $cls.");
72 }
73
74
75 checkClass(A, directlyInstantiated: true, indirectlyInstantiated: true);
76 checkClass(B, indirectlyInstantiated: true);
77 checkClass(C, directlyInstantiated: true, indirectlyInstantiated: true);
78 checkClass(D, directlyInstantiated: true);
79 checkClass(E, directlyInstantiated: true);
80 checkClass(F, directlyInstantiated: true);
81 checkClass(G, directlyInstantiated: true);
82
83 SubclassNodeIterator iterator;
84
85 void checkState(
86 ClassElement root,
87 {ClassElement currentNode,
88 List<List<ClassElement>> stack}) {
89
90 ClassElement classOf(SubclassNode node) {
91 return node != null ? node.cls : null;
92 }
93
94 List<ClassElement> classesOf(Link<SubclassNode> link) {
95 if (link == null) return null;
96 return link.map(classOf).toList();
97 }
98
99 List<List<ClassElement>> listOf(Link<Link<SubclassNode>> link) {
100 if (link == null) return null;
101 return link.map(classesOf).toList();
102 }
103
104 ClassElement foundRoot = iterator.root.cls;
105 ClassElement foundCurrentNode = classOf(iterator.currentNode);
106 List<List<ClassElement>> foundStack = listOf(iterator.stack);
107
108 StringBuffer sb = new StringBuffer();
109 sb.write('{\n root: $foundRoot');
110 sb.write('\n currentNode: $currentNode');
111 sb.write('\n stack: $foundStack\n}');
112
113 Expect.equals(root, foundRoot,
114 "Expected root $root in $sb.");
115 if (currentNode == null) {
116 Expect.isNull(iterator.currentNode,
117 "Unexpected non-null currentNode in $sb.");
118 } else {
119 Expect.isNotNull(foundCurrentNode,
120 "Expected non-null currentNode ${currentNode} in $sb.");
121 Expect.equals(currentNode, foundCurrentNode,
122 "Expected currentNode $currentNode in $sb.");
123 }
124 if (stack == null) {
125 Expect.isNull(foundStack,
126 "Unexpected non-null stack in $sb.");
127 } else {
128 Expect.isNotNull(foundStack,
129 "Expected non-null stack ${stack} in $sb.");
130 Expect.equals(
131 stack.length, foundStack.length,
132 "Expected stack length ${stack.length} in $sb.");
133 for (int i = 0; i < stack.length; i++) {
134 Expect.listEquals(stack[i], foundStack[i],
135 "Expected stack level $i ${stack[i]}, "
136 "found ${foundStack[i]} in $sb.");
137 }
138 }
139 }
140
141 iterator = new SubclassNodeIterable(world.subclassNode(G)).iterator;
142 checkState(G, currentNode: null, stack: null);
143 Expect.isNull(iterator.current);
144 Expect.isTrue(iterator.moveNext());
145 checkState(G, currentNode: G, stack: []);
146 Expect.equals(G, iterator.current);
147 Expect.isFalse(iterator.moveNext());
148 checkState(G, currentNode: null, stack: []);
149 Expect.isNull(iterator.current);
150
151 iterator = new SubclassNodeIterable(
152 world.subclassNode(G), includeRoot: false).iterator;
153 checkState(G, currentNode: null, stack: null);
154 Expect.isNull(iterator.current);
155 Expect.isFalse(iterator.moveNext());
156 checkState(G, currentNode: null, stack: []);
157 Expect.isNull(iterator.current);
158
159 iterator = new SubclassNodeIterable(world.subclassNode(C)).iterator;
160 checkState(C, currentNode: null, stack: null);
161 Expect.isNull(iterator.current);
162 Expect.isTrue(iterator.moveNext());
163 checkState(C, currentNode: C, stack: [[G, F, E]]);
164 Expect.equals(C, iterator.current);
165 Expect.isTrue(iterator.moveNext());
166 checkState(C, currentNode: G, stack: [[F, E]]);
167 Expect.equals(G, iterator.current);
168 Expect.isTrue(iterator.moveNext());
169 checkState(C, currentNode: F, stack: [[E]]);
170 Expect.equals(F, iterator.current);
171 Expect.isTrue(iterator.moveNext());
172 checkState(C, currentNode: E, stack: []);
173 Expect.equals(E, iterator.current);
174 Expect.isFalse(iterator.moveNext());
175 checkState(C, currentNode: null, stack: []);
176 Expect.isNull(iterator.current);
177
178 iterator = new SubclassNodeIterable(world.subclassNode(D)).iterator;
179 checkState(D, currentNode: null, stack: null);
180 Expect.isNull(iterator.current);
181 Expect.isTrue(iterator.moveNext());
182 checkState(D, currentNode: D, stack: []);
183 Expect.equals(D, iterator.current);
184 Expect.isFalse(iterator.moveNext());
185 checkState(D, currentNode: null, stack: []);
186 Expect.isNull(iterator.current);
187
188 iterator = new SubclassNodeIterable(world.subclassNode(B)).iterator;
189 checkState(B, currentNode: null, stack: null);
190 Expect.isNull(iterator.current);
191 Expect.isTrue(iterator.moveNext());
192 checkState(B, currentNode: B, stack: [[D]]);
193 Expect.equals(B, iterator.current);
194 Expect.isTrue(iterator.moveNext());
195 checkState(B, currentNode: D, stack: []);
196 Expect.equals(D, iterator.current);
197 Expect.isFalse(iterator.moveNext());
198 checkState(B, currentNode: null, stack: []);
199 Expect.isNull(iterator.current);
200
201 iterator = new SubclassNodeIterable(
202 world.subclassNode(B), includeRoot: false).iterator;
203 checkState(B, currentNode: null, stack: null);
204 Expect.isNull(iterator.current);
205 Expect.isTrue(iterator.moveNext());
206 checkState(B, currentNode: D, stack: []);
207 Expect.equals(D, iterator.current);
208 Expect.isFalse(iterator.moveNext());
209 checkState(B, currentNode: null, stack: []);
210 Expect.isNull(iterator.current);
211
212 iterator = new SubclassNodeIterable(
213 world.subclassNode(B), directlyInstantiatedOnly: true).iterator;
214 checkState(B, currentNode: null, stack: null);
215 Expect.isNull(iterator.current);
216 Expect.isTrue(iterator.moveNext());
217 checkState(B, currentNode: D, stack: []);
218 Expect.equals(D, iterator.current);
219 Expect.isFalse(iterator.moveNext());
220 checkState(B, currentNode: null, stack: []);
221 Expect.isNull(iterator.current);
222
223 iterator = new SubclassNodeIterable(world.subclassNode(A)).iterator;
224 checkState(A, currentNode: null, stack: null);
225 Expect.isNull(iterator.current);
226 Expect.isTrue(iterator.moveNext());
227 checkState(A, currentNode: A, stack: [[B, C]]);
228 Expect.equals(A, iterator.current);
229 Expect.isTrue(iterator.moveNext());
230 checkState(A, currentNode: B, stack: [[D], [C]]);
231 Expect.equals(B, iterator.current);
232 Expect.isTrue(iterator.moveNext());
233 checkState(A, currentNode: D, stack: [[C]]);
234 Expect.equals(D, iterator.current);
235 Expect.isTrue(iterator.moveNext());
236 checkState(A, currentNode: C, stack: [[G, F, E]]);
237 Expect.equals(C, iterator.current);
238 Expect.isTrue(iterator.moveNext());
239 checkState(A, currentNode: G, stack: [[F, E]]);
240 Expect.equals(G, iterator.current);
241 Expect.isTrue(iterator.moveNext());
242 checkState(A, currentNode: F, stack: [[E]]);
243 Expect.equals(F, iterator.current);
244 Expect.isTrue(iterator.moveNext());
245 checkState(A, currentNode: E, stack: []);
246 Expect.equals(E, iterator.current);
247 Expect.isFalse(iterator.moveNext());
248 checkState(A, currentNode: null, stack: []);
249 Expect.isNull(iterator.current);
250
251 iterator = new SubclassNodeIterable(
252 world.subclassNode(A), includeRoot: false).iterator;
253 checkState(A, currentNode: null, stack: null);
254 Expect.isNull(iterator.current);
255 Expect.isTrue(iterator.moveNext());
256 checkState(A, currentNode: B, stack: [[D], [C]]);
257 Expect.equals(B, iterator.current);
258 Expect.isTrue(iterator.moveNext());
259 checkState(A, currentNode: D, stack: [[C]]);
260 Expect.equals(D, iterator.current);
261 Expect.isTrue(iterator.moveNext());
262 checkState(A, currentNode: C, stack: [[G, F, E]]);
263 Expect.equals(C, iterator.current);
264 Expect.isTrue(iterator.moveNext());
265 checkState(A, currentNode: G, stack: [[F, E]]);
266 Expect.equals(G, iterator.current);
267 Expect.isTrue(iterator.moveNext());
268 checkState(A, currentNode: F, stack: [[E]]);
269 Expect.equals(F, iterator.current);
270 Expect.isTrue(iterator.moveNext());
271 checkState(A, currentNode: E, stack: []);
272 Expect.equals(E, iterator.current);
273 Expect.isFalse(iterator.moveNext());
274 checkState(A, currentNode: null, stack: []);
275 Expect.isNull(iterator.current);
276
277 iterator = new SubclassNodeIterable(
278 world.subclassNode(A), directlyInstantiatedOnly: true).iterator;
279 checkState(A, currentNode: null, stack: null);
280 Expect.isNull(iterator.current);
281 Expect.isTrue(iterator.moveNext());
282 checkState(A, currentNode: A, stack: [[B, C]]);
283 Expect.equals(A, iterator.current);
284 Expect.isTrue(iterator.moveNext());
285 checkState(A, currentNode: D, stack: [[C]]);
286 Expect.equals(D, iterator.current);
287 Expect.isTrue(iterator.moveNext());
288 checkState(A, currentNode: C, stack: [[G, F, E]]);
289 Expect.equals(C, iterator.current);
290 Expect.isTrue(iterator.moveNext());
291 checkState(A, currentNode: G, stack: [[F, E]]);
292 Expect.equals(G, iterator.current);
293 Expect.isTrue(iterator.moveNext());
294 checkState(A, currentNode: F, stack: [[E]]);
295 Expect.equals(F, iterator.current);
296 Expect.isTrue(iterator.moveNext());
297 checkState(A, currentNode: E, stack: []);
298 Expect.equals(E, iterator.current);
299 Expect.isFalse(iterator.moveNext());
300 checkState(A, currentNode: null, stack: []);
301 Expect.isNull(iterator.current);
302
303 iterator = new SubclassNodeIterable(
304 world.subclassNode(A),
305 includeRoot: false, directlyInstantiatedOnly: true).iterator;
306 checkState(A, currentNode: null, stack: null);
307 Expect.isNull(iterator.current);
308 Expect.isTrue(iterator.moveNext());
309 checkState(A, currentNode: D, stack: [[C]]);
310 Expect.equals(D, iterator.current);
311 Expect.isTrue(iterator.moveNext());
312 checkState(A, currentNode: C, stack: [[G, F, E]]);
313 Expect.equals(C, iterator.current);
314 Expect.isTrue(iterator.moveNext());
315 checkState(A, currentNode: G, stack: [[F, E]]);
316 Expect.equals(G, iterator.current);
317 Expect.isTrue(iterator.moveNext());
318 checkState(A, currentNode: F, stack: [[E]]);
319 Expect.equals(F, iterator.current);
320 Expect.isTrue(iterator.moveNext());
321 checkState(A, currentNode: E, stack: []);
322 Expect.equals(E, iterator.current);
323 Expect.isFalse(iterator.moveNext());
324 checkState(A, currentNode: null, stack: []);
325 Expect.isNull(iterator.current);
326 }));
327 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698