| // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'dart:async'; |
| import 'dart:io'; |
| |
| import 'package:_fe_analyzer_shared/src/testing/annotated_code_helper.dart'; |
| import 'package:args/args.dart'; |
| import 'package:compiler/src/commandline_options.dart'; |
| import 'package:compiler/src/dart2js.dart' as entry; |
| import 'package:expect/async_helper.dart'; |
| import 'package:expect/expect.dart'; |
| import 'package:sourcemap_testing/src/stepping_helper.dart'; |
| |
| import 'package:compiler/src/util/memory_compiler.dart'; |
| |
| void main(List<String> args) { |
| ArgParser argParser = ArgParser(allowTrailingOptions: true); |
| argParser.addFlag('debug', abbr: 'd', defaultsTo: false); |
| argParser.addFlag('verbose', abbr: 'v', defaultsTo: false); |
| argParser.addFlag('continued', abbr: 'c', defaultsTo: false); |
| ArgResults argResults = argParser.parse(args); |
| Directory dataDir = Directory.fromUri(Platform.script.resolve('stepping')); |
| asyncTest(() async { |
| bool continuing = false; |
| await for (FileSystemEntity entity in dataDir.list()) { |
| String name = entity.uri.pathSegments.last; |
| if (argResults.rest.isNotEmpty && |
| !argResults.rest.contains(name) && |
| !continuing) { |
| continue; |
| } |
| print('----------------------------------------------------------------'); |
| print('Checking ${entity.uri}'); |
| print('----------------------------------------------------------------'); |
| String annotatedCode = await File.fromUri(entity.uri).readAsString(); |
| await testAnnotatedCode( |
| annotatedCode, |
| verbose: argResults['verbose'], |
| debug: argResults['debug'], |
| ); |
| if (argResults['continued']) { |
| continuing = true; |
| } |
| } |
| }); |
| } |
| |
| const String kernelMarker = 'kernel.'; |
| |
| Future testAnnotatedCode( |
| String code, { |
| bool debug = false, |
| bool verbose = false, |
| }) async { |
| AnnotatedCode annotatedCode = AnnotatedCode.fromText( |
| code, |
| commentStart, |
| commentEnd, |
| ); |
| print(annotatedCode.sourceCode); |
| Map<String, AnnotatedCode> split = splitByPrefixes(annotatedCode, [ |
| kernelMarker, |
| ]); |
| print('---from kernel------------------------------------------------------'); |
| await runTest( |
| split[kernelMarker]!, |
| kernelMarker, |
| debug: debug, |
| verbose: verbose, |
| ); |
| } |
| |
| Future runTest( |
| AnnotatedCode annotatedCode, |
| String config, { |
| bool debug = false, |
| bool verbose = false, |
| List<String> options = const <String>[], |
| }) async { |
| Directory dir = Directory.systemTemp.createTempSync('stepping_test'); |
| String testFileName = 'test.dart'; |
| String path = dir.path; |
| String inputFile = '$path/$testFileName'; |
| File(inputFile).writeAsStringSync(annotatedCode.sourceCode); |
| String outputFile = '$path/js.js'; |
| List<String> arguments = <String>[ |
| '--out=$outputFile', |
| inputFile, |
| Flags.disableInlining, |
| ]; |
| CompilationResult compilationResult = await entry.internalMain(arguments); |
| Expect.isTrue(compilationResult.isSuccess); |
| List<String> scriptD8Command = [ |
| '$sdkPath/_internal/js_runtime/lib/preambles/d8.js', |
| outputFile, |
| ]; |
| ProcessResult result = runD8AndStep( |
| dir.path, |
| testFileName, |
| annotatedCode, |
| scriptD8Command, |
| ); |
| List<String> d8output = result.stdout.split("\n"); |
| if (verbose) { |
| d8output.forEach(print); |
| } |
| checkD8Steps(dir.path, d8output, annotatedCode, debug: debug); |
| dir.deleteSync(recursive: true); |
| } |