134 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
		
		
			
		
	
	
			134 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| 
								 | 
							
								library angular2.test.transform.integration;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import 'dart:io';
							 | 
						||
| 
								 | 
							
								import 'package:angular2/transformer.dart';
							 | 
						||
| 
								 | 
							
								import 'package:code_transformers/tests.dart';
							 | 
						||
| 
								 | 
							
								import 'package:dart_style/dart_style.dart';
							 | 
						||
| 
								 | 
							
								import 'package:unittest/unittest.dart';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import '../common/read_file.dart';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var formatter = new DartFormatter();
							 | 
						||
| 
								 | 
							
								var transform = new AngularTransformerGroup(new TransformerOptions(
							 | 
						||
| 
								 | 
							
								    'web/index.dart', reflectionEntryPoint: 'web/index.dart'));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class IntegrationTestConfig {
							 | 
						||
| 
								 | 
							
								  final String name;
							 | 
						||
| 
								 | 
							
								  final Map<String, String> assetPathToInputPath;
							 | 
						||
| 
								 | 
							
								  final Map<String, String> assetPathToExpectedOutputPath;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  IntegrationTestConfig(this.name,
							 | 
						||
| 
								 | 
							
								      {Map<String, String> inputs, Map<String, String> outputs})
							 | 
						||
| 
								 | 
							
								      : this.assetPathToInputPath = inputs,
							 | 
						||
| 
								 | 
							
								        this.assetPathToExpectedOutputPath = outputs;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void allTests() {
							 | 
						||
| 
								 | 
							
								  /*
							 | 
						||
| 
								 | 
							
								   * Each test has its own directory for inputs & an `expected` directory for
							 | 
						||
| 
								 | 
							
								   * expected outputs.
							 | 
						||
| 
								 | 
							
								   *
							 | 
						||
| 
								 | 
							
								   * In addition to these declared inputs, we inject a set of common inputs for
							 | 
						||
| 
								 | 
							
								   * every test.
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  var commonInputs = {
							 | 
						||
| 
								 | 
							
								    'angular2|lib/src/core/annotations/annotations.dart':
							 | 
						||
| 
								 | 
							
								        '../../../lib/src/core/annotations/annotations.dart',
							 | 
						||
| 
								 | 
							
								    'angular2|lib/src/core/application.dart': '../common/application.dart',
							 | 
						||
| 
								 | 
							
								    'angular2|lib/src/reflection/reflection_capabilities.dart':
							 | 
						||
| 
								 | 
							
								        '../common/reflection_capabilities.dart'
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var tests = [
							 | 
						||
| 
								 | 
							
								    new IntegrationTestConfig(
							 | 
						||
| 
								 | 
							
								        'should generate proper code for a Component defining only a selector.',
							 | 
						||
| 
								 | 
							
								        inputs: {
							 | 
						||
| 
								 | 
							
								      'a|web/index.dart': 'simple_annotation_files/index.dart',
							 | 
						||
| 
								 | 
							
								      'a|web/bar.dart': 'simple_annotation_files/bar.dart'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								        outputs: {
							 | 
						||
| 
								 | 
							
								      'a|web/bar.ngDeps.dart':
							 | 
						||
| 
								 | 
							
								          'simple_annotation_files/expected/bar.ngDeps.dart',
							 | 
						||
| 
								 | 
							
								      'a|web/index.ngDeps.dart':
							 | 
						||
| 
								 | 
							
								          'simple_annotation_files/expected/index.ngDeps.dart'
							 | 
						||
| 
								 | 
							
								    }),
							 | 
						||
| 
								 | 
							
								    new IntegrationTestConfig(
							 | 
						||
| 
								 | 
							
								        'should generate proper code for a Component using a selector defined '
							 | 
						||
| 
								 | 
							
								        'in another file.',
							 | 
						||
| 
								 | 
							
								        inputs: {
							 | 
						||
| 
								 | 
							
								      'a|web/index.dart': 'two_deps_files/index.dart',
							 | 
						||
| 
								 | 
							
								      'a|web/foo.dart': 'two_deps_files/foo.dart',
							 | 
						||
| 
								 | 
							
								      'a|web/bar.dart': 'two_deps_files/bar.dart'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								        outputs: {
							 | 
						||
| 
								 | 
							
								      'a|web/bar.ngDeps.dart': 'two_deps_files/expected/bar.ngDeps.dart'
							 | 
						||
| 
								 | 
							
								    }),
							 | 
						||
| 
								 | 
							
								    new IntegrationTestConfig(
							 | 
						||
| 
								 | 
							
								        'should generate proper code for a Component declaring a '
							 | 
						||
| 
								 | 
							
								        'componentService defined in another file.',
							 | 
						||
| 
								 | 
							
								        inputs: {
							 | 
						||
| 
								 | 
							
								      'a|web/index.dart': 'list_of_types_files/index.dart',
							 | 
						||
| 
								 | 
							
								      'a|web/foo.dart': 'list_of_types_files/foo.dart',
							 | 
						||
| 
								 | 
							
								      'a|web/bar.dart': 'list_of_types_files/bar.dart'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								        outputs: {
							 | 
						||
| 
								 | 
							
								      'a|web/bar.ngDeps.dart': 'list_of_types_files/expected/bar.ngDeps.dart'
							 | 
						||
| 
								 | 
							
								    }),
							 | 
						||
| 
								 | 
							
								    new IntegrationTestConfig(
							 | 
						||
| 
								 | 
							
								        'should generate a factory for a class with no declared ctor.',
							 | 
						||
| 
								 | 
							
								        inputs: {
							 | 
						||
| 
								 | 
							
								      'a|web/index.dart': 'synthetic_ctor_files/index.dart',
							 | 
						||
| 
								 | 
							
								      'a|web/bar.dart': 'synthetic_ctor_files/bar.dart'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								        outputs: {
							 | 
						||
| 
								 | 
							
								      'a|web/bar.ngDeps.dart': 'synthetic_ctor_files/expected/bar.ngDeps.dart'
							 | 
						||
| 
								 | 
							
								    }),
							 | 
						||
| 
								 | 
							
								    new IntegrationTestConfig('should preserve multiple annotations.',
							 | 
						||
| 
								 | 
							
								        inputs: {
							 | 
						||
| 
								 | 
							
								      'a|web/index.dart': 'two_annotations_files/index.dart',
							 | 
						||
| 
								 | 
							
								      'a|web/bar.dart': 'two_annotations_files/bar.dart',
							 | 
						||
| 
								 | 
							
								      'angular2|lib/src/core/annotations/template.dart':
							 | 
						||
| 
								 | 
							
								          '../../../lib/src/core/annotations/template.dart'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								        outputs: {
							 | 
						||
| 
								 | 
							
								      'a|web/bar.ngDeps.dart': 'two_annotations_files/expected/bar.ngDeps.dart'
							 | 
						||
| 
								 | 
							
								    }),
							 | 
						||
| 
								 | 
							
								    new IntegrationTestConfig(
							 | 
						||
| 
								 | 
							
								        'should ensure that dependencies are property chained.',
							 | 
						||
| 
								 | 
							
								        inputs: {
							 | 
						||
| 
								 | 
							
								      'a|web/index.dart': 'chained_deps_files/index.dart',
							 | 
						||
| 
								 | 
							
								      'a|web/foo.dart': 'chained_deps_files/foo.dart',
							 | 
						||
| 
								 | 
							
								      'a|web/bar.dart': 'chained_deps_files/bar.dart'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								        outputs: {
							 | 
						||
| 
								 | 
							
								      'a|web/bar.ngDeps.dart': 'chained_deps_files/expected/bar.ngDeps.dart',
							 | 
						||
| 
								 | 
							
								      'a|web/foo.ngDeps.dart': 'chained_deps_files/expected/foo.ngDeps.dart'
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var cache = {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (var config in tests) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Read in input & output files.
							 | 
						||
| 
								 | 
							
								    config.assetPathToInputPath
							 | 
						||
| 
								 | 
							
								      ..addAll(commonInputs)
							 | 
						||
| 
								 | 
							
								      ..forEach((key, value) {
							 | 
						||
| 
								 | 
							
								        config.assetPathToInputPath[key] =
							 | 
						||
| 
								 | 
							
								            cache.putIfAbsent(value, () => _readFile(value));
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    config.assetPathToExpectedOutputPath.forEach((key, value) {
							 | 
						||
| 
								 | 
							
								      config.assetPathToExpectedOutputPath[key] = cache.putIfAbsent(value, () {
							 | 
						||
| 
								 | 
							
								        var code = _readFile(value);
							 | 
						||
| 
								 | 
							
								        return value.endsWith('dart') ? formatter.format(code) : code;
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    testPhases(config.name, [
							 | 
						||
| 
								 | 
							
								      [transform]
							 | 
						||
| 
								 | 
							
								    ], config.assetPathToInputPath, config.assetPathToExpectedOutputPath, []);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Smooths over differences in CWD between IDEs and running tests in Travis.
							 | 
						||
| 
								 | 
							
								String _readFile(String path) => readFile('integration/$path');
							 |