206 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			206 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| library angular2.src.analysis.analyzer_plugin.src.tasks_test;
 | |
| 
 | |
| import 'package:analyzer/file_system/file_system.dart';
 | |
| import 'package:analyzer/file_system/memory_file_system.dart';
 | |
| import 'package:analyzer/src/context/cache.dart';
 | |
| import 'package:analyzer/src/generated/engine.dart'
 | |
|     show AnalysisOptionsImpl, TimestampedData;
 | |
| import 'package:analyzer/src/generated/resolver.dart';
 | |
| import 'package:analyzer/src/generated/sdk.dart';
 | |
| import 'package:analyzer/src/generated/source.dart';
 | |
| import 'package:analyzer/src/task/dart.dart';
 | |
| import 'package:analyzer/src/task/driver.dart';
 | |
| import 'package:analyzer/src/task/general.dart';
 | |
| import 'package:analyzer/src/task/manager.dart';
 | |
| import 'package:analyzer/task/dart.dart';
 | |
| import 'package:analyzer/task/model.dart';
 | |
| import 'package:angular2/src/render/api.dart';
 | |
| import 'package:angular2_analyzer_plugin/src/tasks.dart';
 | |
| import 'package:test_reflective_loader/test_reflective_loader.dart';
 | |
| import 'package:typed_mock/typed_mock.dart';
 | |
| import 'package:unittest/unittest.dart';
 | |
| 
 | |
| import 'mock_sdk.dart';
 | |
| 
 | |
| main() {
 | |
|   groupSep = ' | ';
 | |
|   defineReflectiveTests(BuildUnitDirectivesTaskTest);
 | |
| }
 | |
| 
 | |
| @reflectiveTest
 | |
| class BuildUnitDirectivesTaskTest extends _AbstractDartTaskTest {
 | |
|   MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
 | |
| 
 | |
|   void test_Component() {
 | |
|     _addAngularSources();
 | |
|     Source source = _newSource('/test.dart', r'''
 | |
| import '/angular2/annotations.dart';
 | |
| 
 | |
| @Component(selector: 'comp-a')
 | |
| class ComponentA {
 | |
| }
 | |
| 
 | |
| @Component(selector: 'comp-b')
 | |
| class ComponentB {
 | |
| }
 | |
| ''');
 | |
|     LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
 | |
|     _computeResult(target, DIRECTIVES);
 | |
|     expect(task, new isInstanceOf<BuildUnitDirectivesTask>());
 | |
|     // validate
 | |
|     List<DirectiveMetadata> directives = outputs[DIRECTIVES];
 | |
|     expect(directives, hasLength(2));
 | |
|     expect(directives[0].selector, 'comp-a');
 | |
|     expect(directives[1].selector, 'comp-b');
 | |
|   }
 | |
| 
 | |
|   void test_Directive() {
 | |
|     _addAngularSources();
 | |
|     Source source = _newSource('/test.dart', r'''
 | |
| import '/angular2/annotations.dart';
 | |
| 
 | |
| @Directive(selector: 'deco-a')
 | |
| class ComponentA {
 | |
| }
 | |
| 
 | |
| @Directive(selector: 'deco-b')
 | |
| class ComponentB {
 | |
| }
 | |
| ''');
 | |
|     LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
 | |
|     _computeResult(target, DIRECTIVES);
 | |
|     expect(task, new isInstanceOf<BuildUnitDirectivesTask>());
 | |
|     // validate
 | |
|     List<DirectiveMetadata> directives = outputs[DIRECTIVES];
 | |
|     expect(directives, hasLength(2));
 | |
|     expect(directives[0].selector, 'deco-a');
 | |
|     expect(directives[1].selector, 'deco-b');
 | |
|   }
 | |
| 
 | |
|   void _addAngularSources() {
 | |
|     _newSource('/angular2/annotations.dart', r'''
 | |
| library angular2.src.core.annotations.annotations;
 | |
| 
 | |
| abstract class Directive {
 | |
|   final String selector;
 | |
|   final dynamic properties; 
 | |
|   final dynamic hostListeners;
 | |
|   final List lifecycle;
 | |
|   const Directive({selector, properties, hostListeners, lifecycle})
 | |
|   : selector = selector,
 | |
|     properties = properties,
 | |
|     hostListeners = hostListeners,
 | |
|     lifecycle = lifecycle,
 | |
|     super();
 | |
| }
 | |
| 
 | |
| class Component extends Directive {
 | |
|   final String changeDetection;
 | |
|   final List injectables;
 | |
|   const Component({selector, properties, events, hostListeners,
 | |
|       injectables, lifecycle, changeDetection: 'DEFAULT'})
 | |
|       : changeDetection = changeDetection,
 | |
|         injectables = injectables,
 | |
|         super(
 | |
|             selector: selector,
 | |
|             properties: properties,
 | |
|             events: events,
 | |
|             hostListeners: hostListeners,
 | |
|             lifecycle: lifecycle);
 | |
| }
 | |
| 
 | |
| ''');
 | |
|   }
 | |
| }
 | |
| 
 | |
| class _AbstractDartTaskTest {
 | |
|   MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
 | |
|   Source emptySource;
 | |
| 
 | |
|   DartSdk sdk = new MockSdk();
 | |
|   _MockContext context = new _MockContext();
 | |
|   Map<AnalysisTarget, CacheEntry> entryMap = <AnalysisTarget, CacheEntry>{};
 | |
| 
 | |
|   TaskManager taskManager = new TaskManager();
 | |
|   AnalysisDriver analysisDriver;
 | |
| 
 | |
|   AnalysisTask task;
 | |
|   Map<ResultDescriptor<dynamic>, dynamic> outputs;
 | |
| 
 | |
|   CacheEntry getCacheEntry(AnalysisTarget target) {
 | |
|     return entryMap.putIfAbsent(target, () => new CacheEntry());
 | |
|   }
 | |
| 
 | |
|   void setUp() {
 | |
|     emptySource = _newSource('/test.dart');
 | |
|     // prepare AnalysisContext
 | |
|     context.sourceFactory = new SourceFactory(<UriResolver>[
 | |
|       new DartUriResolver(sdk),
 | |
|       new ResourceUriResolver(resourceProvider)
 | |
|     ]);
 | |
|     // prepare TaskManager
 | |
|     taskManager.addTaskDescriptor(GetContentTask.DESCRIPTOR);
 | |
|     // TODO(scheglov) extract into API
 | |
|     taskManager.addTaskDescriptor(ScanDartTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(ParseDartTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(BuildClassConstructorsTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(BuildCompilationUnitElementTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(BuildLibraryConstructorsTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(BuildLibraryElementTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(BuildPublicNamespaceTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(BuildDirectiveElementsTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(BuildSourceClosuresTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(BuildExportNamespaceTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(BuildEnumMemberElementsTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(BuildFunctionTypeAliasesTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(BuildTypeProviderTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(GatherUsedImportedElementsTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(GatherUsedLocalElementsTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(GenerateHintsTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(ResolveUnitTypeNamesTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(ResolveLibraryTypeNamesTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(ResolveReferencesTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(ResolveVariableReferencesTask.DESCRIPTOR);
 | |
|     taskManager.addTaskDescriptor(VerifyUnitTask.DESCRIPTOR);
 | |
|     // Angular specific tasks
 | |
|     taskManager.addTaskDescriptor(BuildUnitDirectivesTask.DESCRIPTOR);
 | |
|     // prepare AnalysisDriver
 | |
|     analysisDriver = new AnalysisDriver(taskManager, context);
 | |
|   }
 | |
| 
 | |
|   void _computeResult(AnalysisTarget target, ResultDescriptor result) {
 | |
|     task = analysisDriver.computeResult(target, result);
 | |
|     expect(task.caughtException, isNull);
 | |
|     outputs = task.outputs;
 | |
|   }
 | |
| 
 | |
|   Source _newSource(String path, [String content = '']) {
 | |
|     File file = resourceProvider.newFile(path, content);
 | |
|     return file.createSource();
 | |
|   }
 | |
| }
 | |
| 
 | |
| class _MockContext extends TypedMock implements ExtendedAnalysisContext {
 | |
|   AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
 | |
|   SourceFactory sourceFactory;
 | |
|   TypeProvider typeProvider;
 | |
| 
 | |
|   Map<AnalysisTarget, CacheEntry> entryMap = <AnalysisTarget, CacheEntry>{};
 | |
| 
 | |
|   String get name => '_MockContext';
 | |
| 
 | |
|   bool exists(Source source) => source.exists();
 | |
| 
 | |
|   @override
 | |
|   CacheEntry getCacheEntry(AnalysisTarget target) {
 | |
|     return entryMap.putIfAbsent(target, () => new CacheEntry());
 | |
|   }
 | |
| 
 | |
|   TimestampedData<String> getContents(Source source) => source.contents;
 | |
| 
 | |
|   noSuchMethod(Invocation invocation) {
 | |
|     print('noSuchMethod: ${invocation.memberName}');
 | |
|     return super.noSuchMethod(invocation);
 | |
|   }
 | |
| }
 |