| OLD | NEW |
| 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 /// Tests code generation. | 5 /// Tests code generation. |
| 6 /// Runs Dart Dev Compiler on all input in the `codegen` directory and checks | 6 /// Runs Dart Dev Compiler on all input in the `codegen` directory and checks |
| 7 /// that the output is what we expected. | 7 /// that the output is what we expected. |
| 8 library dev_compiler.test.codegen_test; | 8 library dev_compiler.test.codegen_test; |
| 9 | 9 |
| 10 import 'dart:io'; | 10 import 'dart:io'; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 | 40 |
| 41 tearDown(() { | 41 tearDown(() { |
| 42 if (loggerSub != null) { | 42 if (loggerSub != null) { |
| 43 loggerSub.cancel(); | 43 loggerSub.cancel(); |
| 44 loggerSub = null; | 44 loggerSub = null; |
| 45 } | 45 } |
| 46 }); | 46 }); |
| 47 | 47 |
| 48 var inputDir = path.join(testDirectory, 'codegen'); | 48 var inputDir = path.join(testDirectory, 'codegen'); |
| 49 var expectDir = path.join(inputDir, 'expect'); | 49 var expectDir = path.join(inputDir, 'expect'); |
| 50 var paths = new Directory(inputDir) | |
| 51 .listSync() | |
| 52 .where((f) => f is File) | |
| 53 .map((f) => f.path) | |
| 54 .where((p) => p.endsWith('.dart') && filePattern.hasMatch(p)); | |
| 55 | 50 |
| 56 bool compile(String entryPoint, AnalysisContext context, | 51 bool compile(String entryPoint, AnalysisContext context, |
| 57 {bool checkSdk: false, bool sourceMaps: false, String subDir}) { | 52 {bool checkSdk: false, bool sourceMaps: false}) { |
| 58 // TODO(jmesserly): add a way to specify flags in the test file, so | 53 // TODO(jmesserly): add a way to specify flags in the test file, so |
| 59 // they're more self-contained. | 54 // they're more self-contained. |
| 60 var runtimeDir = path.join(path.dirname(testDirectory), 'lib', 'runtime'); | 55 var runtimeDir = path.join(path.dirname(testDirectory), 'lib', 'runtime'); |
| 61 var options = new CompilerOptions( | 56 var options = new CompilerOptions( |
| 62 codegenOptions: new CodegenOptions( | 57 codegenOptions: new CodegenOptions( |
| 63 outputDir: subDir == null | 58 outputDir: expectDir, |
| 64 ? expectDir | |
| 65 : path.join(expectDir, subDir), | |
| 66 emitSourceMaps: sourceMaps, | 59 emitSourceMaps: sourceMaps, |
| 67 forceCompile: checkSdk), | 60 forceCompile: checkSdk), |
| 68 useColors: false, | 61 useColors: false, |
| 69 checkSdk: checkSdk, | 62 checkSdk: checkSdk, |
| 70 runtimeDir: runtimeDir, | 63 runtimeDir: runtimeDir, |
| 71 inputs: [entryPoint]); | 64 inputs: [entryPoint], |
| 65 inputBaseDir: inputDir); |
| 72 var reporter = createErrorReporter(context, options); | 66 var reporter = createErrorReporter(context, options); |
| 73 return new BatchCompiler(context, options, reporter: reporter).run(); | 67 return new BatchCompiler(context, options, reporter: reporter).run(); |
| 74 } | 68 } |
| 75 | 69 |
| 76 // Remove old output, and `packages` symlinks which mess up the diff. | 70 // Remove old output, and `packages` symlinks which mess up the diff. |
| 77 var dir = new Directory(expectDir); | 71 var dir = new Directory(expectDir); |
| 78 if (dir.existsSync()) dir.deleteSync(recursive: true); | 72 if (dir.existsSync()) dir.deleteSync(recursive: true); |
| 79 var packagesDirs = new Directory(inputDir) | 73 var packagesDirs = new Directory(inputDir) |
| 80 .listSync(recursive: true) | 74 .listSync(recursive: true) |
| 81 .where((d) => d is Directory && path.basename(d.path) == 'packages'); | 75 .where((d) => d is Directory && path.basename(d.path) == 'packages'); |
| 82 packagesDirs.forEach((d) => d.deleteSync()); | 76 packagesDirs.forEach((d) => d.deleteSync()); |
| 83 | 77 |
| 84 for (var filePath in paths) { | 78 for (var dir in [null, 'language']) { |
| 85 var filename = path.basenameWithoutExtension(filePath); | 79 group('dartdevc ' + path.join('test', 'codegen', dir), () { |
| 80 var testFiles = new Directory(path.join(inputDir, dir)) |
| 81 .listSync() |
| 82 .where((f) => f is File) |
| 83 .map((f) => f.path) |
| 84 .where((p) => p.endsWith('.dart') && filePattern.hasMatch(p)); |
| 86 | 85 |
| 87 test('devc $filename.dart', () { | 86 for (var filePath in testFiles) { |
| 88 compilerMessages.writeln('// Messages from compiling $filename.dart'); | 87 var filename = path.basenameWithoutExtension(filePath); |
| 89 | 88 |
| 90 // TODO(jmesserly): this was added to get some coverage of source maps | 89 test('$filename.dart', () { |
| 91 // We need a more comprehensive strategy to test them. | 90 compilerMessages.writeln('// Messages from compiling $filename.dart'); |
| 92 var sourceMaps = filename == 'map_keys'; | |
| 93 var success = compile(filePath, realSdkContext, sourceMaps: sourceMaps); | |
| 94 | 91 |
| 95 // Write compiler messages to disk. | 92 // TODO(jmesserly): this was added to get some coverage of source maps |
| 96 new File(path.join(expectDir, '$filename.txt')) | 93 // We need a more comprehensive strategy to test them. |
| 97 .writeAsStringSync(compilerMessages.toString()); | 94 var sourceMaps = filename == 'map_keys'; |
| 95 var success = |
| 96 compile(filePath, realSdkContext, sourceMaps: sourceMaps); |
| 98 | 97 |
| 99 var outFile = new File(path.join(expectDir, '$filename.js')); | 98 // Write compiler messages to disk. |
| 100 expect(outFile.existsSync(), success, | 99 var outDir = path.join(expectDir, dir); |
| 101 reason: '${outFile.path} was created iff compilation succeeds'); | 100 new File(path.join(outDir, '$filename.txt')) |
| 101 .writeAsStringSync(compilerMessages.toString()); |
| 102 | 102 |
| 103 // TODO(jmesserly): ideally we'd diff the output here. For now it | 103 var outFile = new File(path.join(outDir, '$filename.js')); |
| 104 // happens in the containing shell script. | 104 expect(outFile.existsSync(), success, |
| 105 reason: '${outFile.path} was created iff compilation succeeds'); |
| 106 |
| 107 // TODO(jmesserly): ideally we'd diff the output here. For now it |
| 108 // happens in the containing shell script. |
| 109 }); |
| 110 } |
| 105 }); | 111 }); |
| 106 } | 112 } |
| 107 | 113 |
| 108 if (Platform.environment.containsKey('COVERALLS_TOKEN')) { | 114 if (Platform.environment.containsKey('COVERALLS_TOKEN')) { |
| 109 group('sdk', () { | 115 group('sdk', () { |
| 110 // The analyzer does not bubble exception messages for certain internal | 116 // The analyzer does not bubble exception messages for certain internal |
| 111 // dart:* library failures, such as failing to find | 117 // dart:* library failures, such as failing to find |
| 112 // "_internal/libraries.dart". Instead it produces an opaque "failed to | 118 // "_internal/libraries.dart". Instead it produces an opaque "failed to |
| 113 // instantiate dart:core" message. To remedy this we hook up an analysis | 119 // instantiate dart:core" message. To remedy this we hook up an analysis |
| 114 // logger that prints these messages. | 120 // logger that prints these messages. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 137 }); | 143 }); |
| 138 } | 144 } |
| 139 | 145 |
| 140 var expectedRuntime = | 146 var expectedRuntime = |
| 141 defaultRuntimeFiles.map((f) => 'dev_compiler/runtime/$f'); | 147 defaultRuntimeFiles.map((f) => 'dev_compiler/runtime/$f'); |
| 142 | 148 |
| 143 test('devc jscodegen sunflower.html', () { | 149 test('devc jscodegen sunflower.html', () { |
| 144 var filePath = path.join(inputDir, 'sunflower', 'sunflower.html'); | 150 var filePath = path.join(inputDir, 'sunflower', 'sunflower.html'); |
| 145 compilerMessages.writeln('// Messages from compiling sunflower.html'); | 151 compilerMessages.writeln('// Messages from compiling sunflower.html'); |
| 146 | 152 |
| 147 var success = compile(filePath, realSdkContext, subDir: 'sunflower'); | 153 var success = compile(filePath, realSdkContext); |
| 148 | 154 |
| 149 // Write compiler messages to disk. | 155 // Write compiler messages to disk. |
| 150 new File(path.join(expectDir, 'sunflower', 'sunflower.txt')) | 156 new File(path.join(expectDir, 'sunflower', 'sunflower.txt')) |
| 151 .writeAsStringSync(compilerMessages.toString()); | 157 .writeAsStringSync(compilerMessages.toString()); |
| 152 | 158 |
| 153 var expectedFiles = [ | 159 var expectedFiles = ['sunflower.html', 'sunflower.js',]; |
| 154 'sunflower.html', | |
| 155 'sunflower.js', | |
| 156 ]..addAll(expectedRuntime); | |
| 157 | 160 |
| 158 for (var filepath in expectedFiles) { | 161 for (var filepath in expectedFiles) { |
| 159 var outFile = new File(path.join(expectDir, 'sunflower', filepath)); | 162 var outFile = new File(path.join(expectDir, 'sunflower', filepath)); |
| 160 expect(outFile.existsSync(), success, | 163 expect(outFile.existsSync(), success, |
| 161 reason: '${outFile.path} was created iff compilation succeeds'); | 164 reason: '${outFile.path} was created iff compilation succeeds'); |
| 162 } | 165 } |
| 163 }); | 166 }); |
| 164 | 167 |
| 165 test('devc jscodegen html_input.html', () { | 168 test('devc jscodegen html_input.html', () { |
| 166 var filePath = path.join(inputDir, 'html_input.html'); | 169 var filePath = path.join(inputDir, 'html_input.html'); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 195 print('[AnalysisEngine] error $message $exception'); | 198 print('[AnalysisEngine] error $message $exception'); |
| 196 } | 199 } |
| 197 | 200 |
| 198 @override void logError2(String message, Object exception) { | 201 @override void logError2(String message, Object exception) { |
| 199 print('[AnalysisEngine] error $message $exception'); | 202 print('[AnalysisEngine] error $message $exception'); |
| 200 } | 203 } |
| 201 | 204 |
| 202 void logInformation(String message, [CaughtException exception]) {} | 205 void logInformation(String message, [CaughtException exception]) {} |
| 203 void logInformation2(String message, Object exception) {} | 206 void logInformation2(String message, Object exception) {} |
| 204 } | 207 } |
| OLD | NEW |