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'; |
11 import 'package:analyzer/src/generated/engine.dart' | 11 import 'package:analyzer/src/generated/engine.dart' |
12 show AnalysisContext, AnalysisEngine, Logger; | 12 show AnalysisContext, AnalysisEngine, Logger; |
13 import 'package:analyzer/src/generated/java_engine.dart' show CaughtException; | 13 import 'package:analyzer/src/generated/java_engine.dart' show CaughtException; |
| 14 import 'package:analyzer/src/generated/source_io.dart'; |
14 import 'package:args/args.dart'; | 15 import 'package:args/args.dart'; |
| 16 import 'package:cli_util/cli_util.dart' show getSdkDir; |
15 import 'package:logging/logging.dart' show Level; | 17 import 'package:logging/logging.dart' show Level; |
16 import 'package:path/path.dart' as path; | 18 import 'package:path/path.dart' as path; |
17 import 'package:test/test.dart'; | 19 import 'package:test/test.dart'; |
18 | 20 |
19 import 'package:dev_compiler/devc.dart'; | 21 import 'package:dev_compiler/devc.dart'; |
| 22 import 'package:dev_compiler/src/analysis_context.dart'; |
20 import 'package:dev_compiler/src/compiler.dart' show defaultRuntimeFiles; | 23 import 'package:dev_compiler/src/compiler.dart' show defaultRuntimeFiles; |
21 import 'package:dev_compiler/src/options.dart'; | 24 import 'package:dev_compiler/src/options.dart'; |
22 import 'package:dev_compiler/src/report.dart' show LogReporter; | 25 import 'package:dev_compiler/src/report.dart' show LogReporter; |
23 | 26 |
24 import 'testing.dart' show realSdkContext, testDirectory; | 27 import 'testing.dart' show testDirectory; |
25 import 'multitest.dart'; | 28 import 'multitest.dart'; |
26 | 29 |
27 final ArgParser argParser = new ArgParser() | 30 final ArgParser argParser = new ArgParser() |
28 ..addOption('dart-sdk', help: 'Dart SDK Path', defaultsTo: null); | 31 ..addOption('dart-sdk', help: 'Dart SDK Path', defaultsTo: null); |
29 | 32 |
30 final inputDir = path.join(testDirectory, 'codegen'); | 33 final inputDir = path.join(testDirectory, 'codegen'); |
31 | 34 |
32 Iterable<String> _findTests(String dir, RegExp filePattern) { | 35 Iterable<String> _findTests(String dir, RegExp filePattern) { |
33 var files = new Directory(dir) | 36 var files = new Directory(dir) |
34 .listSync() | 37 .listSync() |
(...skipping 23 matching lines...) Expand all Loading... |
58 | 61 |
59 tearDown(() { | 62 tearDown(() { |
60 if (loggerSub != null) { | 63 if (loggerSub != null) { |
61 loggerSub.cancel(); | 64 loggerSub.cancel(); |
62 loggerSub = null; | 65 loggerSub = null; |
63 } | 66 } |
64 }); | 67 }); |
65 | 68 |
66 var expectDir = path.join(inputDir, 'expect'); | 69 var expectDir = path.join(inputDir, 'expect'); |
67 | 70 |
68 BatchCompiler createCompiler(AnalysisContext context, | 71 BatchCompiler createCompiler(DartUriResolver sdkResolver, {bool checkSdk: fals
e, |
69 {bool checkSdk: false, | |
70 bool sourceMaps: false, | 72 bool sourceMaps: false, |
71 bool destructureNamedParams: false, | 73 bool destructureNamedParams: false, |
72 bool closure: false, | 74 bool closure: false, |
73 ModuleFormat moduleFormat: ModuleFormat.legacy}) { | 75 ModuleFormat moduleFormat: ModuleFormat.legacy}) { |
| 76 |
| 77 String _testCodegenPath(String p1, [String p2]) => |
| 78 path.join(testDirectory, 'codegen', p1, p2); |
| 79 |
| 80 var context = createAnalysisContextWithSources(new SourceResolverOptions( |
| 81 customUrlMappings: { |
| 82 'package:expect/expect.dart': _testCodegenPath('expect.dart'), |
| 83 'package:async_helper/async_helper.dart': |
| 84 _testCodegenPath('async_helper.dart'), |
| 85 'package:unittest/unittest.dart': _testCodegenPath('unittest.dart'), |
| 86 'package:dom/dom.dart': _testCodegenPath('sunflower', 'dom.dart') |
| 87 }), sdkResolver: sdkResolver); |
| 88 |
74 // TODO(jmesserly): add a way to specify flags in the test file, so | 89 // TODO(jmesserly): add a way to specify flags in the test file, so |
75 // they're more self-contained. | 90 // they're more self-contained. |
76 var runtimeDir = path.join(path.dirname(testDirectory), 'lib', 'runtime'); | 91 var runtimeDir = path.join(path.dirname(testDirectory), 'lib', 'runtime'); |
77 var options = new CompilerOptions( | 92 var options = new CompilerOptions( |
78 codegenOptions: new CodegenOptions( | 93 codegenOptions: new CodegenOptions( |
79 outputDir: expectDir, | 94 outputDir: expectDir, |
80 emitSourceMaps: sourceMaps, | 95 emitSourceMaps: sourceMaps, |
81 closure: closure, | 96 closure: closure, |
82 destructureNamedParams: destructureNamedParams, | 97 destructureNamedParams: destructureNamedParams, |
83 forceCompile: checkSdk, | 98 forceCompile: checkSdk, |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 var filename = path.basenameWithoutExtension(filePath); | 145 var filename = path.basenameWithoutExtension(filePath); |
131 tests.forEach((name, contents) { | 146 tests.forEach((name, contents) { |
132 new File(path.join(fullDir, '${filename}_${name}_multi.dart')) | 147 new File(path.join(fullDir, '${filename}_${name}_multi.dart')) |
133 .writeAsStringSync(contents); | 148 .writeAsStringSync(contents); |
134 }); | 149 }); |
135 } | 150 } |
136 } | 151 } |
137 } | 152 } |
138 } | 153 } |
139 | 154 |
140 var batchCompiler = createCompiler(realSdkContext); | 155 var realSdkResolver = createSdkPathResolver(getSdkDir().path); |
| 156 var batchCompiler = createCompiler(realSdkResolver); |
141 | 157 |
142 var allDirs = [null]; | 158 var allDirs = [null]; |
143 allDirs.addAll(testDirs); | 159 allDirs.addAll(testDirs); |
144 for (var dir in allDirs) { | 160 for (var dir in allDirs) { |
145 if (codeCoverage && dir != null) continue; | 161 if (codeCoverage && dir != null) continue; |
146 | 162 |
147 group('dartdevc ' + path.join('test', 'codegen', dir), () { | 163 group('dartdevc ' + path.join('test', 'codegen', dir), () { |
148 var outDir = new Directory(path.join(expectDir, dir)); | 164 var outDir = new Directory(path.join(expectDir, dir)); |
149 if (!outDir.existsSync()) outDir.createSync(recursive: true); | 165 if (!outDir.existsSync()) outDir.createSync(recursive: true); |
150 | 166 |
(...skipping 16 matching lines...) Expand all Loading... |
167 ? ModuleFormat.node | 183 ? ModuleFormat.node |
168 : ModuleFormat.legacy; | 184 : ModuleFormat.legacy; |
169 var success; | 185 var success; |
170 // TODO(vsm): Is it okay to reuse the same context here? If there is | 186 // TODO(vsm): Is it okay to reuse the same context here? If there is |
171 // overlap between test files, we may need separate ones for each | 187 // overlap between test files, we may need separate ones for each |
172 // compiler. | 188 // compiler. |
173 var compiler = (sourceMaps || | 189 var compiler = (sourceMaps || |
174 closure || | 190 closure || |
175 destructureNamedParams || | 191 destructureNamedParams || |
176 moduleFormat != ModuleFormat.legacy) | 192 moduleFormat != ModuleFormat.legacy) |
177 ? createCompiler(realSdkContext, | 193 ? createCompiler(realSdkResolver, |
178 sourceMaps: sourceMaps, | 194 sourceMaps: sourceMaps, |
179 destructureNamedParams: destructureNamedParams, | 195 destructureNamedParams: destructureNamedParams, |
180 closure: closure, | 196 closure: closure, |
181 moduleFormat: moduleFormat) | 197 moduleFormat: moduleFormat) |
182 : batchCompiler; | 198 : batchCompiler; |
183 success = compile(compiler, filePath); | 199 success = compile(compiler, filePath); |
184 | 200 |
185 var outFile = new File(path.join(outDir.path, '$filename.js')); | 201 var outFile = new File(path.join(outDir.path, '$filename.js')); |
186 expect(!success || outFile.existsSync(), true, | 202 expect(!success || outFile.existsSync(), true, |
187 reason: '${outFile.path} was created if compilation succeeds'); | 203 reason: '${outFile.path} was created if compilation succeeds'); |
(...skipping 12 matching lines...) Expand all Loading... |
200 var savedLogger; | 216 var savedLogger; |
201 setUp(() { | 217 setUp(() { |
202 savedLogger = AnalysisEngine.instance.logger; | 218 savedLogger = AnalysisEngine.instance.logger; |
203 AnalysisEngine.instance.logger = new PrintLogger(); | 219 AnalysisEngine.instance.logger = new PrintLogger(); |
204 }); | 220 }); |
205 tearDown(() { | 221 tearDown(() { |
206 AnalysisEngine.instance.logger = savedLogger; | 222 AnalysisEngine.instance.logger = savedLogger; |
207 }); | 223 }); |
208 | 224 |
209 test('devc dart:core', () { | 225 test('devc dart:core', () { |
210 var testSdkContext = createAnalysisContextWithSources( | 226 var testSdkResolver = createSdkPathResolver(path.join( |
211 new SourceResolverOptions(dartSdkPath: path.join( | 227 testDirectory, '..', 'tool', 'generated_sdk')); |
212 testDirectory, '..', 'tool', 'generated_sdk'))); | |
213 | 228 |
214 // Get the test SDK. We use a checked in copy so test expectations can | 229 // Get the test SDK. We use a checked in copy so test expectations can |
215 // be generated against a specific SDK version. | 230 // be generated against a specific SDK version. |
216 var compiler = createCompiler(testSdkContext, checkSdk: true); | 231 var compiler = createCompiler(testSdkResolver, checkSdk: true); |
217 compile(compiler, 'dart:core'); | 232 compile(compiler, 'dart:core'); |
218 var outFile = new File(path.join(expectDir, 'dart/core.js')); | 233 var outFile = new File(path.join(expectDir, 'dart/core.js')); |
219 expect(outFile.existsSync(), true, | 234 expect(outFile.existsSync(), true, |
220 reason: '${outFile.path} was created for dart:core'); | 235 reason: '${outFile.path} was created for dart:core'); |
221 }); | 236 }); |
222 }); | 237 }); |
223 } | 238 } |
224 | 239 |
225 var expectedRuntime = | 240 var expectedRuntime = |
226 defaultRuntimeFiles.map((f) => 'dev_compiler/runtime/$f'); | 241 defaultRuntimeFiles.map((f) => 'dev_compiler/runtime/$f'); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 /// An implementation of analysis engine's [Logger] that prints. | 277 /// An implementation of analysis engine's [Logger] that prints. |
263 class PrintLogger implements Logger { | 278 class PrintLogger implements Logger { |
264 @override | 279 @override |
265 void logError(String message, [CaughtException exception]) { | 280 void logError(String message, [CaughtException exception]) { |
266 print('[AnalysisEngine] error $message $exception'); | 281 print('[AnalysisEngine] error $message $exception'); |
267 } | 282 } |
268 | 283 |
269 void logInformation(String message, [CaughtException exception]) {} | 284 void logInformation(String message, [CaughtException exception]) {} |
270 void logInformation2(String message, Object exception) {} | 285 void logInformation2(String message, Object exception) {} |
271 } | 286 } |
OLD | NEW |