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

Side by Side Diff: pkg/analyzer/test/src/task/dart_test.dart

Issue 998053002: Task: Build Public Namespace. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 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 | Annotate | Revision Log
« no previous file with comments | « pkg/analyzer/lib/task/dart.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 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 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.src.task.dart_test; 5 library test.src.task.dart_test;
6 6
7 import 'package:analyzer/file_system/file_system.dart'; 7 import 'package:analyzer/file_system/file_system.dart';
8 import 'package:analyzer/file_system/memory_file_system.dart'; 8 import 'package:analyzer/file_system/memory_file_system.dart';
9 import 'package:analyzer/src/context/cache.dart'; 9 import 'package:analyzer/src/context/cache.dart';
10 import 'package:analyzer/src/generated/ast.dart'; 10 import 'package:analyzer/src/generated/ast.dart';
(...skipping 14 matching lines...) Expand all
25 import 'package:unittest/unittest.dart'; 25 import 'package:unittest/unittest.dart';
26 26
27 import '../../generated/resolver_test.dart'; 27 import '../../generated/resolver_test.dart';
28 import '../../generated/test_support.dart'; 28 import '../../generated/test_support.dart';
29 import '../../reflective_tests.dart'; 29 import '../../reflective_tests.dart';
30 30
31 main() { 31 main() {
32 groupSep = ' | '; 32 groupSep = ' | ';
33 runReflectiveTests(BuildCompilationUnitElementTaskTest); 33 runReflectiveTests(BuildCompilationUnitElementTaskTest);
34 runReflectiveTests(BuildLibraryElementTaskTest); 34 runReflectiveTests(BuildLibraryElementTaskTest);
35 runReflectiveTests(BuildPublicNamespaceTaskTest);
35 runReflectiveTests(ParseDartTaskTest); 36 runReflectiveTests(ParseDartTaskTest);
36 runReflectiveTests(ScanDartTaskTest); 37 runReflectiveTests(ScanDartTaskTest);
37 } 38 }
38 39
39 @reflectiveTest 40 @reflectiveTest
40 class BuildCompilationUnitElementTaskTest extends EngineTestCase { 41 class BuildCompilationUnitElementTaskTest extends EngineTestCase {
41 test_buildInputs() { 42 test_buildInputs() {
42 AnalysisTarget target = new TestSource(); 43 AnalysisTarget target = new TestSource();
43 Map<String, TaskInput> inputs = 44 Map<String, TaskInput> inputs =
44 BuildCompilationUnitElementTask.buildInputs(target); 45 BuildCompilationUnitElementTask.buildInputs(target);
45 expect(inputs, isNotNull); 46 expect(inputs.keys, unorderedEquals(
46 expect(inputs, hasLength(1)); 47 [BuildCompilationUnitElementTask.PARSED_UNIT_INPUT_NAME]));
47 expect(inputs[BuildCompilationUnitElementTask.PARSED_UNIT_INPUT_NAME],
48 isNotNull);
49 } 48 }
50 49
51 test_constructor() { 50 test_constructor() {
52 AnalysisContext context = AnalysisContextFactory.contextWithCore(); 51 AnalysisContext context = AnalysisContextFactory.contextWithCore();
53 AnalysisTarget target = new TestSource(); 52 AnalysisTarget target = new TestSource();
54 BuildCompilationUnitElementTask task = 53 BuildCompilationUnitElementTask task =
55 new BuildCompilationUnitElementTask(context, target); 54 new BuildCompilationUnitElementTask(context, target);
56 expect(task, isNotNull); 55 expect(task, isNotNull);
57 expect(task.context, context); 56 expect(task.context, context);
58 expect(task.target, target); 57 expect(task.target, target);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 BuildCompilationUnitElementTask.PARSED_UNIT_INPUT_NAME: 117 BuildCompilationUnitElementTask.PARSED_UNIT_INPUT_NAME:
119 parseOutputs[PARSED_UNIT] 118 parseOutputs[PARSED_UNIT]
120 }; 119 };
121 buildTask.perform(); 120 buildTask.perform();
122 121
123 return buildTask; 122 return buildTask;
124 } 123 }
125 } 124 }
126 125
127 @reflectiveTest 126 @reflectiveTest
128 class BuildLibraryElementTaskTest extends EngineTestCase { 127 class BuildLibraryElementTaskTest extends _AbstractDartTaskTest {
129 MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
130 InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
131
132 Source librarySource; 128 Source librarySource;
133 CompilationUnit libraryUnit; 129 CompilationUnit libraryUnit;
134 CompilationUnitElement libraryUnitElement; 130 CompilationUnitElement libraryUnitElement;
135 List<CompilationUnit> partUnits; 131 List<CompilationUnit> partUnits;
136 132
137 BuildLibraryElementTask task;
138 Map<ResultDescriptor<dynamic>, dynamic> outputs;
139 LibraryElement libraryElement; 133 LibraryElement libraryElement;
140 134
141 void setUp() {
142 DartSdk sdk = context.sourceFactory.dartSdk;
143 context.sourceFactory = new SourceFactory(<UriResolver>[
144 new DartUriResolver(sdk),
145 new ResourceUriResolver(resourceProvider)
146 ]);
147 }
148
149 test_buildInputs() { 135 test_buildInputs() {
150 ExtendedAnalysisContext context = new _MockContext(); 136 ExtendedAnalysisContext context = new _MockContext();
151 // prepare sources 137 // prepare sources
152 File libraryFile = resourceProvider.newFile('/lib.dart', ''); 138 File libraryFile = resourceProvider.newFile('/lib.dart', '');
153 File partFile1 = resourceProvider.newFile('/part1.dart', ''); 139 File partFile1 = resourceProvider.newFile('/part1.dart', '');
154 File partFile2 = resourceProvider.newFile('/part2.dart', ''); 140 File partFile2 = resourceProvider.newFile('/part2.dart', '');
155 Source librarySource = libraryFile.createSource(); 141 Source librarySource = libraryFile.createSource();
156 Source partSource1 = partFile1.createSource(); 142 Source partSource1 = partFile1.createSource();
157 Source partSource2 = partFile2.createSource(); 143 Source partSource2 = partFile2.createSource();
158 // set INCLUDED_PARTS 144 // set INCLUDED_PARTS
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 expect(unitElement2.topLevelVariables, [variable]); 352 expect(unitElement2.topLevelVariables, [variable]);
367 } 353 }
368 354
369 void _assertErrorsWithCodes(List<ErrorCode> expectedErrorCodes) { 355 void _assertErrorsWithCodes(List<ErrorCode> expectedErrorCodes) {
370 List<AnalysisError> errors = outputs[BUILD_LIBRARY_ERRORS]; 356 List<AnalysisError> errors = outputs[BUILD_LIBRARY_ERRORS];
371 GatheringErrorListener errorListener = new GatheringErrorListener(); 357 GatheringErrorListener errorListener = new GatheringErrorListener();
372 errorListener.addAll(errors); 358 errorListener.addAll(errors);
373 errorListener.assertErrorsWithCodes(expectedErrorCodes); 359 errorListener.assertErrorsWithCodes(expectedErrorCodes);
374 } 360 }
375 361
376 CompilationUnit _buildCompilationUnit(
377 InternalAnalysisContext context, String path, String content) {
378 File file = resourceProvider.newFile(path, content);
379 Source source = file.createSource();
380
381 ScanDartTask scanTask = new ScanDartTask(context, source);
382 scanTask.inputs = {ScanDartTask.CONTENT_INPUT_NAME: content};
383 scanTask.perform();
384 Map<ResultDescriptor, dynamic> scanOutputs = scanTask.outputs;
385
386 ParseDartTask parseTask = new ParseDartTask(context, source);
387 parseTask.inputs = {
388 ParseDartTask.LINE_INFO_INPUT_NAME: scanOutputs[LINE_INFO],
389 ParseDartTask.TOKEN_STREAM_INPUT_NAME: scanOutputs[TOKEN_STREAM]
390 };
391 parseTask.perform();
392 Map<ResultDescriptor, dynamic> parseOutputs = parseTask.outputs;
393
394 BuildCompilationUnitElementTask buildTask =
395 new BuildCompilationUnitElementTask(context, source);
396 buildTask.inputs = {
397 BuildCompilationUnitElementTask.PARSED_UNIT_INPUT_NAME:
398 parseOutputs[PARSED_UNIT]
399 };
400 buildTask.perform();
401 return buildTask.outputs[BUILT_UNIT];
402 }
403
404 void _performBuildTask(Map<String, String> sourceMap) { 362 void _performBuildTask(Map<String, String> sourceMap) {
363 _BuildLibraryElementTaskResult result = _buildLibraryElement(sourceMap);
405 Map<String, CompilationUnit> unitMap = <String, CompilationUnit>{}; 364 Map<String, CompilationUnit> unitMap = <String, CompilationUnit>{};
406 sourceMap.forEach((String path, String content) { 365 sourceMap.forEach((String path, String content) {
407 CompilationUnit unit = _buildCompilationUnit(context, path, content); 366 CompilationUnit unit = _buildCompilationUnit(path, content);
408 unitMap[path] = unit; 367 unitMap[path] = unit;
409 }); 368 });
410 369
411 libraryUnit = unitMap.values.first; 370 libraryUnit = result.libraryUnit;
412 libraryUnitElement = libraryUnit.element; 371 libraryUnitElement = result.libraryUnitElement;
413 librarySource = libraryUnitElement.source; 372 librarySource = result.librarySource;
414 partUnits = unitMap.values.skip(1).toList(); 373 partUnits = result.partUnits;
415 374
416 task = new BuildLibraryElementTask(context, librarySource); 375 task = result.task;
417 task.inputs = { 376 outputs = result.outputs;
418 BuildLibraryElementTask.DEFINING_BUILT_UNIT_INPUT_NAME: libraryUnit, 377 libraryElement = result.libraryElement;
419 BuildLibraryElementTask.PART_BUILT_UNITS_INPUT_NAME: partUnits
420 };
421 task.perform();
422 outputs = task.outputs;
423 libraryElement = outputs[BUILT_LIBRARY_ELEMENT];
424 } 378 }
425 } 379 }
426 380
381 @reflectiveTest
382 class BuildPublicNamespaceTaskTest extends _AbstractDartTaskTest {
383 test_buildInputs() {
384 AnalysisTarget target = new TestSource();
385 Map<String, TaskInput> inputs =
386 BuildPublicNamespaceTask.buildInputs(target);
387 expect(inputs.keys, unorderedEquals(
388 [BuildPublicNamespaceTask.BUILT_LIBRARY_ELEMENT_INPUT_NAME]));
389 }
390
391 test_constructor() {
392 AnalysisContext context = AnalysisContextFactory.contextWithCore();
393 AnalysisTarget target = new TestSource();
394 BuildPublicNamespaceTask task =
395 new BuildPublicNamespaceTask(context, target);
396 expect(task, isNotNull);
397 expect(task.context, context);
398 expect(task.target, target);
399 }
400
401 test_createTask() {
402 AnalysisContext context = AnalysisContextFactory.contextWithCore();
403 AnalysisTarget target = new TestSource();
404 BuildPublicNamespaceTask task =
405 BuildPublicNamespaceTask.createTask(context, target);
406 expect(task, isNotNull);
407 expect(task.context, context);
408 expect(task.target, target);
409 }
410
411 test_description() {
412 AnalysisTarget target = new TestSource();
413 BuildPublicNamespaceTask task = new BuildPublicNamespaceTask(null, target);
414 expect(task.description, isNotNull);
415 }
416
417 test_descriptor() {
418 TaskDescriptor descriptor = BuildPublicNamespaceTask.DESCRIPTOR;
419 expect(descriptor, isNotNull);
420 }
421
422 test_perform() {
423 var buildLibraryElementResult = _buildLibraryElement({
424 '/lib.dart': '''
425 library lib;
426 part 'part.dart';
427 a() {}
428 _b() {}
429 ''',
430 '/part.dart': '''
431 part of lib;
432 _c() {}
433 d() {}
434 '''
435 });
436 Source librarySource = buildLibraryElementResult.librarySource;
437 LibraryElement libraryElement = buildLibraryElementResult.libraryElement;
438 // perform task
439 BuildPublicNamespaceTask task =
440 new BuildPublicNamespaceTask(context, librarySource);
441 task.inputs = {
442 BuildPublicNamespaceTask.BUILT_LIBRARY_ELEMENT_INPUT_NAME: libraryElement
443 };
444 Map<ResultDescriptor, dynamic> outputs = _performTask(task);
445 // validate
446 Namespace namespace = outputs[PUBLIC_NAMESPACE];
447 expect(namespace.definedNames.keys, unorderedEquals(['a', 'd']));
448 }
449 }
450
427 @reflectiveTest 451 @reflectiveTest
428 class ParseDartTaskTest extends EngineTestCase { 452 class ParseDartTaskTest extends EngineTestCase {
429 test_buildInputs() { 453 test_buildInputs() {
430 AnalysisTarget target = new TestSource(); 454 AnalysisTarget target = new TestSource();
431 Map<String, TaskInput> inputs = ParseDartTask.buildInputs(target); 455 Map<String, TaskInput> inputs = ParseDartTask.buildInputs(target);
432 expect(inputs, isNotNull); 456 expect(inputs.keys, unorderedEquals([
Brian Wilkerson 2015/03/11 20:55:25 I'd rather have the explicit test that 'inputs' is
433 expect(inputs, hasLength(2)); 457 ParseDartTask.LINE_INFO_INPUT_NAME,
434 expect(inputs[ParseDartTask.LINE_INFO_INPUT_NAME], isNotNull); 458 ParseDartTask.TOKEN_STREAM_INPUT_NAME
435 expect(inputs[ParseDartTask.TOKEN_STREAM_INPUT_NAME], isNotNull); 459 ]));
436 } 460 }
437 461
438 test_constructor() { 462 test_constructor() {
439 AnalysisContext context = AnalysisContextFactory.contextWithCore(); 463 AnalysisContext context = AnalysisContextFactory.contextWithCore();
440 AnalysisTarget target = new TestSource(); 464 AnalysisTarget target = new TestSource();
441 ParseDartTask task = new ParseDartTask(context, target); 465 ParseDartTask task = new ParseDartTask(context, target);
442 expect(task, isNotNull); 466 expect(task, isNotNull);
443 expect(task.context, context); 467 expect(task.context, context);
444 expect(task.target, target); 468 expect(task.target, target);
445 } 469 }
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 parseTask.perform(); 560 parseTask.perform();
537 return parseTask; 561 return parseTask;
538 } 562 }
539 } 563 }
540 564
541 @reflectiveTest 565 @reflectiveTest
542 class ScanDartTaskTest extends EngineTestCase { 566 class ScanDartTaskTest extends EngineTestCase {
543 test_buildInputs() { 567 test_buildInputs() {
544 AnalysisTarget target = new TestSource(); 568 AnalysisTarget target = new TestSource();
545 Map<String, TaskInput> inputs = ScanDartTask.buildInputs(target); 569 Map<String, TaskInput> inputs = ScanDartTask.buildInputs(target);
546 expect(inputs, isNotNull); 570 expect(inputs.keys, unorderedEquals([ScanDartTask.CONTENT_INPUT_NAME]));
547 expect(inputs, hasLength(1));
548 expect(inputs[ScanDartTask.CONTENT_INPUT_NAME], isNotNull);
549 } 571 }
550 572
551 test_constructor() { 573 test_constructor() {
552 AnalysisContext context = AnalysisContextFactory.contextWithCore(); 574 AnalysisContext context = AnalysisContextFactory.contextWithCore();
553 AnalysisTarget target = new TestSource(); 575 AnalysisTarget target = new TestSource();
554 ScanDartTask task = new ScanDartTask(context, target); 576 ScanDartTask task = new ScanDartTask(context, target);
555 expect(task, isNotNull); 577 expect(task, isNotNull);
556 expect(task.context, context); 578 expect(task.context, context);
557 expect(task.target, target); 579 expect(task.target, target);
558 } 580 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
603 AnalysisContext context = AnalysisContextFactory.contextWithCore(); 625 AnalysisContext context = AnalysisContextFactory.contextWithCore();
604 AnalysisTarget target = new TestSource(); 626 AnalysisTarget target = new TestSource();
605 627
606 ScanDartTask scanTask = new ScanDartTask(context, target); 628 ScanDartTask scanTask = new ScanDartTask(context, target);
607 scanTask.inputs = {ScanDartTask.CONTENT_INPUT_NAME: content}; 629 scanTask.inputs = {ScanDartTask.CONTENT_INPUT_NAME: content};
608 scanTask.perform(); 630 scanTask.perform();
609 return scanTask; 631 return scanTask;
610 } 632 }
611 } 633 }
612 634
635 class _AbstractDartTaskTest extends EngineTestCase {
636 MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
637
638 InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
639 Map<AnalysisTarget, CacheEntry> entryMap = <AnalysisTarget, CacheEntry>{};
640
641 AnalysisTask task;
642 Map<ResultDescriptor<dynamic>, dynamic> outputs;
643
644 CacheEntry getCacheEntry(AnalysisTarget target) {
645 return entryMap.putIfAbsent(target, () => new CacheEntry());
646 }
647
648 void setUp() {
649 DartSdk sdk = context.sourceFactory.dartSdk;
650 context.sourceFactory = new SourceFactory(<UriResolver>[
651 new DartUriResolver(sdk),
652 new ResourceUriResolver(resourceProvider)
653 ]);
654 }
655
656 CompilationUnit _buildCompilationUnit(String path, String content) {
657 File file = resourceProvider.newFile(path, content);
658 Source source = file.createSource();
659 // scan
660 ScanDartTask scanTask = new ScanDartTask(context, source);
661 scanTask.inputs = {ScanDartTask.CONTENT_INPUT_NAME: content};
662 var scanOutputs = _performTask(scanTask);
663 // parse
664 ParseDartTask parseTask = new ParseDartTask(context, source);
665 parseTask.inputs = {
666 ParseDartTask.LINE_INFO_INPUT_NAME: scanOutputs[LINE_INFO],
667 ParseDartTask.TOKEN_STREAM_INPUT_NAME: scanOutputs[TOKEN_STREAM]
668 };
669 var parseOutputs = _performTask(parseTask);
670 // build CompilationUnit
671 BuildCompilationUnitElementTask buildTask =
672 new BuildCompilationUnitElementTask(context, source);
673 buildTask.inputs = {
674 BuildCompilationUnitElementTask.PARSED_UNIT_INPUT_NAME:
675 parseOutputs[PARSED_UNIT]
676 };
677 var buildUnitOutputs = _performTask(buildTask);
678 // done
679 return buildUnitOutputs[BUILT_UNIT];
680 }
681
682 _BuildLibraryElementTaskResult _buildLibraryElement(
683 Map<String, String> sourceMap) {
684 Map<String, CompilationUnit> unitMap = <String, CompilationUnit>{};
685 sourceMap.forEach((String path, String content) {
686 CompilationUnit unit = _buildCompilationUnit(path, content);
687 unitMap[path] = unit;
688 });
689
690 CompilationUnit libraryUnit = unitMap.values.first;
691 CompilationUnitElement libraryUnitElement = libraryUnit.element;
692 Source librarySource = libraryUnitElement.source;
693 List<CompilationUnit> partUnits = unitMap.values.skip(1).toList();
694
695 BuildLibraryElementTask task =
696 new BuildLibraryElementTask(context, librarySource);
697 task.inputs = {
698 BuildLibraryElementTask.DEFINING_BUILT_UNIT_INPUT_NAME: libraryUnit,
699 BuildLibraryElementTask.PART_BUILT_UNITS_INPUT_NAME: partUnits
700 };
701 Map<ResultDescriptor, dynamic> outputs = _performTask(task);
702
703 LibraryElement libraryElement = outputs[BUILT_LIBRARY_ELEMENT];
704 return new _BuildLibraryElementTaskResult(librarySource, libraryUnit,
705 libraryUnitElement, partUnits, task, outputs, libraryElement);
706 }
707
708 /**
709 * Perform the given [task], record and return its outputs.
710 */
711 Map<ResultDescriptor, dynamic> _performTask(AnalysisTask task) {
712 AnalysisTarget target = task.target;
713 // perform the task
714 task.perform();
715 Map<ResultDescriptor, dynamic> outputs = task.outputs;
716 // file the cache entry
717 CacheEntry cacheEntry = getCacheEntry(target);
718 outputs.forEach((result, value) {
719 cacheEntry.setValue(result, value);
720 });
721 return outputs;
722 }
723 }
724
725 class _BuildLibraryElementTaskResult {
726 final Source librarySource;
727 final CompilationUnit libraryUnit;
728 final CompilationUnitElement libraryUnitElement;
729 final List<CompilationUnit> partUnits;
730 final BuildLibraryElementTask task;
731 final Map<ResultDescriptor, dynamic> outputs;
732 final LibraryElement libraryElement;
733 _BuildLibraryElementTaskResult(this.librarySource, this.libraryUnit,
734 this.libraryUnitElement, this.partUnits, this.task, this.outputs,
735 this.libraryElement);
736 }
737
613 class _MockContext extends TypedMock implements ExtendedAnalysisContext { 738 class _MockContext extends TypedMock implements ExtendedAnalysisContext {
614 Map<AnalysisTarget, CacheEntry> entryMap = <AnalysisTarget, CacheEntry>{}; 739 Map<AnalysisTarget, CacheEntry> entryMap = <AnalysisTarget, CacheEntry>{};
615 740
616 @override 741 @override
617 CacheEntry getCacheEntry(AnalysisTarget target) { 742 CacheEntry getCacheEntry(AnalysisTarget target) {
618 return entryMap.putIfAbsent(target, () => new CacheEntry()); 743 return entryMap.putIfAbsent(target, () => new CacheEntry());
619 } 744 }
620 745
621 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); 746 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
622 } 747 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/task/dart.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698