OLD | NEW |
| (Empty) |
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 | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 library test.services.src.search.hierarchy; | |
6 | |
7 import 'dart:async'; | |
8 | |
9 import 'package:analysis_services/index/index.dart'; | |
10 import 'package:analysis_services/index/local_memory_index.dart'; | |
11 import 'package:analysis_services/search/hierarchy.dart'; | |
12 import 'package:analysis_services/src/search/search_engine.dart'; | |
13 import 'package:analysis_testing/abstract_single_unit.dart'; | |
14 import 'package:analysis_testing/reflective_tests.dart'; | |
15 import 'package:analyzer/src/generated/element.dart'; | |
16 import 'package:unittest/unittest.dart'; | |
17 | |
18 | |
19 main() { | |
20 groupSep = ' | '; | |
21 runReflectiveTests(HierarchyTest); | |
22 } | |
23 | |
24 | |
25 @ReflectiveTestCase() | |
26 class HierarchyTest extends AbstractSingleUnitTest { | |
27 Index index; | |
28 SearchEngineImpl searchEngine; | |
29 | |
30 void setUp() { | |
31 super.setUp(); | |
32 index = createLocalMemoryIndex(); | |
33 searchEngine = new SearchEngineImpl(index); | |
34 } | |
35 | |
36 void test_getClassMembers() { | |
37 _indexTestUnit(''' | |
38 class A { | |
39 A() {} | |
40 var ma1; | |
41 ma2() {} | |
42 } | |
43 class B extends A { | |
44 B() {} | |
45 B.named() {} | |
46 var mb1; | |
47 mb2() {} | |
48 } | |
49 '''); | |
50 { | |
51 ClassElement classA = findElement('A'); | |
52 List<Element> members = getClassMembers(classA); | |
53 expect(members.map((e) => e.name), unorderedEquals(['ma1', 'ma2'])); | |
54 } | |
55 { | |
56 ClassElement classB = findElement('B'); | |
57 List<Element> members = getClassMembers(classB); | |
58 expect(members.map((e) => e.name), unorderedEquals(['mb1', 'mb2'])); | |
59 } | |
60 } | |
61 | |
62 Future test_getHierarchyMembers_constructors() { | |
63 _indexTestUnit(''' | |
64 class A { | |
65 A() {} | |
66 } | |
67 class B extends A { | |
68 B() {} | |
69 } | |
70 '''); | |
71 ClassElement classA = findElement("A"); | |
72 ClassElement classB = findElement("B"); | |
73 ClassMemberElement memberA = classA.constructors[0]; | |
74 ClassMemberElement memberB = classB.constructors[0]; | |
75 var futureA = getHierarchyMembers(searchEngine, memberA).then((members) { | |
76 expect(members, unorderedEquals([memberA])); | |
77 }); | |
78 var futureB = getHierarchyMembers(searchEngine, memberB).then((members) { | |
79 expect(members, unorderedEquals([memberB])); | |
80 }); | |
81 return Future.wait([futureA, futureB]); | |
82 } | |
83 | |
84 Future test_getHierarchyMembers_fields() { | |
85 _indexTestUnit(''' | |
86 class A { | |
87 int foo; | |
88 } | |
89 class B extends A { | |
90 get foo => null; | |
91 } | |
92 class C extends B { | |
93 set foo(x) {} | |
94 } | |
95 class D { | |
96 int foo; | |
97 } | |
98 '''); | |
99 ClassElement classA = findElement("A"); | |
100 ClassElement classB = findElement("B"); | |
101 ClassElement classC = findElement("C"); | |
102 ClassElement classD = findElement("D"); | |
103 ClassElement classE = findElement("E"); | |
104 ClassMemberElement memberA = classA.fields[0]; | |
105 ClassMemberElement memberB = classB.fields[0]; | |
106 ClassMemberElement memberC = classC.fields[0]; | |
107 ClassMemberElement memberD = classD.fields[0]; | |
108 var futureA = getHierarchyMembers(searchEngine, memberA).then((members) { | |
109 expect(members, unorderedEquals([memberA, memberB, memberC])); | |
110 }); | |
111 var futureB = getHierarchyMembers(searchEngine, memberB).then((members) { | |
112 expect(members, unorderedEquals([memberA, memberB, memberC])); | |
113 }); | |
114 var futureC = getHierarchyMembers(searchEngine, memberC).then((members) { | |
115 expect(members, unorderedEquals([memberA, memberB, memberC])); | |
116 }); | |
117 var futureD = getHierarchyMembers(searchEngine, memberD).then((members) { | |
118 expect(members, unorderedEquals([memberD])); | |
119 }); | |
120 return Future.wait([futureA, futureB, futureC, futureD]); | |
121 } | |
122 | |
123 Future test_getHierarchyMembers_methods() { | |
124 _indexTestUnit(''' | |
125 class A { | |
126 foo() {} | |
127 } | |
128 class B extends A { | |
129 foo() {} | |
130 } | |
131 class C extends B { | |
132 foo() {} | |
133 } | |
134 class D { | |
135 foo() {} | |
136 } | |
137 class E extends D { | |
138 foo() {} | |
139 } | |
140 '''); | |
141 ClassElement classA = findElement("A"); | |
142 ClassElement classB = findElement("B"); | |
143 ClassElement classC = findElement("C"); | |
144 ClassElement classD = findElement("D"); | |
145 ClassElement classE = findElement("E"); | |
146 ClassMemberElement memberA = classA.methods[0]; | |
147 ClassMemberElement memberB = classB.methods[0]; | |
148 ClassMemberElement memberC = classC.methods[0]; | |
149 ClassMemberElement memberD = classD.methods[0]; | |
150 ClassMemberElement memberE = classE.methods[0]; | |
151 var futureA = getHierarchyMembers(searchEngine, memberA).then((members) { | |
152 expect(members, unorderedEquals([memberA, memberB, memberC])); | |
153 }); | |
154 var futureB = getHierarchyMembers(searchEngine, memberB).then((members) { | |
155 expect(members, unorderedEquals([memberA, memberB, memberC])); | |
156 }); | |
157 var futureC = getHierarchyMembers(searchEngine, memberC).then((members) { | |
158 expect(members, unorderedEquals([memberA, memberB, memberC])); | |
159 }); | |
160 var futureD = getHierarchyMembers(searchEngine, memberD).then((members) { | |
161 expect(members, unorderedEquals([memberD, memberE])); | |
162 }); | |
163 var futureE = getHierarchyMembers(searchEngine, memberE).then((members) { | |
164 expect(members, unorderedEquals([memberD, memberE])); | |
165 }); | |
166 return Future.wait([futureA, futureB, futureC, futureD, futureE]); | |
167 } | |
168 | |
169 Future test_getHierarchyMembers_withInterfaces() { | |
170 _indexTestUnit(''' | |
171 class A { | |
172 foo() {} | |
173 } | |
174 class B implements A { | |
175 foo() {} | |
176 } | |
177 abstract class C implements A { | |
178 } | |
179 class D extends C { | |
180 foo() {} | |
181 } | |
182 class E { | |
183 foo() {} | |
184 } | |
185 '''); | |
186 ClassElement classA = findElement("A"); | |
187 ClassElement classB = findElement("B"); | |
188 ClassElement classC = findElement("C"); | |
189 ClassElement classD = findElement("D"); | |
190 ClassElement classE = findElement("E"); | |
191 ClassMemberElement memberA = classA.methods[0]; | |
192 ClassMemberElement memberB = classB.methods[0]; | |
193 ClassMemberElement memberD = classD.methods[0]; | |
194 var futureA = getHierarchyMembers(searchEngine, memberA).then((members) { | |
195 expect(members, unorderedEquals([memberA, memberB, memberD])); | |
196 }); | |
197 var futureB = getHierarchyMembers(searchEngine, memberB).then((members) { | |
198 expect(members, unorderedEquals([memberA, memberB, memberD])); | |
199 }); | |
200 var futureD = getHierarchyMembers(searchEngine, memberD).then((members) { | |
201 expect(members, unorderedEquals([memberA, memberB, memberD])); | |
202 }); | |
203 return Future.wait([futureA, futureB, futureD]); | |
204 } | |
205 | |
206 void test_getMembers() { | |
207 _indexTestUnit(''' | |
208 class A { | |
209 A() {} | |
210 var ma1; | |
211 ma2() {} | |
212 } | |
213 class B extends A { | |
214 B() {} | |
215 B.named() {} | |
216 var mb1; | |
217 mb2() {} | |
218 } | |
219 '''); | |
220 { | |
221 ClassElement classA = findElement('A'); | |
222 List<Element> members = getMembers(classA); | |
223 expect(members.map((e) => e.name), unorderedEquals(['ma1', 'ma2', '=='])); | |
224 } | |
225 { | |
226 ClassElement classB = findElement('B'); | |
227 List<Element> members = getMembers(classB); | |
228 expect( | |
229 members.map((e) => e.name), | |
230 unorderedEquals(['mb1', 'mb2', 'ma1', 'ma2', '=='])); | |
231 } | |
232 } | |
233 | |
234 Future test_getSubClasses() { | |
235 _indexTestUnit(''' | |
236 class A {} | |
237 class B extends A {} | |
238 class C extends B {} | |
239 class D extends B implements A {} | |
240 class M {} | |
241 class E extends A with M {} | |
242 '''); | |
243 ClassElement classA = findElement("A"); | |
244 ClassElement classB = findElement("B"); | |
245 ClassElement classC = findElement("C"); | |
246 ClassElement classD = findElement("D"); | |
247 ClassElement classM = findElement("M"); | |
248 ClassElement classE = findElement("E"); | |
249 var futureA = getSubClasses(searchEngine, classA).then((subs) { | |
250 expect(subs, unorderedEquals([classB, classC, classD, classE])); | |
251 }); | |
252 var futureB = getSubClasses(searchEngine, classB).then((subs) { | |
253 expect(subs, unorderedEquals([classC, classD])); | |
254 }); | |
255 var futureC = getSubClasses(searchEngine, classC).then((subs) { | |
256 expect(subs, isEmpty); | |
257 }); | |
258 var futureM = getSubClasses(searchEngine, classM).then((subs) { | |
259 expect(subs, unorderedEquals([classE])); | |
260 }); | |
261 return Future.wait([futureA, futureB, futureC, futureM]); | |
262 } | |
263 | |
264 void test_getSuperClasses() { | |
265 _indexTestUnit(''' | |
266 class A {} | |
267 class B extends A {} | |
268 class C extends B {} | |
269 class D extends B implements A {} | |
270 class M {} | |
271 class E extends A with M {} | |
272 class F implements A {} | |
273 '''); | |
274 ClassElement classA = findElement("A"); | |
275 ClassElement classB = findElement("B"); | |
276 ClassElement classC = findElement("C"); | |
277 ClassElement classD = findElement("D"); | |
278 ClassElement classE = findElement("E"); | |
279 ClassElement classF = findElement("F"); | |
280 ClassElement objectElement = classA.supertype.element; | |
281 // Object | |
282 { | |
283 Set<ClassElement> supers = getSuperClasses(objectElement); | |
284 expect(supers, isEmpty); | |
285 } | |
286 // A | |
287 { | |
288 Set<ClassElement> supers = getSuperClasses(classA); | |
289 expect(supers, unorderedEquals([objectElement])); | |
290 } | |
291 // B | |
292 { | |
293 Set<ClassElement> supers = getSuperClasses(classB); | |
294 expect(supers, unorderedEquals([objectElement, classA])); | |
295 } | |
296 // C | |
297 { | |
298 Set<ClassElement> supers = getSuperClasses(classC); | |
299 expect(supers, unorderedEquals([objectElement, classA, classB])); | |
300 } | |
301 // D | |
302 { | |
303 Set<ClassElement> supers = getSuperClasses(classD); | |
304 expect(supers, unorderedEquals([objectElement, classA, classB])); | |
305 } | |
306 // E | |
307 { | |
308 Set<ClassElement> supers = getSuperClasses(classE); | |
309 expect(supers, unorderedEquals([objectElement, classA])); | |
310 } | |
311 // F | |
312 { | |
313 Set<ClassElement> supers = getSuperClasses(classF); | |
314 expect(supers, unorderedEquals([objectElement, classA])); | |
315 } | |
316 } | |
317 | |
318 void _indexTestUnit(String code) { | |
319 resolveTestUnit(code); | |
320 index.indexUnit(context, testUnit); | |
321 } | |
322 } | |
OLD | NEW |