| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 /// | 6 /// |
| 7 /// Runs Dart Dev Compiler on all input in the `codegen` directory and checks | 7 /// Runs Dart Dev Compiler on all input in the `codegen` directory and checks |
| 8 /// that the output is what we expected. | 8 /// that the output is what we expected. |
| 9 library dev_compiler.test.codegen_test; | 9 library dev_compiler.test.codegen_test; |
| 10 | 10 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 // TODO(jmesserly): switch this to a .packages file. | 59 // TODO(jmesserly): switch this to a .packages file. |
| 60 final packageUrlMappings = { | 60 final packageUrlMappings = { |
| 61 'package:expect/expect.dart': path.join(codegenDir, 'expect.dart'), | 61 'package:expect/expect.dart': path.join(codegenDir, 'expect.dart'), |
| 62 'package:async_helper/async_helper.dart': | 62 'package:async_helper/async_helper.dart': |
| 63 path.join(codegenDir, 'async_helper.dart'), | 63 path.join(codegenDir, 'async_helper.dart'), |
| 64 'package:js/js.dart': path.join(codegenDir, 'packages', 'js', 'js.dart') | 64 'package:js/js.dart': path.join(codegenDir, 'packages', 'js', 'js.dart') |
| 65 }; | 65 }; |
| 66 | 66 |
| 67 final codeCoverage = Platform.environment.containsKey('COVERALLS_TOKEN'); | 67 final codeCoverage = Platform.environment.containsKey('COVERALLS_TOKEN'); |
| 68 | 68 |
| 69 RegExp filePattern; |
| 70 |
| 69 main(List<String> arguments) { | 71 main(List<String> arguments) { |
| 70 if (arguments == null) arguments = []; | 72 if (arguments == null) arguments = []; |
| 71 ArgResults args = argParser.parse(arguments); | 73 ArgResults args = argParser.parse(arguments); |
| 72 var filePattern = new RegExp(args.rest.length > 0 ? args.rest[0] : '.'); | 74 filePattern = new RegExp(args.rest.length > 0 ? args.rest[0] : '.'); |
| 73 | 75 |
| 74 var sdkDir = path.join(repoDirectory, 'gen', 'patched_sdk'); | 76 var sdkDir = path.join(repoDirectory, 'gen', 'patched_sdk'); |
| 75 var sdkSummaryFile = | 77 var sdkSummaryFile = |
| 76 path.join(testDirectory, '..', 'lib', 'runtime', 'dart_sdk.sum'); | 78 path.join(testDirectory, '..', 'lib', 'runtime', 'dart_sdk.sum'); |
| 77 var analyzerOptions = new AnalyzerOptions( | 79 var analyzerOptions = new AnalyzerOptions( |
| 78 customUrlMappings: packageUrlMappings, | 80 customUrlMappings: packageUrlMappings, |
| 79 dartSdkSummaryPath: sdkSummaryFile); | 81 dartSdkSummaryPath: sdkSummaryFile); |
| 80 var compiler = new ModuleCompiler(analyzerOptions); | 82 var compiler = new ModuleCompiler(analyzerOptions); |
| 81 | 83 |
| 82 // Build packages tests depend on. | 84 // Build packages tests depend on. |
| 83 _buildAllPackages(compiler); | 85 _buildAllPackages(compiler); |
| 84 | 86 |
| 85 var testDirs = [ | 87 var testDirs = [ |
| 86 'language', | 88 'language', |
| 87 'corelib', | 89 'corelib', |
| 88 path.join('lib', 'convert'), | 90 path.join('lib', 'convert'), |
| 89 path.join('lib', 'html'), | 91 path.join('lib', 'html'), |
| 90 path.join('lib', 'math'), | 92 path.join('lib', 'math'), |
| 91 path.join('lib', 'typed_data'), | 93 path.join('lib', 'typed_data'), |
| 92 ]; | 94 ]; |
| 93 | 95 |
| 94 // Copy all of the test files and expanded multitest files to | 96 // Copy all of the test files and expanded multitest files to |
| 95 // gen/codegen_tests. We'll compile from there. | 97 // gen/codegen_tests. We'll compile from there. |
| 96 var testFiles = _setUpTests(testDirs, filePattern); | 98 var testFiles = _setUpTests(testDirs); |
| 97 | 99 |
| 98 // Our default compiler options. Individual tests can override these. | 100 // Our default compiler options. Individual tests can override these. |
| 99 var defaultOptions = ['--no-source-map', '--no-summarize']; | 101 var defaultOptions = ['--no-source-map', '--no-summarize']; |
| 100 var compilerArgParser = CompilerOptions.addArguments(new ArgParser()); | 102 var compilerArgParser = CompilerOptions.addArguments(new ArgParser()); |
| 101 | 103 |
| 102 // Compile each test file to JS and put the result in gen/codegen_output. | 104 // Compile each test file to JS and put the result in gen/codegen_output. |
| 103 for (var testFile in testFiles) { | 105 for (var testFile in testFiles) { |
| 104 var relativePath = path.relative(testFile, from: codegenTestDir); | 106 var relativePath = path.relative(testFile, from: codegenTestDir); |
| 105 | 107 |
| 106 // Only compile the top-level files for generating coverage. | 108 // Only compile the top-level files for generating coverage. |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 expectFile.writeAsStringSync("//FAILED TO COMPILE"); | 206 expectFile.writeAsStringSync("//FAILED TO COMPILE"); |
| 205 } | 207 } |
| 206 } | 208 } |
| 207 | 209 |
| 208 void _buildAllPackages(ModuleCompiler compiler) { | 210 void _buildAllPackages(ModuleCompiler compiler) { |
| 209 group('dartdevc package', () { | 211 group('dartdevc package', () { |
| 210 _buildPackages(compiler, codegenOutputDir, codegenExpectDir); | 212 _buildPackages(compiler, codegenOutputDir, codegenExpectDir); |
| 211 | 213 |
| 212 var packages = ['matcher', 'path', 'stack_trace']; | 214 var packages = ['matcher', 'path', 'stack_trace']; |
| 213 for (var package in packages) { | 215 for (var package in packages) { |
| 216 if (!filePattern.hasMatch(package)) continue; |
| 214 test(package, () { | 217 test(package, () { |
| 215 _buildPackage(compiler, codegenOutputDir, codegenExpectDir, package); | 218 _buildPackage(compiler, codegenOutputDir, codegenExpectDir, package); |
| 216 }); | 219 }); |
| 217 } | 220 } |
| 218 | 221 |
| 222 if (!filePattern.hasMatch('unittest')) return; |
| 223 |
| 219 test('unittest', () { | 224 test('unittest', () { |
| 220 // Only build files applicable to the web - html_*.dart and its | 225 // Only build files applicable to the web - html_*.dart and its |
| 221 // internal dependences. | 226 // internal dependences. |
| 222 _buildPackage(compiler, codegenOutputDir, codegenExpectDir, "unittest", | 227 _buildPackage(compiler, codegenOutputDir, codegenExpectDir, "unittest", |
| 223 packageFiles: [ | 228 packageFiles: [ |
| 224 'unittest.dart', | 229 'unittest.dart', |
| 225 'html_config.dart', | 230 'html_config.dart', |
| 226 'html_individual_config.dart', | 231 'html_individual_config.dart', |
| 227 'html_enhanced_config.dart' | 232 'html_enhanced_config.dart' |
| 228 ]); | 233 ]); |
| 229 }); | 234 }); |
| 230 }); | 235 }); |
| 231 | 236 |
| 237 if (!filePattern.hasMatch('sunflower')) return; |
| 238 |
| 232 test('dartdevc sunflower', () { | 239 test('dartdevc sunflower', () { |
| 233 _buildSunflower(compiler, codegenOutputDir, codegenExpectDir); | 240 _buildSunflower(compiler, codegenOutputDir, codegenExpectDir); |
| 234 }); | 241 }); |
| 235 } | 242 } |
| 236 | 243 |
| 237 void _buildSunflower( | 244 void _buildSunflower( |
| 238 ModuleCompiler compiler, String outputDir, String expectDir) { | 245 ModuleCompiler compiler, String outputDir, String expectDir) { |
| 239 var baseDir = path.join(codegenDir, 'sunflower'); | 246 var baseDir = path.join(codegenDir, 'sunflower'); |
| 240 var files = ['sunflower', 'circle', 'painter'] | 247 var files = ['sunflower', 'circle', 'painter'] |
| 241 .map((f) => path.join(baseDir, '$f.dart')) | 248 .map((f) => path.join(baseDir, '$f.dart')) |
| 242 .toList(); | 249 .toList(); |
| 243 var input = new BuildUnit('sunflower', baseDir, files, _moduleForLibrary); | 250 var input = new BuildUnit('sunflower', baseDir, files, _moduleForLibrary); |
| 244 var options = new CompilerOptions(summarizeApi: false); | 251 var options = new CompilerOptions(summarizeApi: false); |
| 245 | 252 |
| 246 var built = compiler.compile(input, options); | 253 var built = compiler.compile(input, options); |
| 247 _writeModule(path.join(outputDir, 'sunflower', 'sunflower'), | 254 _writeModule(path.join(outputDir, 'sunflower', 'sunflower'), |
| 248 path.join(expectDir, 'sunflower', 'sunflower'), built); | 255 path.join(expectDir, 'sunflower', 'sunflower'), built); |
| 249 } | 256 } |
| 250 | 257 |
| 251 void _buildPackages( | 258 void _buildPackages( |
| 252 ModuleCompiler compiler, String outputDir, String expectDir) { | 259 ModuleCompiler compiler, String outputDir, String expectDir) { |
| 253 // Note: we don't summarize these, as we're going to rely on our in-memory | 260 // Note: we don't summarize these, as we're going to rely on our in-memory |
| 254 // shared analysis context for caching, and `_moduleForLibrary` below | 261 // shared analysis context for caching, and `_moduleForLibrary` below |
| 255 // understands these are from other modules. | 262 // understands these are from other modules. |
| 256 var options = new CompilerOptions(sourceMap: false, summarizeApi: false); | 263 var options = new CompilerOptions(sourceMap: false, summarizeApi: false); |
| 257 | 264 |
| 258 for (var uri in packageUrlMappings.keys) { | 265 for (var uri in packageUrlMappings.keys) { |
| 266 if (!filePattern.hasMatch(uri)) return; |
| 267 |
| 259 assert(uri.startsWith('package:')); | 268 assert(uri.startsWith('package:')); |
| 260 var uriPath = uri.substring('package:'.length); | 269 var uriPath = uri.substring('package:'.length); |
| 261 var name = path.basenameWithoutExtension(uriPath); | 270 var name = path.basenameWithoutExtension(uriPath); |
| 262 test(name, () { | 271 test(name, () { |
| 263 var input = new BuildUnit(name, codegenDir, [uri], _moduleForLibrary); | 272 var input = new BuildUnit(name, codegenDir, [uri], _moduleForLibrary); |
| 264 var built = compiler.compile(input, options); | 273 var built = compiler.compile(input, options); |
| 265 | 274 |
| 266 var outPath = path.join(outputDir, path.withoutExtension(uriPath)); | 275 var outPath = path.join(outputDir, path.withoutExtension(uriPath)); |
| 267 var expectPath = path.join(expectDir, path.withoutExtension(uriPath)); | 276 var expectPath = path.join(expectDir, path.withoutExtension(uriPath)); |
| 268 _writeModule(outPath, expectPath, built); | 277 _writeModule(outPath, expectPath, built); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 } | 315 } |
| 307 | 316 |
| 308 String _moduleForLibrary(Source source) { | 317 String _moduleForLibrary(Source source) { |
| 309 var scheme = source.uri.scheme; | 318 var scheme = source.uri.scheme; |
| 310 if (scheme == 'package') { | 319 if (scheme == 'package') { |
| 311 return source.uri.pathSegments.first; | 320 return source.uri.pathSegments.first; |
| 312 } | 321 } |
| 313 throw new Exception('Module not found for library "${source.fullName}"'); | 322 throw new Exception('Module not found for library "${source.fullName}"'); |
| 314 } | 323 } |
| 315 | 324 |
| 316 List<String> _setUpTests(List<String> testDirs, RegExp filePattern) { | 325 List<String> _setUpTests(List<String> testDirs) { |
| 317 var testFiles = <String>[]; | 326 var testFiles = <String>[]; |
| 318 | 327 |
| 319 for (var testDir in testDirs) { | 328 for (var testDir in testDirs) { |
| 320 for (var file in _listFiles(path.join(codegenDir, testDir), filePattern, | 329 for (var file |
| 321 recursive: true)) { | 330 in _listFiles(path.join(codegenDir, testDir), recursive: true)) { |
| 322 var relativePath = path.relative(file, from: codegenDir); | 331 var relativePath = path.relative(file, from: codegenDir); |
| 323 var outputPath = path.join(codegenTestDir, relativePath); | 332 var outputPath = path.join(codegenTestDir, relativePath); |
| 324 | 333 |
| 325 _ensureDirectory(path.dirname(outputPath)); | 334 _ensureDirectory(path.dirname(outputPath)); |
| 326 | 335 |
| 327 // Copy it over. We do this even for multitests because import_self_test | 336 // Copy it over. We do this even for multitests because import_self_test |
| 328 // is a multitest, yet imports its own unexpanded form (!). | 337 // is a multitest, yet imports its own unexpanded form (!). |
| 329 new File(file).copySync(outputPath); | 338 new File(file).copySync(outputPath); |
| 330 | 339 |
| 331 if (file.endsWith("_test.dart")) { | 340 if (file.endsWith("_test.dart")) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 348 }); | 357 }); |
| 349 } else { | 358 } else { |
| 350 // It's a single test suite. | 359 // It's a single test suite. |
| 351 testFiles.add(outputPath); | 360 testFiles.add(outputPath); |
| 352 } | 361 } |
| 353 } | 362 } |
| 354 } | 363 } |
| 355 } | 364 } |
| 356 | 365 |
| 357 // Also include the other special files that live at the top level directory. | 366 // Also include the other special files that live at the top level directory. |
| 358 for (var file in _listFiles(codegenDir, filePattern)) { | 367 for (var file in _listFiles(codegenDir)) { |
| 359 var relativePath = path.relative(file, from: codegenDir); | 368 var relativePath = path.relative(file, from: codegenDir); |
| 360 var outputPath = path.join(codegenTestDir, relativePath); | 369 var outputPath = path.join(codegenTestDir, relativePath); |
| 361 | 370 |
| 362 new File(file).copySync(outputPath); | 371 new File(file).copySync(outputPath); |
| 363 if (file.endsWith(".dart")) { | 372 if (file.endsWith(".dart")) { |
| 364 testFiles.add(outputPath); | 373 testFiles.add(outputPath); |
| 365 } | 374 } |
| 366 } | 375 } |
| 367 | 376 |
| 368 return testFiles; | 377 return testFiles; |
| 369 } | 378 } |
| 370 | 379 |
| 371 /// Recursively creates [dir] if it doesn't exist. | 380 /// Recursively creates [dir] if it doesn't exist. |
| 372 void _ensureDirectory(String dir) { | 381 void _ensureDirectory(String dir) { |
| 373 new Directory(dir).createSync(recursive: true); | 382 new Directory(dir).createSync(recursive: true); |
| 374 } | 383 } |
| 375 | 384 |
| 376 /// Lists all of the files within [dir] that match [filePattern]. | 385 /// Lists all of the files within [dir] that match [filePattern]. |
| 377 Iterable<String> _listFiles(String dir, RegExp filePattern, | 386 Iterable<String> _listFiles(String dir, {bool recursive: false}) { |
| 378 {bool recursive: false}) { | |
| 379 return new Directory(dir) | 387 return new Directory(dir) |
| 380 .listSync(recursive: recursive, followLinks: false) | 388 .listSync(recursive: recursive, followLinks: false) |
| 381 .where((entry) { | 389 .where((entry) { |
| 382 if (entry is! File) return false; | 390 if (entry is! File) return false; |
| 383 | 391 |
| 384 var filePath = entry.path; | 392 var filePath = entry.path; |
| 385 if (!filePattern.hasMatch(filePath)) return false; | 393 if (!filePattern.hasMatch(filePath)) return false; |
| 386 | 394 |
| 387 return true; | 395 return true; |
| 388 }).map((file) => file.path); | 396 }).map((file) => file.path); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 /// Simplified from ParseDartTask.resolveDirective. | 430 /// Simplified from ParseDartTask.resolveDirective. |
| 423 String _resolveDirective(UriBasedDirective directive) { | 431 String _resolveDirective(UriBasedDirective directive) { |
| 424 StringLiteral uriLiteral = directive.uri; | 432 StringLiteral uriLiteral = directive.uri; |
| 425 String uriContent = uriLiteral.stringValue; | 433 String uriContent = uriLiteral.stringValue; |
| 426 if (uriContent != null) { | 434 if (uriContent != null) { |
| 427 uriContent = uriContent.trim(); | 435 uriContent = uriContent.trim(); |
| 428 directive.uriContent = uriContent; | 436 directive.uriContent = uriContent; |
| 429 } | 437 } |
| 430 return directive.validate() == null ? uriContent : null; | 438 return directive.validate() == null ? uriContent : null; |
| 431 } | 439 } |
| OLD | NEW |