105 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
		
		
			
		
	
	
			105 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
|  | library angular2.test.transform.common.annotation_matcher_test; | ||
|  | 
 | ||
|  | import 'dart:async'; | ||
|  | import 'package:analyzer/analyzer.dart'; | ||
|  | import 'package:angular2/src/transform/common/annotation_matcher.dart'; | ||
|  | import 'package:barback/barback.dart' show AssetId; | ||
|  | import 'package:guinness/guinness.dart'; | ||
|  | 
 | ||
|  | main() { | ||
|  |   allTests(); | ||
|  | } | ||
|  | 
 | ||
|  | var simpleAst = parseCompilationUnit('''
 | ||
|  | import 'package:test/test.dart'; | ||
|  | 
 | ||
|  | @Test() | ||
|  | var foo; | ||
|  | ''');
 | ||
|  | 
 | ||
|  | var namespacedAst = parseCompilationUnit('''
 | ||
|  | import 'package:test/test.dart' as test; | ||
|  | 
 | ||
|  | @test.Test() | ||
|  | var foo; | ||
|  | ''');
 | ||
|  | 
 | ||
|  | var relativePathAst = parseCompilationUnit('''
 | ||
|  | import 'test.dart'; | ||
|  | 
 | ||
|  | @Test() | ||
|  | var foo; | ||
|  | ''');
 | ||
|  | 
 | ||
|  | var namespacedRelativePathAst = parseCompilationUnit('''
 | ||
|  | import 'test.dart' as test; | ||
|  | 
 | ||
|  | @test.Test() | ||
|  | var foo; | ||
|  | ''');
 | ||
|  | 
 | ||
|  | void allTests() { | ||
|  |   it('should be able to match basic annotations.', () { | ||
|  |     var matcher = new AnnotationMatcher() | ||
|  |       ..add(const AnnotationDescriptor('Test', 'package:test/test.dart', null)); | ||
|  |     var visitor = new MatchRecordingVisitor(matcher); | ||
|  |     simpleAst.accept(visitor); | ||
|  |     expect(visitor.matches.length).toBe(1); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('should be able to match namespaced annotations.', () { | ||
|  |     var matcher = new AnnotationMatcher() | ||
|  |       ..add(const AnnotationDescriptor('Test', 'package:test/test.dart', null)); | ||
|  |     var visitor = new MatchRecordingVisitor(matcher); | ||
|  |     namespacedAst.accept(visitor); | ||
|  |     expect(visitor.matches.length).toBe(1); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('should be able to match relative imports.', () { | ||
|  |     var matcher = new AnnotationMatcher() | ||
|  |       ..add(const AnnotationDescriptor('Test', 'package:test/test.dart', null)); | ||
|  |     var visitor = | ||
|  |         new MatchRecordingVisitor(matcher, new AssetId('test', 'lib/foo.dart')); | ||
|  |     relativePathAst.accept(visitor); | ||
|  |     expect(visitor.matches.length).toBe(1); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('should be able to match relative imports with a namespace.', () { | ||
|  |     var matcher = new AnnotationMatcher() | ||
|  |       ..add(const AnnotationDescriptor('Test', 'package:test/test.dart', null)); | ||
|  |     var visitor = | ||
|  |         new MatchRecordingVisitor(matcher, new AssetId('test', 'lib/foo.dart')); | ||
|  |     namespacedRelativePathAst.accept(visitor); | ||
|  |     expect(visitor.matches.length).toBe(1); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('should not match annotations if the import is missing.', () { | ||
|  |     var matcher = new AnnotationMatcher() | ||
|  |       ..add(const AnnotationDescriptor('Test', 'package:test/foo.dart', null)); | ||
|  |     var visitor = new MatchRecordingVisitor(matcher); | ||
|  |     simpleAst.accept(visitor); | ||
|  |     expect(visitor.matches.isEmpty).toBeTrue(); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('should not match annotations if the name is different.', () { | ||
|  |     var matcher = new AnnotationMatcher() | ||
|  |       ..add(const AnnotationDescriptor('Foo', 'package:test/test.dart', null)); | ||
|  |     var visitor = new MatchRecordingVisitor(matcher); | ||
|  |     simpleAst.accept(visitor); | ||
|  |     expect(visitor.matches.isEmpty).toBeTrue(); | ||
|  |   }); | ||
|  | } | ||
|  | 
 | ||
|  | class MatchRecordingVisitor extends RecursiveAstVisitor { | ||
|  |   final AssetId assetId; | ||
|  |   final AnnotationMatcher matcher; | ||
|  |   final List<Annotation> matches = []; | ||
|  | 
 | ||
|  |   MatchRecordingVisitor(this.matcher, [this.assetId]) : super(); | ||
|  | 
 | ||
|  |   @override | ||
|  |   void visitAnnotation(Annotation annotation) { | ||
|  |     if (matcher.hasMatch(annotation, assetId)) matches.add(annotation); | ||
|  |   } | ||
|  | } |