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

Side by Side Diff: packages/analyzer/test/src/task/dart_work_manager_test.dart

Issue 1400473008: Roll Observatory packages and add a roll script (Closed) Base URL: git@github.com:dart-lang/observatory_pub_packages.git@master
Patch Set: Created 5 years, 2 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 library test.src.task.dart_work_manager_test;
6
7 import 'package:analyzer/src/context/cache.dart';
8 import 'package:analyzer/src/generated/ast.dart';
9 import 'package:analyzer/src/generated/engine.dart'
10 show
11 AnalysisErrorInfo,
12 AnalysisErrorInfoImpl,
13 CacheState,
14 ChangeNoticeImpl,
15 InternalAnalysisContext;
16 import 'package:analyzer/src/generated/error.dart' show AnalysisError;
17 import 'package:analyzer/src/generated/java_engine.dart' show CaughtException;
18 import 'package:analyzer/src/generated/scanner.dart' show ScannerErrorCode;
19 import 'package:analyzer/src/generated/source.dart';
20 import 'package:analyzer/src/generated/testing/ast_factory.dart';
21 import 'package:analyzer/src/task/dart.dart';
22 import 'package:analyzer/src/task/dart_work_manager.dart';
23 import 'package:analyzer/task/dart.dart';
24 import 'package:analyzer/task/general.dart';
25 import 'package:analyzer/task/model.dart';
26 import 'package:typed_mock/typed_mock.dart';
27 import 'package:unittest/unittest.dart';
28
29 import '../../generated/test_support.dart';
30 import '../../reflective_tests.dart';
31 import '../../utils.dart';
32
33 main() {
34 initializeTestEnvironment();
35 runReflectiveTests(DartWorkManagerTest);
36 }
37
38 @reflectiveTest
39 class DartWorkManagerTest {
40 InternalAnalysisContext context = new _InternalAnalysisContextMock();
41 AnalysisCache cache;
42 DartWorkManager manager;
43
44 CaughtException caughtException = new CaughtException(null, null);
45
46 Source source1 = new TestSource('1.dart');
47 Source source2 = new TestSource('2.dart');
48 Source source3 = new TestSource('3.dart');
49 Source source4 = new TestSource('4.dart');
50 CacheEntry entry1;
51 CacheEntry entry2;
52 CacheEntry entry3;
53 CacheEntry entry4;
54
55 void expect_librarySourceQueue(List<Source> sources) {
56 expect(manager.librarySourceQueue, unorderedEquals(sources));
57 }
58
59 void expect_unknownSourceQueue(List<Source> sources) {
60 expect(manager.unknownSourceQueue, unorderedEquals(sources));
61 }
62
63 void setUp() {
64 cache = context.analysisCache;
65 manager = new DartWorkManager(context);
66 entry1 = context.getCacheEntry(source1);
67 entry2 = context.getCacheEntry(source2);
68 entry3 = context.getCacheEntry(source3);
69 entry4 = context.getCacheEntry(source4);
70 }
71
72 void test_applyChange_add() {
73 // add source1
74 manager.applyChange([source1], [], []);
75 expect_unknownSourceQueue([source1]);
76 expect_librarySourceQueue([]);
77 // add source2
78 manager.applyChange([source2], [], []);
79 expect_librarySourceQueue([]);
80 expect_unknownSourceQueue([source1, source2]);
81 }
82
83 void test_applyChange_add_duplicate() {
84 // add source1
85 manager.applyChange([source1], [], []);
86 expect_unknownSourceQueue([source1]);
87 expect_librarySourceQueue([]);
88 // add source2
89 manager.applyChange([source1], [], []);
90 expect_librarySourceQueue([]);
91 expect_unknownSourceQueue([source1]);
92 }
93
94 void test_applyChange_addRemove() {
95 manager.applyChange([source1, source2], [], [source2, source3]);
96 expect_unknownSourceQueue([source1]);
97 expect_librarySourceQueue([]);
98 }
99
100 void test_applyChange_change() {
101 manager.librarySourceQueue.addAll([source1, source3]);
102 manager.unknownSourceQueue.addAll([source4]);
103 // change source1
104 manager.applyChange([], [source1], []);
105 expect_librarySourceQueue([source3]);
106 expect_unknownSourceQueue([source4, source1]);
107 }
108
109 void test_applyChange_remove() {
110 manager.librarySourceQueue.addAll([source1, source3]);
111 manager.unknownSourceQueue.addAll([source4]);
112 // remove source1
113 manager.applyChange([], [], [source1]);
114 expect_librarySourceQueue([source3]);
115 expect_unknownSourceQueue([source4]);
116 // remove source3
117 manager.applyChange([], [], [source3]);
118 expect_librarySourceQueue([]);
119 expect_unknownSourceQueue([source4]);
120 // remove source4
121 manager.applyChange([], [], [source4]);
122 expect_librarySourceQueue([]);
123 expect_unknownSourceQueue([]);
124 }
125
126 void test_applyChange_updatePartsLibraries_changeLibrary() {
127 Source part1 = new TestSource('part1.dart');
128 Source part2 = new TestSource('part2.dart');
129 Source part3 = new TestSource('part3.dart');
130 Source library1 = new TestSource('library1.dart');
131 Source library2 = new TestSource('library2.dart');
132 manager.partLibrariesMap[part1] = [library1, library2];
133 manager.partLibrariesMap[part2] = [library2];
134 manager.partLibrariesMap[part3] = [library1];
135 manager.libraryPartsMap[library1] = [part1, part3];
136 manager.libraryPartsMap[library2] = [part1, part2];
137 _getOrCreateEntry(part1).setValue(CONTAINING_LIBRARIES, [], []);
138 expect(cache.getState(part1, CONTAINING_LIBRARIES), CacheState.VALID);
139 // change library1
140 manager.applyChange([], [library1], []);
141 expect(manager.partLibrariesMap[part1], unorderedEquals([library2]));
142 expect(manager.partLibrariesMap[part2], unorderedEquals([library2]));
143 expect(manager.partLibrariesMap[part3], unorderedEquals([]));
144 expect(manager.libraryPartsMap[library1], isNull);
145 expect(manager.libraryPartsMap[library2], [part1, part2]);
146 expect(cache.getState(part1, CONTAINING_LIBRARIES), CacheState.INVALID);
147 }
148
149 void test_applyChange_updatePartsLibraries_changePart() {
150 Source part1 = new TestSource('part1.dart');
151 Source part2 = new TestSource('part2.dart');
152 Source part3 = new TestSource('part3.dart');
153 Source library1 = new TestSource('library1.dart');
154 Source library2 = new TestSource('library2.dart');
155 manager.partLibrariesMap[part1] = [library1, library2];
156 manager.partLibrariesMap[part2] = [library2];
157 manager.partLibrariesMap[part3] = [library1];
158 manager.libraryPartsMap[library1] = [part1, part3];
159 manager.libraryPartsMap[library2] = [part1, part2];
160 _getOrCreateEntry(part1).setValue(CONTAINING_LIBRARIES, [], []);
161 expect(cache.getState(part1, CONTAINING_LIBRARIES), CacheState.VALID);
162 // change part1
163 manager.applyChange([], [part1], []);
164 expect(manager.partLibrariesMap[part2], unorderedEquals([library2]));
165 expect(manager.partLibrariesMap[part3], unorderedEquals([library1]));
166 expect(manager.libraryPartsMap[library1], [part1, part3]);
167 expect(manager.libraryPartsMap[library2], [part1, part2]);
168 expect(cache.getState(part1, CONTAINING_LIBRARIES), CacheState.INVALID);
169 }
170
171 void test_applyChange_updatePartsLibraries_removeLibrary() {
172 Source part1 = new TestSource('part1.dart');
173 Source part2 = new TestSource('part2.dart');
174 Source part3 = new TestSource('part3.dart');
175 Source library1 = new TestSource('library1.dart');
176 Source library2 = new TestSource('library2.dart');
177 manager.partLibrariesMap[part1] = [library1, library2];
178 manager.partLibrariesMap[part2] = [library2];
179 manager.partLibrariesMap[part3] = [library1];
180 manager.libraryPartsMap[library1] = [part1, part3];
181 manager.libraryPartsMap[library2] = [part1, part2];
182 // remove library1
183 manager.applyChange([], [], [library1]);
184 expect(manager.partLibrariesMap[part1], unorderedEquals([library2]));
185 expect(manager.partLibrariesMap[part2], unorderedEquals([library2]));
186 expect(manager.partLibrariesMap[part3], unorderedEquals([]));
187 expect(manager.libraryPartsMap[library1], isNull);
188 expect(manager.libraryPartsMap[library2], [part1, part2]);
189 }
190
191 void test_applyChange_updatePartsLibraries_removePart() {
192 Source part1 = new TestSource('part1.dart');
193 Source part2 = new TestSource('part2.dart');
194 Source part3 = new TestSource('part3.dart');
195 Source library1 = new TestSource('library1.dart');
196 Source library2 = new TestSource('library2.dart');
197 manager.partLibrariesMap[part1] = [library1, library2];
198 manager.partLibrariesMap[part2] = [library2];
199 manager.partLibrariesMap[part3] = [library1];
200 manager.libraryPartsMap[library1] = [part1, part3];
201 manager.libraryPartsMap[library2] = [part1, part2];
202 // remove part1
203 manager.applyChange([], [], [part1]);
204 expect(manager.partLibrariesMap[part1], isNull);
205 expect(manager.partLibrariesMap[part2], unorderedEquals([library2]));
206 expect(manager.partLibrariesMap[part3], unorderedEquals([library1]));
207 expect(manager.libraryPartsMap[library1], [part1, part3]);
208 expect(manager.libraryPartsMap[library2], [part1, part2]);
209 }
210
211 void test_applyPriorityTargets_isLibrary_computeErrors() {
212 when(context.shouldErrorsBeAnalyzed(source2, null)).thenReturn(true);
213 when(context.shouldErrorsBeAnalyzed(source3, null)).thenReturn(true);
214 entry1.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
215 entry2.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
216 entry3.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
217 manager.priorityResultQueue
218 .add(new TargetedResult(source1, LIBRARY_ERRORS_READY));
219 manager.priorityResultQueue
220 .add(new TargetedResult(source2, LIBRARY_ERRORS_READY));
221 // -source1 +source3
222 manager.applyPriorityTargets([source2, source3]);
223 expect(
224 manager.priorityResultQueue,
225 unorderedEquals([
226 new TargetedResult(source2, LIBRARY_ERRORS_READY),
227 new TargetedResult(source3, LIBRARY_ERRORS_READY)
228 ]));
229 // get next request
230 TargetedResult request = manager.getNextResult();
231 expect(request.target, source2);
232 expect(request.result, LIBRARY_ERRORS_READY);
233 }
234
235 void test_applyPriorityTargets_isLibrary_computeUnit() {
236 when(context.shouldErrorsBeAnalyzed(source2, null)).thenReturn(false);
237 when(context.shouldErrorsBeAnalyzed(source3, null)).thenReturn(false);
238 entry1.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
239 entry2.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
240 entry3.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
241 manager.priorityResultQueue
242 .add(new TargetedResult(source1, LIBRARY_ERRORS_READY));
243 manager.priorityResultQueue
244 .add(new TargetedResult(source2, LIBRARY_ERRORS_READY));
245 // -source1 +source3
246 manager.applyPriorityTargets([source2, source3]);
247 expect(
248 manager.priorityResultQueue,
249 unorderedEquals([
250 new TargetedResult(
251 new LibrarySpecificUnit(source2, source2), RESOLVED_UNIT),
252 new TargetedResult(
253 new LibrarySpecificUnit(source3, source3), RESOLVED_UNIT),
254 ]));
255 }
256
257 void test_applyPriorityTargets_isPart() {
258 entry1.setValue(SOURCE_KIND, SourceKind.PART, []);
259 entry2.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
260 entry3.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
261 // +source2 +source3
262 when(context.getLibrariesContaining(source1))
263 .thenReturn([source2, source3]);
264 manager.applyPriorityTargets([source1]);
265 expect(
266 manager.priorityResultQueue,
267 unorderedEquals([
268 new TargetedResult(source2, LIBRARY_ERRORS_READY),
269 new TargetedResult(source3, LIBRARY_ERRORS_READY)
270 ]));
271 // get next request
272 TargetedResult request = manager.getNextResult();
273 expect(request.target, source2);
274 expect(request.result, LIBRARY_ERRORS_READY);
275 }
276
277 void test_applyPriorityTargets_isUnknown() {
278 manager.applyPriorityTargets([source2, source3]);
279 expect(
280 manager.priorityResultQueue,
281 unorderedEquals([
282 new TargetedResult(source2, SOURCE_KIND),
283 new TargetedResult(source3, SOURCE_KIND)
284 ]));
285 // get next request
286 TargetedResult request = manager.getNextResult();
287 expect(request.target, source2);
288 expect(request.result, SOURCE_KIND);
289 }
290
291 void test_getErrors() {
292 AnalysisError error1 =
293 new AnalysisError(source1, 1, 0, ScannerErrorCode.MISSING_DIGIT);
294 AnalysisError error2 =
295 new AnalysisError(source1, 2, 0, ScannerErrorCode.MISSING_DIGIT);
296 when(context.getLibrariesContaining(source1)).thenReturn([source2]);
297 entry1.setValue(SCAN_ERRORS, <AnalysisError>[error1], []);
298 context
299 .getCacheEntry(new LibrarySpecificUnit(source2, source1))
300 .setValue(VERIFY_ERRORS, <AnalysisError>[error2], []);
301 List<AnalysisError> errors = manager.getErrors(source1);
302 expect(errors, unorderedEquals([error1, error2]));
303 }
304
305 void test_getErrors_hasFullList() {
306 AnalysisError error1 =
307 new AnalysisError(source1, 1, 0, ScannerErrorCode.MISSING_DIGIT);
308 AnalysisError error2 =
309 new AnalysisError(source1, 2, 0, ScannerErrorCode.MISSING_DIGIT);
310 when(context.getLibrariesContaining(source1)).thenReturn([source2]);
311 entry1.setValue(DART_ERRORS, <AnalysisError>[error1, error2], []);
312 List<AnalysisError> errors = manager.getErrors(source1);
313 expect(errors, unorderedEquals([error1, error2]));
314 }
315
316 void test_getLibrariesContainingPart() {
317 Source part1 = new TestSource('part1.dart');
318 Source part2 = new TestSource('part2.dart');
319 Source part3 = new TestSource('part3.dart');
320 Source library1 = new TestSource('library1.dart');
321 Source library2 = new TestSource('library2.dart');
322 manager.partLibrariesMap[part1] = [library1, library2];
323 manager.partLibrariesMap[part2] = [library2];
324 manager.libraryPartsMap[library1] = [part1];
325 manager.libraryPartsMap[library2] = [part1, part2];
326 // getLibrariesContainingPart
327 expect(manager.getLibrariesContainingPart(part1),
328 unorderedEquals([library1, library2]));
329 expect(
330 manager.getLibrariesContainingPart(part2), unorderedEquals([library2]));
331 expect(manager.getLibrariesContainingPart(part3), isEmpty);
332 }
333
334 void test_getNextResult_hasLibraries_firstIsError() {
335 entry1.setErrorState(caughtException, [LIBRARY_ERRORS_READY]);
336 manager.librarySourceQueue.addAll([source1, source2]);
337 TargetedResult request = manager.getNextResult();
338 expect(request.target, source2);
339 expect(request.result, LIBRARY_ERRORS_READY);
340 // source1 is out, source2 is waiting
341 expect_librarySourceQueue([source2]);
342 }
343
344 void test_getNextResult_hasLibraries_firstIsInvalid() {
345 entry1.setState(LIBRARY_ERRORS_READY, CacheState.INVALID);
346 manager.librarySourceQueue.addAll([source1, source2]);
347 TargetedResult request = manager.getNextResult();
348 expect(request.target, source1);
349 expect(request.result, LIBRARY_ERRORS_READY);
350 // no changes until computed
351 expect_librarySourceQueue([source1, source2]);
352 }
353
354 void test_getNextResult_hasLibraries_firstIsValid() {
355 entry1.setValue(LIBRARY_ERRORS_READY, true, []);
356 manager.librarySourceQueue.addAll([source1, source2]);
357 TargetedResult request = manager.getNextResult();
358 expect(request.target, source2);
359 expect(request.result, LIBRARY_ERRORS_READY);
360 // source1 is out, source2 is waiting
361 expect_librarySourceQueue([source2]);
362 }
363
364 void test_getNextResult_hasPriority_firstIsError() {
365 manager.addPriorityResult(source1, SOURCE_KIND);
366 manager.addPriorityResult(source2, SOURCE_KIND);
367 expect(
368 manager.priorityResultQueue,
369 unorderedEquals([
370 new TargetedResult(source1, SOURCE_KIND),
371 new TargetedResult(source2, SOURCE_KIND)
372 ]));
373 // configure state and get next result
374 entry1.setErrorState(caughtException, [SOURCE_KIND]);
375 TargetedResult request = manager.getNextResult();
376 expect(request.target, source2);
377 expect(request.result, SOURCE_KIND);
378 // source1 is out, source2 is waiting
379 expect(manager.priorityResultQueue,
380 unorderedEquals([new TargetedResult(source2, SOURCE_KIND)]));
381 }
382
383 void test_getNextResult_hasPriority_firstIsValid() {
384 manager.addPriorityResult(source1, SOURCE_KIND);
385 manager.addPriorityResult(source2, SOURCE_KIND);
386 expect(
387 manager.priorityResultQueue,
388 unorderedEquals([
389 new TargetedResult(source1, SOURCE_KIND),
390 new TargetedResult(source2, SOURCE_KIND)
391 ]));
392 // configure state and get next result
393 entry1.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
394 TargetedResult request = manager.getNextResult();
395 expect(request.target, source2);
396 expect(request.result, SOURCE_KIND);
397 // source1 is out, source2 is waiting
398 expect(manager.priorityResultQueue,
399 unorderedEquals([new TargetedResult(source2, SOURCE_KIND)]));
400 }
401
402 void test_getNextResult_hasUnknown_firstIsError() {
403 entry1.setErrorState(caughtException, [SOURCE_KIND]);
404 manager.unknownSourceQueue.addAll([source1, source2]);
405 TargetedResult request = manager.getNextResult();
406 expect(request.target, source2);
407 expect(request.result, SOURCE_KIND);
408 // source1 is out, source2 is waiting
409 expect_librarySourceQueue([]);
410 expect_unknownSourceQueue([source2]);
411 }
412
413 void test_getNextResult_hasUnknown_firstIsInvalid() {
414 manager.unknownSourceQueue.addAll([source1, source2]);
415 TargetedResult request = manager.getNextResult();
416 expect(request.target, source1);
417 expect(request.result, SOURCE_KIND);
418 // no changes until computed
419 expect_librarySourceQueue([]);
420 expect_unknownSourceQueue([source1, source2]);
421 }
422
423 void test_getNextResult_hasUnknown_firstIsValid() {
424 entry1.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
425 manager.unknownSourceQueue.addAll([source1, source2]);
426 TargetedResult request = manager.getNextResult();
427 expect(request.target, source2);
428 expect(request.result, SOURCE_KIND);
429 // source1 is out, source2 is waiting
430 expect_librarySourceQueue([]);
431 expect_unknownSourceQueue([source2]);
432 }
433
434 void test_getNextResult_nothingToDo() {
435 TargetedResult request = manager.getNextResult();
436 expect(request, isNull);
437 }
438
439 void test_getNextResultPriority_hasLibrary() {
440 manager.librarySourceQueue.addAll([source1]);
441 expect(manager.getNextResultPriority(), WorkOrderPriority.NORMAL);
442 }
443
444 void test_getNextResultPriority_hasPriority() {
445 manager.addPriorityResult(source1, SOURCE_KIND);
446 expect(manager.getNextResultPriority(), WorkOrderPriority.PRIORITY);
447 }
448
449 void test_getNextResultPriority_hasUnknown() {
450 manager.unknownSourceQueue.addAll([source1]);
451 expect(manager.getNextResultPriority(), WorkOrderPriority.NORMAL);
452 }
453
454 void test_getNextResultPriority_nothingToDo() {
455 expect(manager.getNextResultPriority(), WorkOrderPriority.NONE);
456 }
457
458 void test_onAnalysisOptionsChanged() {
459 when(context.exists(anyObject)).thenReturn(true);
460 // set cache values
461 entry1.setValue(PARSED_UNIT, AstFactory.compilationUnit(), []);
462 entry1.setValue(IMPORTED_LIBRARIES, <Source>[], []);
463 entry1.setValue(EXPLICITLY_IMPORTED_LIBRARIES, <Source>[], []);
464 entry1.setValue(EXPORTED_LIBRARIES, <Source>[], []);
465 entry1.setValue(INCLUDED_PARTS, <Source>[], []);
466 // configure LibrarySpecificUnit
467 LibrarySpecificUnit unitTarget = new LibrarySpecificUnit(source2, source3);
468 CacheEntry unitEntry = new CacheEntry(unitTarget);
469 cache.put(unitEntry);
470 unitEntry.setValue(BUILD_LIBRARY_ERRORS, <AnalysisError>[], []);
471 expect(unitEntry.getState(BUILD_LIBRARY_ERRORS), CacheState.VALID);
472 // notify
473 manager.onAnalysisOptionsChanged();
474 // resolution is invalidated
475 expect(unitEntry.getState(BUILD_LIBRARY_ERRORS), CacheState.INVALID);
476 // ...but URIs are still value
477 expect(entry1.getState(PARSED_UNIT), CacheState.VALID);
478 expect(entry1.getState(IMPORTED_LIBRARIES), CacheState.VALID);
479 expect(entry1.getState(EXPLICITLY_IMPORTED_LIBRARIES), CacheState.VALID);
480 expect(entry1.getState(EXPORTED_LIBRARIES), CacheState.VALID);
481 expect(entry1.getState(INCLUDED_PARTS), CacheState.VALID);
482 }
483
484 void test_onResultInvalidated_scheduleInvalidatedLibraries() {
485 // set SOURCE_KIND
486 entry1.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
487 entry2.setValue(SOURCE_KIND, SourceKind.PART, []);
488 entry3.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
489 // set LIBRARY_ERRORS_READY for source1 and source3
490 entry1.setValue(LIBRARY_ERRORS_READY, true, []);
491 entry3.setValue(LIBRARY_ERRORS_READY, true, []);
492 // invalidate LIBRARY_ERRORS_READY for source1, schedule it
493 entry1.setState(LIBRARY_ERRORS_READY, CacheState.INVALID);
494 expect_librarySourceQueue([source1]);
495 // invalidate LIBRARY_ERRORS_READY for source3, schedule it
496 entry3.setState(LIBRARY_ERRORS_READY, CacheState.INVALID);
497 expect_librarySourceQueue([source1, source3]);
498 }
499
500 void test_onSourceFactoryChanged() {
501 when(context.exists(anyObject)).thenReturn(true);
502 // set cache values
503 entry1.setValue(PARSED_UNIT, AstFactory.compilationUnit(), []);
504 entry1.setValue(IMPORTED_LIBRARIES, <Source>[], []);
505 entry1.setValue(EXPLICITLY_IMPORTED_LIBRARIES, <Source>[], []);
506 entry1.setValue(EXPORTED_LIBRARIES, <Source>[], []);
507 entry1.setValue(INCLUDED_PARTS, <Source>[], []);
508 // configure LibrarySpecificUnit
509 LibrarySpecificUnit unitTarget = new LibrarySpecificUnit(source2, source3);
510 CacheEntry unitEntry = new CacheEntry(unitTarget);
511 cache.put(unitEntry);
512 unitEntry.setValue(BUILD_LIBRARY_ERRORS, <AnalysisError>[], []);
513 expect(unitEntry.getState(BUILD_LIBRARY_ERRORS), CacheState.VALID);
514 // notify
515 manager.onSourceFactoryChanged();
516 // resolution is invalidated
517 expect(unitEntry.getState(BUILD_LIBRARY_ERRORS), CacheState.INVALID);
518 // ...and URIs resolution too
519 expect(entry1.getState(PARSED_UNIT), CacheState.INVALID);
520 expect(entry1.getState(IMPORTED_LIBRARIES), CacheState.INVALID);
521 expect(entry1.getState(EXPLICITLY_IMPORTED_LIBRARIES), CacheState.INVALID);
522 expect(entry1.getState(EXPORTED_LIBRARIES), CacheState.INVALID);
523 expect(entry1.getState(INCLUDED_PARTS), CacheState.INVALID);
524 }
525
526 void test_resultsComputed_errors_forLibrarySpecificUnit() {
527 LineInfo lineInfo = new LineInfo([0]);
528 AnalysisError error1 =
529 new AnalysisError(source1, 1, 0, ScannerErrorCode.MISSING_DIGIT);
530 AnalysisError error2 =
531 new AnalysisError(source1, 2, 0, ScannerErrorCode.MISSING_DIGIT);
532 when(context.getLibrariesContaining(source1)).thenReturn([source2]);
533 when(context.getErrors(source1))
534 .thenReturn(new AnalysisErrorInfoImpl([error1, error2], lineInfo));
535 entry1.setValue(LINE_INFO, lineInfo, []);
536 entry1.setValue(SCAN_ERRORS, <AnalysisError>[error1], []);
537 AnalysisTarget unitTarget = new LibrarySpecificUnit(source2, source1);
538 context
539 .getCacheEntry(unitTarget)
540 .setValue(VERIFY_ERRORS, <AnalysisError>[error2], []);
541 // RESOLVED_UNIT is ready, set errors
542 manager.resultsComputed(
543 unitTarget, {RESOLVED_UNIT: AstFactory.compilationUnit()});
544 // all of the errors are included
545 ChangeNoticeImpl notice = context.getNotice(source1);
546 expect(notice.errors, unorderedEquals([error1, error2]));
547 expect(notice.lineInfo, lineInfo);
548 }
549
550 void test_resultsComputed_errors_forSource() {
551 LineInfo lineInfo = new LineInfo([0]);
552 AnalysisError error1 =
553 new AnalysisError(source1, 1, 0, ScannerErrorCode.MISSING_DIGIT);
554 AnalysisError error2 =
555 new AnalysisError(source1, 2, 0, ScannerErrorCode.MISSING_DIGIT);
556 when(context.getLibrariesContaining(source1)).thenReturn([source2]);
557 when(context.getErrors(source1))
558 .thenReturn(new AnalysisErrorInfoImpl([error1, error2], lineInfo));
559 entry1.setValue(LINE_INFO, lineInfo, []);
560 entry1.setValue(SCAN_ERRORS, <AnalysisError>[error1], []);
561 entry1.setValue(PARSE_ERRORS, <AnalysisError>[error2], []);
562 // PARSED_UNIT is ready, set errors
563 manager.resultsComputed(
564 source1, {PARSED_UNIT: AstFactory.compilationUnit()});
565 // all of the errors are included
566 ChangeNoticeImpl notice = context.getNotice(source1);
567 expect(notice.errors, unorderedEquals([error1, error2]));
568 expect(notice.lineInfo, lineInfo);
569 }
570
571 void test_resultsComputed_includedParts_updatePartLibraries() {
572 Source part1 = new TestSource('part1.dart');
573 Source part2 = new TestSource('part2.dart');
574 Source part3 = new TestSource('part3.dart');
575 Source library1 = new TestSource('library1.dart');
576 Source library2 = new TestSource('library2.dart');
577 _getOrCreateEntry(part1).setValue(CONTAINING_LIBRARIES, [], []);
578 expect(cache.getState(part1, CONTAINING_LIBRARIES), CacheState.VALID);
579 // configure AnalysisContext mock
580 when(context.prioritySources).thenReturn(<Source>[]);
581 when(context.shouldErrorsBeAnalyzed(anyObject, anyObject))
582 .thenReturn(false);
583 // library1 parts
584 manager.resultsComputed(library1, {
585 INCLUDED_PARTS: [part1, part2],
586 SOURCE_KIND: SourceKind.LIBRARY
587 });
588 expect(manager.partLibrariesMap[part1], [library1]);
589 expect(manager.partLibrariesMap[part2], [library1]);
590 expect(manager.partLibrariesMap[part3], isNull);
591 expect(manager.libraryPartsMap[library1], [part1, part2]);
592 expect(manager.libraryPartsMap[library2], isNull);
593 // library2 parts
594 manager.resultsComputed(library2, {
595 INCLUDED_PARTS: [part2, part3],
596 SOURCE_KIND: SourceKind.LIBRARY
597 });
598 expect(manager.partLibrariesMap[part1], [library1]);
599 expect(manager.partLibrariesMap[part2], [library1, library2]);
600 expect(manager.partLibrariesMap[part3], [library2]);
601 expect(manager.libraryPartsMap[library1], [part1, part2]);
602 expect(manager.libraryPartsMap[library2], [part2, part3]);
603 // part1 CONTAINING_LIBRARIES
604 expect(cache.getState(part1, CONTAINING_LIBRARIES), CacheState.INVALID);
605 }
606
607 void test_resultsComputed_noSourceKind() {
608 manager.unknownSourceQueue.addAll([source1, source2]);
609 manager.resultsComputed(source1, {});
610 expect_librarySourceQueue([]);
611 expect_unknownSourceQueue([source1, source2]);
612 }
613
614 void test_resultsComputed_notDart() {
615 manager.unknownSourceQueue.addAll([source1, source2]);
616 manager.resultsComputed(new TestSource('test.html'), {});
617 expect_librarySourceQueue([]);
618 expect_unknownSourceQueue([source1, source2]);
619 }
620
621 void test_resultsComputed_parsedUnit() {
622 LineInfo lineInfo = new LineInfo([0]);
623 when(context.getLibrariesContaining(source1)).thenReturn([]);
624 when(context.getErrors(source1))
625 .thenReturn(new AnalysisErrorInfoImpl([], lineInfo));
626 entry1.setValue(LINE_INFO, lineInfo, []);
627 CompilationUnit unit = AstFactory.compilationUnit();
628 manager.resultsComputed(source1, {PARSED_UNIT: unit});
629 ChangeNoticeImpl notice = context.getNotice(source1);
630 expect(notice.parsedDartUnit, unit);
631 expect(notice.resolvedDartUnit, isNull);
632 expect(notice.lineInfo, lineInfo);
633 }
634
635 void test_resultsComputed_resolvedUnit() {
636 LineInfo lineInfo = new LineInfo([0]);
637 when(context.getLibrariesContaining(source2)).thenReturn([]);
638 when(context.getErrors(source2))
639 .thenReturn(new AnalysisErrorInfoImpl([], lineInfo));
640 entry2.setValue(LINE_INFO, lineInfo, []);
641 CompilationUnit unit = AstFactory.compilationUnit();
642 manager.resultsComputed(
643 new LibrarySpecificUnit(source1, source2), {RESOLVED_UNIT: unit});
644 ChangeNoticeImpl notice = context.getNotice(source2);
645 expect(notice.parsedDartUnit, isNull);
646 expect(notice.resolvedDartUnit, unit);
647 expect(notice.lineInfo, lineInfo);
648 }
649
650 void test_resultsComputed_sourceKind_isLibrary() {
651 manager.unknownSourceQueue.addAll([source1, source2, source3]);
652 when(context.prioritySources).thenReturn(<Source>[]);
653 when(context.shouldErrorsBeAnalyzed(source2, null)).thenReturn(true);
654 manager.resultsComputed(source2, {SOURCE_KIND: SourceKind.LIBRARY});
655 expect_librarySourceQueue([source2]);
656 expect_unknownSourceQueue([source1, source3]);
657 }
658
659 void test_resultsComputed_sourceKind_isLibrary_isPriority_computeErrors() {
660 manager.unknownSourceQueue.addAll([source1, source2, source3]);
661 when(context.prioritySources).thenReturn(<Source>[source2]);
662 when(context.shouldErrorsBeAnalyzed(source2, null)).thenReturn(true);
663 manager.resultsComputed(source2, {SOURCE_KIND: SourceKind.LIBRARY});
664 expect_unknownSourceQueue([source1, source3]);
665 expect(manager.priorityResultQueue,
666 unorderedEquals([new TargetedResult(source2, LIBRARY_ERRORS_READY)]));
667 }
668
669 void test_resultsComputed_sourceKind_isLibrary_isPriority_computeUnit() {
670 manager.unknownSourceQueue.addAll([source1, source2, source3]);
671 when(context.prioritySources).thenReturn(<Source>[source2]);
672 when(context.shouldErrorsBeAnalyzed(source2, null)).thenReturn(false);
673 manager.resultsComputed(source2, {SOURCE_KIND: SourceKind.LIBRARY});
674 expect_unknownSourceQueue([source1, source3]);
675 expect(
676 manager.priorityResultQueue,
677 unorderedEquals([
678 new TargetedResult(
679 new LibrarySpecificUnit(source2, source2), RESOLVED_UNIT)
680 ]));
681 }
682
683 void test_resultsComputed_sourceKind_isPart() {
684 manager.unknownSourceQueue.addAll([source1, source2, source3]);
685 manager.resultsComputed(source2, {SOURCE_KIND: SourceKind.PART});
686 expect_librarySourceQueue([]);
687 expect_unknownSourceQueue([source1, source3]);
688 }
689
690 void test_resultsComputed_updatePartsLibraries_partParsed() {
691 Source part = new TestSource('part.dart');
692 expect(manager.libraryPartsMap, isEmpty);
693 // part.dart parsed, no changes is the map of libraries
694 manager.resultsComputed(
695 part, {SOURCE_KIND: SourceKind.PART, INCLUDED_PARTS: <Source>[]});
696 expect(manager.libraryPartsMap, isEmpty);
697 }
698
699 CacheEntry _getOrCreateEntry(Source source) {
700 CacheEntry entry = cache.get(source);
701 if (entry == null) {
702 entry = new CacheEntry(source);
703 cache.put(entry);
704 }
705 return entry;
706 }
707 }
708
709 class _InternalAnalysisContextMock extends TypedMock
710 implements InternalAnalysisContext {
711 @override
712 CachePartition privateAnalysisCachePartition;
713
714 @override
715 AnalysisCache analysisCache;
716
717 Map<Source, ChangeNoticeImpl> _pendingNotices = <Source, ChangeNoticeImpl>{};
718
719 _InternalAnalysisContextMock() {
720 privateAnalysisCachePartition = new UniversalCachePartition(this);
721 analysisCache = new AnalysisCache([privateAnalysisCachePartition]);
722 }
723
724 @override
725 CacheEntry getCacheEntry(AnalysisTarget target) {
726 CacheEntry entry = analysisCache.get(target);
727 if (entry == null) {
728 entry = new CacheEntry(target);
729 analysisCache.put(entry);
730 }
731 return entry;
732 }
733
734 @override
735 ChangeNoticeImpl getNotice(Source source) {
736 return _pendingNotices.putIfAbsent(
737 source, () => new ChangeNoticeImpl(source));
738 }
739
740 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
741 }
OLDNEW
« no previous file with comments | « packages/analyzer/test/src/task/dart_test.dart ('k') | packages/analyzer/test/src/task/driver_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698