| OLD | NEW |
| (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 } |
| OLD | NEW |