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

Side by Side Diff: pkg/analysis_server/test/services/search/search_engine_test.dart

Issue 1801883002: Remove old index and search implementations. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 9 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
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 test.services.src.search.search_engine; 5 library test.services.src.search.search_engine2;
Brian Wilkerson 2016/03/14 18:57:32 "analysis_server.test.services.search.search_engin
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 8
9 import 'package:analysis_server/src/services/index/index.dart'; 9 import 'package:analysis_server/src/services/index/index.dart';
10 import 'package:analysis_server/src/services/index/local_memory_index.dart';
11 import 'package:analysis_server/src/services/search/search_engine.dart'; 10 import 'package:analysis_server/src/services/search/search_engine.dart';
12 import 'package:analysis_server/src/services/search/search_engine_internal.dart' ; 11 import 'package:analysis_server/src/services/search/search_engine_internal.dart' ;
13 import 'package:analyzer/dart/element/element.dart'; 12 import 'package:analyzer/dart/element/element.dart';
14 import 'package:analyzer/src/dart/element/element.dart'; 13 import 'package:analyzer/src/dart/element/element.dart';
15 import 'package:analyzer/src/dart/element/member.dart'; 14 import 'package:analyzer/src/dart/element/member.dart';
16 import 'package:analyzer/src/generated/source.dart'; 15 import 'package:analyzer/src/generated/source.dart';
17 import 'package:test_reflective_loader/test_reflective_loader.dart'; 16 import 'package:test_reflective_loader/test_reflective_loader.dart';
18 import 'package:unittest/unittest.dart'; 17 import 'package:unittest/unittest.dart';
19 18
20 import '../../abstract_single_unit.dart'; 19 import '../../abstract_single_unit.dart';
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 } 62 }
64 } 63 }
65 64
66 @reflectiveTest 65 @reflectiveTest
67 class SearchEngineImplTest extends AbstractSingleUnitTest { 66 class SearchEngineImplTest extends AbstractSingleUnitTest {
68 Index index; 67 Index index;
69 SearchEngineImpl searchEngine; 68 SearchEngineImpl searchEngine;
70 69
71 void setUp() { 70 void setUp() {
72 super.setUp(); 71 super.setUp();
73 index = createLocalMemoryIndex(); 72 index = createMemoryIndex();
74 searchEngine = new SearchEngineImpl(index); 73 searchEngine = new SearchEngineImpl(index);
75 } 74 }
76 75
77 Future test_searchAllSubtypes() { 76 test_searchAllSubtypes() async {
78 _indexTestUnit(''' 77 _indexTestUnit('''
79 class T {} 78 class T {}
80 class A extends T {} 79 class A extends T {}
81 class B extends A {} 80 class B extends A {}
82 class C implements B {} 81 class C implements B {}
83 '''); 82 ''');
84 ClassElement element = findElement('T'); 83 ClassElement element = findElement('T');
85 ClassElement elementA = findElement('A'); 84 ClassElement elementA = findElement('A');
86 ClassElement elementB = findElement('B'); 85 ClassElement elementB = findElement('B');
87 ClassElement elementC = findElement('C'); 86 ClassElement elementC = findElement('C');
88 var expected = [ 87 var expected = [
89 _expectId(elementA, MatchKind.DECLARATION, 'A extends T'), 88 _expectId(elementA, MatchKind.DECLARATION, 'A extends T'),
90 _expectId(elementB, MatchKind.DECLARATION, 'B extends A'), 89 _expectId(elementB, MatchKind.DECLARATION, 'B extends A'),
91 _expectId(elementC, MatchKind.DECLARATION, 'C implements B') 90 _expectId(elementC, MatchKind.DECLARATION, 'C implements B')
92 ]; 91 ];
93 return searchEngine.searchAllSubtypes(element).then((matches) { 92 List<SearchMatch> matches = await searchEngine.searchAllSubtypes(element);
94 _assertMatches(matches, expected); 93 _assertMatches(matches, expected);
95 });
96 } 94 }
97 95
98 Future test_searchMemberDeclarations() { 96 test_searchMemberDeclarations() async {
99 _indexTestUnit(''' 97 _indexTestUnit('''
100 class A { 98 class A {
101 test() {} 99 test() {}
102 } 100 }
103 class B { 101 class B {
104 int test = 1; 102 int test = 1;
105 main() { 103 main() {
106 int test = 2; 104 int test = 2;
107 } 105 }
108 } 106 }
109 '''); 107 ''');
110 ClassElement elementA = findElement('A'); 108 ClassElement elementA = findElement('A');
111 ClassElement elementB = findElement('B'); 109 ClassElement elementB = findElement('B');
112 var expected = [ 110 var expected = [
113 _expectId(elementA.methods[0], MatchKind.DECLARATION, 'test() {}'), 111 _expectId(elementA.methods[0], MatchKind.DECLARATION, 'test() {}'),
114 _expectId(elementB.fields[0], MatchKind.DECLARATION, 'test = 1;') 112 _expectId(elementB.fields[0], MatchKind.DECLARATION, 'test = 1;')
115 ]; 113 ];
116 return searchEngine.searchMemberDeclarations('test').then((matches) { 114 List<SearchMatch> matches =
117 _assertMatches(matches, expected); 115 await searchEngine.searchMemberDeclarations('test');
118 }); 116 _assertMatches(matches, expected);
119 } 117 }
120 118
121 Future test_searchMemberReferences() { 119 test_searchMemberReferences_qualified_resolved() async {
122 _indexTestUnit(''' 120 _indexTestUnit('''
123 class A { 121 class C {
124 var test; // A 122 var test;
125 mainA() { 123 }
126 test(); // a-inv-r-nq 124 main(C c) {
127 test = 1; // a-write-r-nq 125 print(c.test);
128 test += 2; // a-read-write-r-nq 126 c.test = 1;
129 print(test); // a-read-r-nq 127 c.test += 2;
128 c.test();
129 }
130 ''');
131 List<SearchMatch> matches =
132 await searchEngine.searchMemberReferences('test');
133 expect(matches, isEmpty);
134 }
135
136 test_searchMemberReferences_qualified_unresolved() async {
137 _indexTestUnit('''
138 main(p) {
139 print(p.test);
140 p.test = 1;
141 p.test += 2;
142 p.test();
143 }
144 ''');
145 Element main = findElement('main');
146 var expected = [
147 _expectIdQU(main, MatchKind.READ, 'test);'),
148 _expectIdQU(main, MatchKind.WRITE, 'test = 1;'),
149 _expectIdQU(main, MatchKind.READ_WRITE, 'test += 2;'),
150 _expectIdQU(main, MatchKind.INVOCATION, 'test();'),
151 ];
152 List<SearchMatch> matches =
153 await searchEngine.searchMemberReferences('test');
154 _assertMatches(matches, expected);
155 }
156
157 test_searchMemberReferences_unqualified_resolved() async {
158 _indexTestUnit('''
159 class C {
160 var test;
161 main() {
162 print(test);
163 test = 1;
164 test += 2;
165 test();
130 } 166 }
131 } 167 }
132 main(A a, p) { 168 ''');
133 a.test(); // a-inv-r-q 169 List<SearchMatch> matches =
134 a.test = 1; // a-write-r-q 170 await searchEngine.searchMemberReferences('test');
135 a.test += 2; // a-read-write-r-q 171 expect(matches, isEmpty);
136 print(a.test); // a-read-r-q 172 }
137 p.test(); // p-inv-ur-q 173
138 p.test = 1; // p-write-ur-q 174 test_searchMemberReferences_unqualified_unresolved() async {
139 p.test += 2; // p-read-write-ur-q 175 verifyNoTestUnitErrors = false;
140 print(p.test); // p-read-ur-q 176 _indexTestUnit('''
177 class C {
178 main() {
179 print(test);
180 test = 1;
181 test += 2;
182 test();
183 }
141 } 184 }
142 '''); 185 ''');
143 Element mainA = findElement('mainA');
144 Element main = findElement('main'); 186 Element main = findElement('main');
145 var expected = [ 187 var expected = [
146 _expectId(mainA, MatchKind.INVOCATION, 'test(); // a-inv-r-nq'), 188 _expectIdU(main, MatchKind.READ, 'test);'),
147 _expectId(mainA, MatchKind.WRITE, 'test = 1; // a-write-r-nq'), 189 _expectIdU(main, MatchKind.WRITE, 'test = 1;'),
148 _expectId(mainA, MatchKind.READ_WRITE, 'test += 2; // a-read-write-r-nq'), 190 _expectIdU(main, MatchKind.READ_WRITE, 'test += 2;'),
149 _expectId(mainA, MatchKind.READ, 'test); // a-read-r-nq'), 191 _expectIdU(main, MatchKind.INVOCATION, 'test();'),
150 _expectIdQ(main, MatchKind.INVOCATION, 'test(); // a-inv-r-q'),
151 _expectIdQ(main, MatchKind.WRITE, 'test = 1; // a-write-r-q'),
152 _expectIdQ(main, MatchKind.READ_WRITE, 'test += 2; // a-read-write-r-q'),
153 _expectIdQ(main, MatchKind.READ, 'test); // a-read-r-q'),
154 _expectIdU(main, MatchKind.INVOCATION, 'test(); // p-inv-ur-q'),
155 _expectIdU(main, MatchKind.WRITE, 'test = 1; // p-write-ur-q'),
156 _expectIdU(main, MatchKind.READ_WRITE, 'test += 2; // p-read-write-ur-q'),
157 _expectIdU(main, MatchKind.READ, 'test); // p-read-ur-q'),
158 ]; 192 ];
159 return searchEngine.searchMemberReferences('test').then((matches) { 193 List<SearchMatch> matches =
160 _assertMatches(matches, expected); 194 await searchEngine.searchMemberReferences('test');
161 }); 195 _assertMatches(matches, expected);
162 } 196 }
163 197
164 Future test_searchReferences_ClassElement() { 198 test_searchReferences_ClassElement() async {
165 _indexTestUnit(''' 199 _indexTestUnit('''
166 class A {} 200 class A {}
167 main(A p) { 201 main(A p) {
168 A v; 202 A v;
169 } 203 }
170 '''); 204 ''');
171 ClassElement element = findElement('A'); 205 ClassElement element = findElement('A');
172 Element pElement = findElement('p'); 206 Element pElement = findElement('p');
173 Element vElement = findElement('v'); 207 Element vElement = findElement('v');
174 var expected = [ 208 var expected = [
175 _expectId(pElement, MatchKind.REFERENCE, 'A p'), 209 _expectId(pElement, MatchKind.REFERENCE, 'A p'),
176 _expectId(vElement, MatchKind.REFERENCE, 'A v') 210 _expectId(vElement, MatchKind.REFERENCE, 'A v')
177 ]; 211 ];
178 return _verifyReferences(element, expected); 212 await _verifyReferences(element, expected);
179 } 213 }
180 214
181 Future test_searchReferences_CompilationUnitElement() { 215 test_searchReferences_CompilationUnitElement() async {
182 addSource( 216 addSource(
183 '/my_part.dart', 217 '/my_part.dart',
184 ''' 218 '''
185 part of lib; 219 part of lib;
186 '''); 220 ''');
187 _indexTestUnit(''' 221 _indexTestUnit('''
188 library lib; 222 library lib;
189 part 'my_part.dart'; 223 part 'my_part.dart';
190 '''); 224 ''');
191 CompilationUnitElement element = testLibraryElement.parts[0]; 225 CompilationUnitElement element = testLibraryElement.parts[0];
192 var expected = [ 226 var expected = [
193 _expectId(testUnitElement, MatchKind.REFERENCE, "'my_part.dart'", 227 _expectIdQ(testUnitElement, MatchKind.REFERENCE, "'my_part.dart'",
194 length: "'my_part.dart'".length) 228 length: "'my_part.dart'".length)
195 ]; 229 ];
196 return _verifyReferences(element, expected); 230 await _verifyReferences(element, expected);
197 } 231 }
198 232
199 Future test_searchReferences_ConstructorElement() { 233 test_searchReferences_ConstructorElement() async {
200 _indexTestUnit(''' 234 _indexTestUnit('''
201 class A { 235 class A {
202 A.named() {} 236 A.named() {}
203 } 237 }
204 main() { 238 main() {
205 new A.named(); 239 new A.named();
206 } 240 }
207 '''); 241 ''');
208 ConstructorElement element = findElement('named'); 242 ConstructorElement element = findElement('named');
209 Element mainElement = findElement('main'); 243 Element mainElement = findElement('main');
210 var expected = [ 244 var expected = [
211 _expectId(mainElement, MatchKind.REFERENCE, '.named();', length: 6) 245 _expectIdQ(mainElement, MatchKind.REFERENCE, '.named();', length: 6)
212 ]; 246 ];
213 return _verifyReferences(element, expected); 247 await _verifyReferences(element, expected);
214 } 248 }
215 249
216 Future test_searchReferences_Element_unknown() { 250 test_searchReferences_ConstructorElement_synthetic() async {
217 return _verifyReferences(DynamicElementImpl.instance, []); 251 _indexTestUnit('''
252 class A {
253 }
254 main() {
255 new A();
256 }
257 ''');
258 ClassElement classElement = findElement('A');
259 ConstructorElement element = classElement.unnamedConstructor;
260 Element mainElement = findElement('main');
261 var expected = [
262 _expectIdQ(mainElement, MatchKind.REFERENCE, '();', length: 0)
263 ];
264 await _verifyReferences(element, expected);
218 } 265 }
219 266
220 Future test_searchReferences_FieldElement() { 267 test_searchReferences_Element_unknown() async {
268 await _verifyReferences(DynamicElementImpl.instance, []);
269 }
270
271 test_searchReferences_FieldElement() async {
221 _indexTestUnit(''' 272 _indexTestUnit('''
222 class A { 273 class A {
223 var field; 274 var field;
224 A({this.field}); 275 A({this.field});
225 main() { 276 main() {
226 new A(field: 1); 277 new A(field: 1);
227 // getter 278 // getter
228 print(field); // ref-nq 279 print(field); // ref-nq
229 print(this.field); // ref-q 280 print(this.field); // ref-q
230 field(); // inv-nq 281 field(); // inv-nq
231 this.field(); // inv-q 282 this.field(); // inv-q
232 // setter 283 // setter
233 field = 2; // ref-nq; 284 field = 2; // ref-nq;
234 this.field = 3; // ref-q; 285 this.field = 3; // ref-q;
235 } 286 }
236 } 287 }
237 '''); 288 ''');
238 FieldElement element = findElement('field'); 289 FieldElement element = findElement('field');
239 Element main = findElement('main'); 290 Element main = findElement('main');
240 Element fieldParameter = findElement('field', ElementKind.PARAMETER); 291 Element fieldParameter = findElement('field', ElementKind.PARAMETER);
241 var expected = [ 292 var expected = [
242 _expectId(fieldParameter, MatchKind.WRITE, 'field}'), 293 _expectIdQ(fieldParameter, MatchKind.WRITE, 'field}'),
243 _expectId(main, MatchKind.REFERENCE, 'field: 1'), 294 _expectIdQ(main, MatchKind.REFERENCE, 'field: 1'),
244 _expectId(main, MatchKind.READ, 'field); // ref-nq'), 295 _expectId(main, MatchKind.READ, 'field); // ref-nq'),
245 _expectIdQ(main, MatchKind.READ, 'field); // ref-q'), 296 _expectIdQ(main, MatchKind.READ, 'field); // ref-q'),
246 _expectId(main, MatchKind.INVOCATION, 'field(); // inv-nq'), 297 _expectId(main, MatchKind.INVOCATION, 'field(); // inv-nq'),
247 _expectIdQ(main, MatchKind.INVOCATION, 'field(); // inv-q'), 298 _expectIdQ(main, MatchKind.INVOCATION, 'field(); // inv-q'),
248 _expectId(main, MatchKind.WRITE, 'field = 2; // ref-nq'), 299 _expectId(main, MatchKind.WRITE, 'field = 2; // ref-nq'),
249 _expectIdQ(main, MatchKind.WRITE, 'field = 3; // ref-q'), 300 _expectIdQ(main, MatchKind.WRITE, 'field = 3; // ref-q'),
250 ]; 301 ];
251 return _verifyReferences(element, expected); 302 await _verifyReferences(element, expected);
252 } 303 }
253 304
254 Future test_searchReferences_FunctionElement() { 305 test_searchReferences_FieldElement_ofEnum() async {
306 _indexTestUnit('''
307 enum MyEnum {
308 A, B, C
309 }
310 main() {
311 print(MyEnum.A.index);
312 print(MyEnum.values);
313 print(MyEnum.A);
314 print(MyEnum.B);
315 }
316 ''');
317 ClassElement enumElement = findElement('MyEnum');
318 Element mainElement = findElement('main');
319 await _verifyReferences(enumElement.getField('index'),
320 [_expectIdQ(mainElement, MatchKind.READ, 'index);')]);
321 await _verifyReferences(enumElement.getField('values'),
322 [_expectIdQ(mainElement, MatchKind.READ, 'values);')]);
323 await _verifyReferences(enumElement.getField('A'), [
324 _expectIdQ(mainElement, MatchKind.READ, 'A.index);'),
325 _expectIdQ(mainElement, MatchKind.READ, 'A);')
326 ]);
327 await _verifyReferences(enumElement.getField('B'),
328 [_expectIdQ(mainElement, MatchKind.READ, 'B);')]);
329 }
330
331 test_searchReferences_FieldElement_synthetic() async {
332 _indexTestUnit('''
333 class A {
334 get field => null;
335 set field(x) {}
336 main() {
337 // getter
338 print(field); // ref-nq
339 print(this.field); // ref-q
340 field(); // inv-nq
341 this.field(); // inv-q
342 // setter
343 field = 2; // ref-nq;
344 this.field = 3; // ref-q;
345 }
346 }
347 ''');
348 FieldElement element = findElement('field', ElementKind.FIELD);
349 Element main = findElement('main');
350 var expected = [
351 _expectId(main, MatchKind.READ, 'field); // ref-nq'),
352 _expectIdQ(main, MatchKind.READ, 'field); // ref-q'),
353 _expectId(main, MatchKind.INVOCATION, 'field(); // inv-nq'),
354 _expectIdQ(main, MatchKind.INVOCATION, 'field(); // inv-q'),
355 _expectId(main, MatchKind.WRITE, 'field = 2; // ref-nq'),
356 _expectIdQ(main, MatchKind.WRITE, 'field = 3; // ref-q'),
357 ];
358 await _verifyReferences(element, expected);
359 }
360
361 test_searchReferences_FunctionElement() async {
255 _indexTestUnit(''' 362 _indexTestUnit('''
256 test() {} 363 test() {}
257 main() { 364 main() {
258 test(); 365 test();
259 print(test); 366 print(test);
260 } 367 }
261 '''); 368 ''');
262 FunctionElement element = findElement('test'); 369 FunctionElement element = findElement('test');
263 Element mainElement = findElement('main'); 370 Element mainElement = findElement('main');
264 var expected = [ 371 var expected = [
265 _expectId(mainElement, MatchKind.INVOCATION, 'test();'), 372 _expectId(mainElement, MatchKind.INVOCATION, 'test();'),
266 _expectId(mainElement, MatchKind.REFERENCE, 'test);') 373 _expectId(mainElement, MatchKind.REFERENCE, 'test);')
267 ]; 374 ];
268 return _verifyReferences(element, expected); 375 await _verifyReferences(element, expected);
269 } 376 }
270 377
271 Future test_searchReferences_FunctionTypeAliasElement() { 378 test_searchReferences_FunctionElement_local() async {
379 _indexTestUnit('''
380 main() {
381 test() {}
382 test();
383 print(test);
384 }
385 ''');
386 FunctionElement element = findElement('test');
387 Element mainElement = findElement('main');
388 var expected = [
389 _expectId(mainElement, MatchKind.INVOCATION, 'test();'),
390 _expectId(mainElement, MatchKind.REFERENCE, 'test);')
391 ];
392 await _verifyReferences(element, expected);
393 }
394
395 test_searchReferences_FunctionTypeAliasElement() async {
272 _indexTestUnit(''' 396 _indexTestUnit('''
273 typedef Test(); 397 typedef Test();
274 main() { 398 main() {
275 Test a; 399 Test a;
276 Test b; 400 Test b;
277 } 401 }
278 '''); 402 ''');
279 FunctionTypeAliasElement element = findElement('Test'); 403 FunctionTypeAliasElement element = findElement('Test');
280 Element aElement = findElement('a'); 404 Element aElement = findElement('a');
281 Element bElement = findElement('b'); 405 Element bElement = findElement('b');
282 var expected = [ 406 var expected = [
283 _expectId(aElement, MatchKind.REFERENCE, 'Test a;'), 407 _expectId(aElement, MatchKind.REFERENCE, 'Test a;'),
284 _expectId(bElement, MatchKind.REFERENCE, 'Test b;') 408 _expectId(bElement, MatchKind.REFERENCE, 'Test b;')
285 ]; 409 ];
286 return _verifyReferences(element, expected); 410 await _verifyReferences(element, expected);
287 } 411 }
288 412
289 Future test_searchReferences_ImportElement_noPrefix() { 413 test_searchReferences_ImportElement_noPrefix() async {
290 _indexTestUnit(''' 414 _indexTestUnit('''
291 import 'dart:math'; 415 import 'dart:math' show max, PI, Random hide min;
416 export 'dart:math' show max, PI, Random hide min;
292 main() { 417 main() {
293 print(E); 418 print(PI);
419 print(new Random());
420 print(max(1, 2));
294 } 421 }
422 Random bar() => null;
295 '''); 423 ''');
296 ImportElement element = testLibraryElement.imports[0]; 424 ImportElement element = testLibraryElement.imports[0];
297 Element mainElement = findElement('main'); 425 Element mainElement = findElement('main');
426 Element barElement = findElement('bar');
298 var kind = MatchKind.REFERENCE; 427 var kind = MatchKind.REFERENCE;
299 var expected = [_expectId(mainElement, kind, 'E);', length: 0)]; 428 var expected = [
300 return _verifyReferences(element, expected); 429 _expectId(mainElement, kind, 'PI);', length: 0),
430 _expectId(mainElement, kind, 'Random()', length: 0),
431 _expectId(mainElement, kind, 'max(', length: 0),
432 _expectId(barElement, kind, 'Random bar()', length: 0),
433 ];
434 await _verifyReferences(element, expected);
301 } 435 }
302 436
303 Future test_searchReferences_ImportElement_withPrefix() { 437 test_searchReferences_ImportElement_withPrefix() async {
304 _indexTestUnit(''' 438 _indexTestUnit('''
305 import 'dart:math' as math; 439 import 'dart:math' as math show max, PI, Random hide min;
440 export 'dart:math' show max, PI, Random hide min;
306 main() { 441 main() {
307 print(math.PI); 442 print(math.PI);
443 print(new math.Random());
444 print(math.max(1, 2));
308 } 445 }
446 math.Random bar() => null;
309 '''); 447 ''');
310 ImportElement element = testLibraryElement.imports[0]; 448 ImportElement element = testLibraryElement.imports[0];
311 Element mainElement = findElement('main'); 449 Element mainElement = findElement('main');
450 Element barElement = findElement('bar');
312 var kind = MatchKind.REFERENCE; 451 var kind = MatchKind.REFERENCE;
452 var length = 'math.'.length;
313 var expected = [ 453 var expected = [
314 _expectId(mainElement, kind, 'math.PI);', length: 'math.'.length) 454 _expectId(mainElement, kind, 'math.PI);', length: length),
455 _expectId(mainElement, kind, 'math.Random()', length: length),
456 _expectId(mainElement, kind, 'math.max(', length: length),
457 _expectId(barElement, kind, 'math.Random bar()', length: length),
315 ]; 458 ];
316 return _verifyReferences(element, expected); 459 await _verifyReferences(element, expected);
317 } 460 }
318 461
319 Future test_searchReferences_LabelElement() { 462 test_searchReferences_LabelElement() async {
320 _indexTestUnit(''' 463 _indexTestUnit('''
321 main() { 464 main() {
322 label: 465 label:
323 while (true) { 466 while (true) {
324 if (true) { 467 if (true) {
325 break label; // 1 468 break label; // 1
326 } 469 }
327 break label; // 2 470 break label; // 2
328 } 471 }
329 } 472 }
330 '''); 473 ''');
331 LabelElement element = findElement('label'); 474 LabelElement element = findElement('label');
332 Element mainElement = findElement('main'); 475 Element mainElement = findElement('main');
333 var expected = [ 476 var expected = [
334 _expectId(mainElement, MatchKind.REFERENCE, 'label; // 1'), 477 _expectId(mainElement, MatchKind.REFERENCE, 'label; // 1'),
335 _expectId(mainElement, MatchKind.REFERENCE, 'label; // 2') 478 _expectId(mainElement, MatchKind.REFERENCE, 'label; // 2')
336 ]; 479 ];
337 return _verifyReferences(element, expected); 480 await _verifyReferences(element, expected);
338 } 481 }
339 482
340 Future test_searchReferences_LibraryElement() { 483 test_searchReferences_LibraryElement() async {
341 var codeA = 'part of lib; // A'; 484 var codeA = 'part of lib; // A';
342 var codeB = 'part of lib; // B'; 485 var codeB = 'part of lib; // B';
343 addSource('/unitA.dart', codeA); 486 addSource('/unitA.dart', codeA);
344 addSource('/unitB.dart', codeB); 487 addSource('/unitB.dart', codeB);
345 _indexTestUnit(''' 488 _indexTestUnit('''
346 library lib; 489 library lib;
347 part 'unitA.dart'; 490 part 'unitA.dart';
348 part 'unitB.dart'; 491 part 'unitB.dart';
349 '''); 492 ''');
350 LibraryElement element = testLibraryElement; 493 LibraryElement element = testLibraryElement;
351 CompilationUnitElement elementA = element.parts[0]; 494 CompilationUnitElement unitElementA = element.parts[0];
352 CompilationUnitElement elementB = element.parts[1]; 495 CompilationUnitElement unitElementB = element.parts[1];
353 index.index(context, elementA.computeNode()); 496 index.indexUnit(unitElementA.computeNode());
354 index.index(context, elementB.computeNode()); 497 index.indexUnit(unitElementB.computeNode());
355 var expected = [ 498 var expected = [
356 new ExpectedMatch(elementA, MatchKind.REFERENCE, 499 new ExpectedMatch(unitElementA, MatchKind.REFERENCE,
357 codeA.indexOf('lib; // A'), 'lib'.length), 500 codeA.indexOf('lib; // A'), 'lib'.length),
358 new ExpectedMatch(elementB, MatchKind.REFERENCE, 501 new ExpectedMatch(unitElementB, MatchKind.REFERENCE,
359 codeB.indexOf('lib; // B'), 'lib'.length), 502 codeB.indexOf('lib; // B'), 'lib'.length),
360 ]; 503 ];
361 return _verifyReferences(element, expected); 504 await _verifyReferences(element, expected);
362 } 505 }
363 506
364 Future test_searchReferences_LocalVariableElement() { 507 test_searchReferences_LocalVariableElement() async {
365 _indexTestUnit(''' 508 _indexTestUnit('''
366 main() { 509 main() {
367 var v; 510 var v;
368 v = 1; 511 v = 1;
369 v += 2; 512 v += 2;
370 print(v); 513 print(v);
371 v(); 514 v();
372 } 515 }
373 '''); 516 ''');
374 LocalVariableElement element = findElement('v'); 517 LocalVariableElement element = findElement('v');
375 Element mainElement = findElement('main'); 518 Element mainElement = findElement('main');
376 var expected = [ 519 var expected = [
377 _expectId(mainElement, MatchKind.WRITE, 'v = 1;'), 520 _expectId(mainElement, MatchKind.WRITE, 'v = 1;'),
378 _expectId(mainElement, MatchKind.READ_WRITE, 'v += 2;'), 521 _expectId(mainElement, MatchKind.READ_WRITE, 'v += 2;'),
379 _expectId(mainElement, MatchKind.READ, 'v);'), 522 _expectId(mainElement, MatchKind.READ, 'v);'),
380 _expectId(mainElement, MatchKind.INVOCATION, 'v();') 523 _expectId(mainElement, MatchKind.INVOCATION, 'v();')
381 ]; 524 ];
382 return _verifyReferences(element, expected); 525 await _verifyReferences(element, expected);
383 } 526 }
384 527
385 Future test_searchReferences_MethodElement() { 528 test_searchReferences_MethodElement() async {
386 _indexTestUnit(''' 529 _indexTestUnit('''
387 class A { 530 class A {
388 m() {} 531 m() {}
389 main() { 532 main() {
390 m(); // 1 533 m(); // 1
391 this.m(); // 2 534 this.m(); // 2
392 print(m); // 3 535 print(m); // 3
393 print(this.m); // 4 536 print(this.m); // 4
394 } 537 }
395 } 538 }
396 '''); 539 ''');
397 MethodElement method = findElement('m'); 540 MethodElement method = findElement('m');
398 Element mainElement = findElement('main'); 541 Element mainElement = findElement('main');
399 var expected = [ 542 var expected = [
400 _expectId(mainElement, MatchKind.INVOCATION, 'm(); // 1'), 543 _expectId(mainElement, MatchKind.INVOCATION, 'm(); // 1'),
401 _expectIdQ(mainElement, MatchKind.INVOCATION, 'm(); // 2'), 544 _expectIdQ(mainElement, MatchKind.INVOCATION, 'm(); // 2'),
402 _expectId(mainElement, MatchKind.REFERENCE, 'm); // 3'), 545 _expectId(mainElement, MatchKind.REFERENCE, 'm); // 3'),
403 _expectIdQ(mainElement, MatchKind.REFERENCE, 'm); // 4') 546 _expectIdQ(mainElement, MatchKind.REFERENCE, 'm); // 4')
404 ]; 547 ];
405 return _verifyReferences(method, expected); 548 await _verifyReferences(method, expected);
406 } 549 }
407 550
408 Future test_searchReferences_MethodMember() { 551 test_searchReferences_MethodMember() async {
409 _indexTestUnit(''' 552 _indexTestUnit('''
410 class A<T> { 553 class A<T> {
411 T m() => null; 554 T m() => null;
412 } 555 }
413 main(A<int> a) { 556 main(A<int> a) {
414 a.m(); // ref 557 a.m(); // ref
415 } 558 }
416 '''); 559 ''');
417 MethodMember method = findNodeElementAtString('m(); // ref'); 560 MethodMember method = findNodeElementAtString('m(); // ref');
418 Element mainElement = findElement('main'); 561 Element mainElement = findElement('main');
419 var expected = [ 562 var expected = [
420 _expectIdQ(mainElement, MatchKind.INVOCATION, 'm(); // ref') 563 _expectIdQ(mainElement, MatchKind.INVOCATION, 'm(); // ref')
421 ]; 564 ];
422 return _verifyReferences(method, expected); 565 await _verifyReferences(method, expected);
423 } 566 }
424 567
425 Future test_searchReferences_ParameterElement() { 568 test_searchReferences_ParameterElement_ofLocalFunction() async {
569 _indexTestUnit('''
570 main() {
571 foo({p}) {
572 p = 1;
573 p += 2;
574 print(p);
575 p();
576 }
577 foo(p: 42);
578 }
579 ''');
580 ParameterElement element = findElement('p');
581 Element fooElement = findElement('foo');
582 Element mainElement = findElement('main');
583 var expected = [
584 _expectId(fooElement, MatchKind.WRITE, 'p = 1;'),
585 _expectId(fooElement, MatchKind.READ_WRITE, 'p += 2;'),
586 _expectId(fooElement, MatchKind.READ, 'p);'),
587 _expectId(fooElement, MatchKind.INVOCATION, 'p();'),
588 _expectIdQ(mainElement, MatchKind.REFERENCE, 'p: 42')
589 ];
590 await _verifyReferences(element, expected);
591 }
592
593 test_searchReferences_ParameterElement_ofMethod() async {
594 _indexTestUnit('''
595 class C {
596 foo({p}) {
597 p = 1;
598 p += 2;
599 print(p);
600 p();
601 }
602 }
603 main(C c) {
604 c.foo(p: 42);
605 }
606 ''');
607 ParameterElement element = findElement('p');
608 Element fooElement = findElement('foo');
609 Element mainElement = findElement('main');
610 var expected = [
611 _expectId(fooElement, MatchKind.WRITE, 'p = 1;'),
612 _expectId(fooElement, MatchKind.READ_WRITE, 'p += 2;'),
613 _expectId(fooElement, MatchKind.READ, 'p);'),
614 _expectId(fooElement, MatchKind.INVOCATION, 'p();'),
615 _expectIdQ(mainElement, MatchKind.REFERENCE, 'p: 42')
616 ];
617 await _verifyReferences(element, expected);
618 }
619
620 test_searchReferences_ParameterElement_ofTopLevelFunction() async {
426 _indexTestUnit(''' 621 _indexTestUnit('''
427 foo({p}) { 622 foo({p}) {
428 p = 1; 623 p = 1;
429 p += 2; 624 p += 2;
430 print(p); 625 print(p);
431 p(); 626 p();
432 } 627 }
433 main() { 628 main() {
434 foo(p: 42); 629 foo(p: 42);
435 } 630 }
436 '''); 631 ''');
437 ParameterElement element = findElement('p'); 632 ParameterElement element = findElement('p');
438 Element fooElement = findElement('foo'); 633 Element fooElement = findElement('foo');
439 Element mainElement = findElement('main'); 634 Element mainElement = findElement('main');
440 var expected = [ 635 var expected = [
441 _expectId(fooElement, MatchKind.WRITE, 'p = 1;'), 636 _expectId(fooElement, MatchKind.WRITE, 'p = 1;'),
442 _expectId(fooElement, MatchKind.READ_WRITE, 'p += 2;'), 637 _expectId(fooElement, MatchKind.READ_WRITE, 'p += 2;'),
443 _expectId(fooElement, MatchKind.READ, 'p);'), 638 _expectId(fooElement, MatchKind.READ, 'p);'),
444 _expectId(fooElement, MatchKind.INVOCATION, 'p();'), 639 _expectId(fooElement, MatchKind.INVOCATION, 'p();'),
445 _expectId(mainElement, MatchKind.REFERENCE, 'p: 42') 640 _expectIdQ(mainElement, MatchKind.REFERENCE, 'p: 42')
446 ]; 641 ];
447 return _verifyReferences(element, expected); 642 await _verifyReferences(element, expected);
448 } 643 }
449 644
450 Future test_searchReferences_PrefixElement() { 645 test_searchReferences_PrefixElement() async {
451 _indexTestUnit(''' 646 _indexTestUnit('''
452 import 'dart:async' as ppp; 647 import 'dart:async' as ppp;
453 main() { 648 main() {
454 ppp.Future a; 649 ppp.Future a;
455 ppp.Stream b; 650 ppp.Stream b;
456 } 651 }
457 '''); 652 ''');
458 PrefixElement element = findNodeElementAtString('ppp;'); 653 PrefixElement element = findNodeElementAtString('ppp;');
459 Element elementA = findElement('a'); 654 Element elementA = findElement('a');
460 Element elementB = findElement('b'); 655 Element elementB = findElement('b');
461 var expected = [ 656 var expected = [
462 _expectId(elementA, MatchKind.REFERENCE, 'ppp.Future'), 657 _expectId(elementA, MatchKind.REFERENCE, 'ppp.Future'),
463 _expectId(elementB, MatchKind.REFERENCE, 'ppp.Stream') 658 _expectId(elementB, MatchKind.REFERENCE, 'ppp.Stream')
464 ]; 659 ];
465 return _verifyReferences(element, expected); 660 await _verifyReferences(element, expected);
466 } 661 }
467 662
468 Future test_searchReferences_PropertyAccessorElement_getter() { 663 test_searchReferences_PropertyAccessorElement_getter() async {
469 _indexTestUnit(''' 664 _indexTestUnit('''
470 class A { 665 class A {
471 get g => null; 666 get ggg => null;
472 main() { 667 main() {
473 g; // 1 668 print(ggg); // ref-nq
474 this.g; // 2 669 print(this.ggg); // ref-q
670 ggg(); // inv-nq
671 this.ggg(); // inv-q
475 } 672 }
476 } 673 }
477 '''); 674 ''');
478 PropertyAccessorElement element = findElement('g', ElementKind.GETTER); 675 PropertyAccessorElement element = findElement('ggg', ElementKind.GETTER);
479 Element mainElement = findElement('main'); 676 Element main = findElement('main');
480 var expected = [ 677 var expected = [
481 _expectId(mainElement, MatchKind.REFERENCE, 'g; // 1'), 678 _expectId(main, MatchKind.REFERENCE, 'ggg); // ref-nq'),
482 _expectIdQ(mainElement, MatchKind.REFERENCE, 'g; // 2') 679 _expectIdQ(main, MatchKind.REFERENCE, 'ggg); // ref-q'),
680 _expectId(main, MatchKind.INVOCATION, 'ggg(); // inv-nq'),
681 _expectIdQ(main, MatchKind.INVOCATION, 'ggg(); // inv-q'),
483 ]; 682 ];
484 return _verifyReferences(element, expected); 683 await _verifyReferences(element, expected);
485 } 684 }
486 685
487 Future test_searchReferences_PropertyAccessorElement_setter() { 686 test_searchReferences_PropertyAccessorElement_setter() async {
488 _indexTestUnit(''' 687 _indexTestUnit('''
489 class A { 688 class A {
490 set s(x) {} 689 set s(x) {}
491 main() { 690 main() {
492 s = 1; 691 s = 1;
493 this.s = 2; 692 this.s = 2;
494 } 693 }
495 } 694 }
496 '''); 695 ''');
497 PropertyAccessorElement element = findElement('s='); 696 PropertyAccessorElement element = findElement('s=');
498 Element mainElement = findElement('main'); 697 Element mainElement = findElement('main');
499 var expected = [ 698 var expected = [
500 _expectId(mainElement, MatchKind.REFERENCE, 's = 1'), 699 _expectId(mainElement, MatchKind.REFERENCE, 's = 1'),
501 _expectIdQ(mainElement, MatchKind.REFERENCE, 's = 2') 700 _expectIdQ(mainElement, MatchKind.REFERENCE, 's = 2')
502 ]; 701 ];
503 return _verifyReferences(element, expected); 702 await _verifyReferences(element, expected);
504 } 703 }
505 704
506 Future test_searchReferences_TopLevelVariableElement() { 705 test_searchReferences_TopLevelVariableElement() async {
507 addSource( 706 addSource(
508 '/lib.dart', 707 '/lib.dart',
509 ''' 708 '''
510 library lib; 709 library lib;
511 var V; 710 var V;
512 '''); 711 ''');
513 _indexTestUnit(''' 712 _indexTestUnit('''
514 import 'lib.dart' show V; // imp 713 import 'lib.dart' show V; // imp
515 import 'lib.dart' as pref; 714 import 'lib.dart' as pref;
516 main() { 715 main() {
517 pref.V = 1; // q 716 pref.V = 1; // q
518 print(pref.V); // q 717 print(pref.V); // q
519 pref.V(); // q 718 pref.V(); // q
520 V = 1; // nq 719 V = 1; // nq
521 print(V); // nq 720 print(V); // nq
522 V(); // nq 721 V(); // nq
523 } 722 }
524 '''); 723 ''');
525 ImportElement importElement = testLibraryElement.imports[0]; 724 ImportElement importElement = testLibraryElement.imports[0];
526 CompilationUnitElement impUnit = 725 CompilationUnitElement impUnit =
527 importElement.importedLibrary.definingCompilationUnit; 726 importElement.importedLibrary.definingCompilationUnit;
528 TopLevelVariableElement variable = impUnit.topLevelVariables[0]; 727 TopLevelVariableElement variable = impUnit.topLevelVariables[0];
529 Element main = findElement('main'); 728 Element main = findElement('main');
530 var expected = [ 729 var expected = [
531 _expectId(testUnitElement, MatchKind.REFERENCE, 'V; // imp'), 730 _expectIdQ(testUnitElement, MatchKind.REFERENCE, 'V; // imp'),
532 _expectId(main, MatchKind.WRITE, 'V = 1; // q'), 731 _expectIdQ(main, MatchKind.WRITE, 'V = 1; // q'),
533 _expectId(main, MatchKind.READ, 'V); // q'), 732 _expectIdQ(main, MatchKind.READ, 'V); // q'),
534 _expectId(main, MatchKind.INVOCATION, 'V(); // q'), 733 _expectIdQ(main, MatchKind.INVOCATION, 'V(); // q'),
535 _expectId(main, MatchKind.WRITE, 'V = 1; // nq'), 734 _expectId(main, MatchKind.WRITE, 'V = 1; // nq'),
536 _expectId(main, MatchKind.READ, 'V); // nq'), 735 _expectId(main, MatchKind.READ, 'V); // nq'),
537 _expectId(main, MatchKind.INVOCATION, 'V(); // nq'), 736 _expectId(main, MatchKind.INVOCATION, 'V(); // nq'),
538 ]; 737 ];
539 return _verifyReferences(variable, expected); 738 await _verifyReferences(variable, expected);
540 } 739 }
541 740
542 Future test_searchReferences_TypeParameterElement() { 741 test_searchReferences_TypeParameterElement() async {
543 _indexTestUnit(''' 742 _indexTestUnit('''
544 class A<T> { 743 class A<T> {
545 main(T a, T b) {} 744 main(T a, T b) {}
546 } 745 }
547 '''); 746 ''');
548 TypeParameterElement element = findElement('T'); 747 TypeParameterElement element = findElement('T');
549 Element aElement = findElement('a'); 748 Element aElement = findElement('a');
550 Element bElement = findElement('b'); 749 Element bElement = findElement('b');
551 var expected = [ 750 var expected = [
552 _expectId(aElement, MatchKind.REFERENCE, 'T a'), 751 _expectId(aElement, MatchKind.REFERENCE, 'T a'),
553 _expectId(bElement, MatchKind.REFERENCE, 'T b') 752 _expectId(bElement, MatchKind.REFERENCE, 'T b')
554 ]; 753 ];
555 return _verifyReferences(element, expected); 754 await _verifyReferences(element, expected);
556 } 755 }
557 756
558 Future test_searchSubtypes() { 757 test_searchSubtypes() async {
559 _indexTestUnit(''' 758 _indexTestUnit('''
560 class T {} 759 class T {}
561 class A extends T {} // A 760 class A extends T {} // A
562 class B = Object with T; // B 761 class B = Object with T; // B
563 class C implements T {} // C 762 class C implements T {} // C
564 '''); 763 ''');
565 ClassElement element = findElement('T'); 764 ClassElement element = findElement('T');
566 ClassElement elementA = findElement('A'); 765 ClassElement elementA = findElement('A');
567 ClassElement elementB = findElement('B'); 766 ClassElement elementB = findElement('B');
568 ClassElement elementC = findElement('C'); 767 ClassElement elementC = findElement('C');
569 var expected = [ 768 var expected = [
570 _expectId(elementA, MatchKind.REFERENCE, 'T {} // A'), 769 _expectId(elementA, MatchKind.REFERENCE, 'T {} // A'),
571 _expectId(elementB, MatchKind.REFERENCE, 'T; // B'), 770 _expectId(elementB, MatchKind.REFERENCE, 'T; // B'),
572 _expectId(elementC, MatchKind.REFERENCE, 'T {} // C') 771 _expectId(elementC, MatchKind.REFERENCE, 'T {} // C')
573 ]; 772 ];
574 return searchEngine.searchSubtypes(element).then((matches) { 773 List<SearchMatch> matches = await searchEngine.searchSubtypes(element);
575 _assertMatches(matches, expected); 774 _assertMatches(matches, expected);
576 });
577 } 775 }
578 776
579 Future test_searchTopLevelDeclarations() { 777 test_searchTopLevelDeclarations() async {
580 _indexTestUnit(''' 778 _indexTestUnit('''
581 class A {} // A 779 class A {} // A
582 class B = Object with A; 780 class B = Object with A;
583 typedef C(); 781 typedef C();
584 D() {} 782 D() {}
585 var E = null; 783 var E = null;
586 class NoMatchABCDE {} 784 class NoMatchABCDE {}
587 '''); 785 ''');
588 Element topA = findElement('A'); 786 Element topA = findElement('A');
589 Element topB = findElement('B'); 787 Element topB = findElement('B');
590 Element topC = findElement('C'); 788 Element topC = findElement('C');
591 Element topD = findElement('D'); 789 Element topD = findElement('D');
592 Element topE = findElement('E'); 790 Element topE = findElement('E');
593 var expected = [ 791 var expected = [
594 _expectId(topA, MatchKind.DECLARATION, 'A {} // A'), 792 _expectId(topA, MatchKind.DECLARATION, 'A {} // A'),
595 _expectId(topB, MatchKind.DECLARATION, 'B ='), 793 _expectId(topB, MatchKind.DECLARATION, 'B ='),
596 _expectId(topC, MatchKind.DECLARATION, 'C()'), 794 _expectId(topC, MatchKind.DECLARATION, 'C()'),
597 _expectId(topD, MatchKind.DECLARATION, 'D() {}'), 795 _expectId(topD, MatchKind.DECLARATION, 'D() {}'),
598 _expectId(topE, MatchKind.DECLARATION, 'E = null') 796 _expectId(topE, MatchKind.DECLARATION, 'E = null')
599 ]; 797 ];
600 return _verifyTopLevelDeclarations('^[A-E]\$', expected); 798 List<SearchMatch> matches =
799 await searchEngine.searchTopLevelDeclarations(r'^[A-E]$');
800 _assertMatches(matches, expected);
601 } 801 }
602 802
603 ExpectedMatch _expectId(Element element, MatchKind kind, String search, 803 ExpectedMatch _expectId(Element element, MatchKind kind, String search,
604 {int length, bool isResolved: true, bool isQualified: false}) { 804 {int length, bool isResolved: true, bool isQualified: false}) {
605 int offset = findOffset(search); 805 int offset = findOffset(search);
606 if (length == null) { 806 if (length == null) {
607 length = getLeadingIdentifierLength(search); 807 length = getLeadingIdentifierLength(search);
608 } 808 }
609 return new ExpectedMatch(element, kind, offset, length, 809 return new ExpectedMatch(element, kind, offset, length,
610 isResolved: isResolved, isQualified: isQualified); 810 isResolved: isResolved, isQualified: isQualified);
611 } 811 }
612 812
613 ExpectedMatch _expectIdQ(Element element, MatchKind kind, String search) { 813 /**
614 return _expectId(element, kind, search, isQualified: true); 814 * Create [ExpectedMatch] for a qualified and resolved match.
815 */
816 ExpectedMatch _expectIdQ(Element element, MatchKind kind, String search,
817 {int length, bool isResolved: true}) {
818 return _expectId(element, kind, search, isQualified: true, length: length);
615 } 819 }
616 820
617 ExpectedMatch _expectIdU(Element element, MatchKind kind, String search) { 821 /**
822 * Create [ExpectedMatch] for a qualified and unresolved match.
823 */
824 ExpectedMatch _expectIdQU(Element element, MatchKind kind, String search,
825 {int length}) {
618 return _expectId(element, kind, search, 826 return _expectId(element, kind, search,
619 isQualified: true, isResolved: false); 827 isQualified: true, isResolved: false, length: length);
828 }
829
830 /**
831 * Create [ExpectedMatch] for a unqualified and unresolved match.
832 */
833 ExpectedMatch _expectIdU(Element element, MatchKind kind, String search,
834 {int length}) {
835 return _expectId(element, kind, search,
836 isQualified: false, isResolved: false, length: length);
620 } 837 }
621 838
622 void _indexTestUnit(String code) { 839 void _indexTestUnit(String code) {
623 resolveTestUnit(code); 840 resolveTestUnit(code);
624 index.index(context, testUnit); 841 index.indexUnit(testUnit);
625 } 842 }
626 843
627 Future _verifyReferences( 844 Future _verifyReferences(
628 Element element, List<ExpectedMatch> expectedMatches) { 845 Element element, List<ExpectedMatch> expectedMatches) async {
629 return searchEngine 846 List<SearchMatch> matches = await searchEngine.searchReferences(element);
630 .searchReferences(element) 847 _assertMatches(matches, expectedMatches);
631 .then((List<SearchMatch> matches) { 848 expect(matches, hasLength(expectedMatches.length));
632 _assertMatches(matches, expectedMatches);
633 });
634 }
635
636 Future _verifyTopLevelDeclarations(
637 String pattern, List<ExpectedMatch> expectedMatches) {
638 return searchEngine
639 .searchTopLevelDeclarations(pattern)
640 .then((List<SearchMatch> matches) {
641 _assertMatches(matches, expectedMatches);
642 });
643 } 849 }
644 850
645 static void _assertMatches( 851 static void _assertMatches(
646 List<SearchMatch> matches, List<ExpectedMatch> expectedMatches) { 852 List<SearchMatch> matches, List<ExpectedMatch> expectedMatches) {
647 expect(matches, unorderedEquals(expectedMatches)); 853 expect(matches, unorderedEquals(expectedMatches));
648 } 854 }
649 } 855 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698