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);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |