| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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.md file. | 3 // BSD-style license that can be found in the LICENSE.md file. |
| 4 | 4 |
| 5 library test.kernel.closures.suite; | 5 library test.kernel.closures.suite; |
| 6 | 6 |
| 7 import 'dart:io' show File; |
| 8 |
| 7 import 'dart:async' show Future; | 9 import 'dart:async' show Future; |
| 8 | 10 |
| 9 import 'package:front_end/physical_file_system.dart'; | 11 import 'package:front_end/physical_file_system.dart'; |
| 10 import 'package:testing/testing.dart' | 12 import 'package:testing/testing.dart' |
| 11 show Chain, ChainContext, Result, Step, TestDescription, runMe; | 13 show |
| 14 Chain, |
| 15 ChainContext, |
| 16 Result, |
| 17 Step, |
| 18 TestDescription, |
| 19 runMe, |
| 20 StdioProcess; |
| 12 | 21 |
| 13 import 'package:kernel/ast.dart' show Program; | 22 import 'package:kernel/ast.dart' show Program; |
| 14 | 23 |
| 15 import 'package:kernel/transformations/closure_conversion.dart' | |
| 16 as closure_conversion; | |
| 17 | |
| 18 import 'package:front_end/src/fasta/testing/kernel_chain.dart' | 24 import 'package:front_end/src/fasta/testing/kernel_chain.dart' |
| 19 show Print, MatchExpectation, WriteDill, ReadDill, Verify; | 25 show TestContext, Print, MatchExpectation, WriteDill, ReadDill, Verify; |
| 20 | 26 |
| 21 import 'package:front_end/src/fasta/ticker.dart' show Ticker; | 27 import 'package:front_end/src/fasta/ticker.dart' show Ticker; |
| 22 | 28 |
| 23 import 'package:front_end/src/fasta/dill/dill_target.dart' show DillTarget; | 29 import 'package:front_end/src/fasta/dill/dill_target.dart' show DillTarget; |
| 24 | 30 |
| 25 import 'package:front_end/src/fasta/kernel/kernel_target.dart' | 31 import 'package:front_end/src/fasta/kernel/kernel_target.dart' |
| 26 show KernelTarget; | 32 show KernelTarget; |
| 27 | 33 |
| 28 import 'package:front_end/src/fasta/translate_uri.dart' show TranslateUri; | 34 import 'package:front_end/src/fasta/translate_uri.dart' show TranslateUri; |
| 29 | 35 |
| 30 import 'package:front_end/src/fasta/errors.dart' show InputError; | 36 import 'package:front_end/src/fasta/errors.dart' show InputError; |
| 31 | 37 |
| 32 import 'package:front_end/src/fasta/testing/patched_sdk_location.dart'; | 38 import 'package:front_end/src/fasta/testing/patched_sdk_location.dart'; |
| 33 | 39 |
| 34 import 'package:kernel/kernel.dart' show loadProgramFromBinary; | 40 import 'package:kernel/kernel.dart' show loadProgramFromBinary; |
| 35 | 41 |
| 36 const String STRONG_MODE = " strong mode "; | 42 const String STRONG_MODE = " strong mode "; |
| 37 | 43 |
| 38 class ClosureConversionContext extends ChainContext { | 44 class ClosureConversionContext extends ChainContext { |
| 39 final bool strongMode; | |
| 40 | |
| 41 final TranslateUri uriTranslator; | 45 final TranslateUri uriTranslator; |
| 42 | |
| 43 final List<Step> steps; | 46 final List<Step> steps; |
| 47 final Uri vm; |
| 44 | 48 |
| 45 ClosureConversionContext( | 49 ClosureConversionContext( |
| 46 this.strongMode, bool updateExpectations, this.uriTranslator) | 50 this.vm, bool strongMode, bool updateExpectations, this.uriTranslator) |
| 47 : steps = <Step>[ | 51 : steps = <Step>[ |
| 48 const FastaCompile(), | 52 new FastaCompile(strongMode), |
| 49 const Print(), | |
| 50 const Verify(true), | |
| 51 const ClosureConversion(), | |
| 52 const Print(), | 53 const Print(), |
| 53 const Verify(true), | 54 const Verify(true), |
| 54 new MatchExpectation(".expect", | 55 new MatchExpectation(".expect", |
| 55 updateExpectations: updateExpectations), | 56 updateExpectations: updateExpectations), |
| 56 const WriteDill(), | 57 const WriteDill(), |
| 57 const ReadDill(), | 58 const ReadDill(), |
| 58 // TODO(29143): add `Run` step when Vectors are added to VM. | 59 const Run(), |
| 59 ]; | 60 ]; |
| 60 | 61 |
| 61 Future<Program> loadPlatform() async { | 62 // The platform in these tests are reloaded for each testscase, because the |
| 62 Uri sdk = await computePatchedSdk(); | 63 // closure conversion transformation is performed during the load, and it's |
| 63 return loadProgramFromBinary(sdk.resolve('platform.dill').toFilePath()); | 64 // not an idempotent transformation yet. |
| 65 Future<Program> loadPlatform() { |
| 66 return new Future<Program>(() async { |
| 67 Uri sdk = await computePatchedSdk(); |
| 68 return loadProgramFromBinary(sdk.resolve('platform.dill').toFilePath()); |
| 69 }); |
| 64 } | 70 } |
| 65 | 71 |
| 66 static Future<ClosureConversionContext> create( | 72 static Future<ClosureConversionContext> create( |
| 67 Chain suite, Map<String, String> environment) async { | 73 Chain suite, Map<String, String> environment) async { |
| 74 Uri sdk = await computePatchedSdk(); |
| 75 Uri vm = computeDartVm(sdk); |
| 68 Uri packages = Uri.base.resolve(".packages"); | 76 Uri packages = Uri.base.resolve(".packages"); |
| 77 TranslateUri uriTranslator = |
| 78 await TranslateUri.parse(PhysicalFileSystem.instance, packages); |
| 69 bool strongMode = environment.containsKey(STRONG_MODE); | 79 bool strongMode = environment.containsKey(STRONG_MODE); |
| 70 bool updateExpectations = environment["updateExpectations"] == "true"; | 80 bool updateExpectations = environment["updateExpectations"] == "true"; |
| 71 TranslateUri uriTranslator = | 81 |
| 72 await TranslateUri.parse(PhysicalFileSystem.instance, packages); | |
| 73 return new ClosureConversionContext( | 82 return new ClosureConversionContext( |
| 74 strongMode, updateExpectations, uriTranslator); | 83 vm, strongMode, updateExpectations, uriTranslator); |
| 75 } | 84 } |
| 76 } | 85 } |
| 77 | 86 |
| 78 Future<ClosureConversionContext> createContext( | 87 Future<ClosureConversionContext> createContext( |
| 79 Chain suite, Map<String, String> environment) async { | 88 Chain suite, Map<String, String> environment) async { |
| 80 environment["updateExpectations"] = | 89 environment["updateExpectations"] = |
| 81 const String.fromEnvironment("updateExpectations"); | 90 const String.fromEnvironment("updateExpectations"); |
| 82 return ClosureConversionContext.create(suite, environment); | 91 return ClosureConversionContext.create(suite, environment); |
| 83 } | 92 } |
| 84 | 93 |
| 85 class FastaCompile | 94 class FastaCompile |
| 86 extends Step<TestDescription, Program, ClosureConversionContext> { | 95 extends Step<TestDescription, Program, ClosureConversionContext> { |
| 87 const FastaCompile(); | 96 final bool strongMode; |
| 97 |
| 98 const FastaCompile(this.strongMode); |
| 88 | 99 |
| 89 String get name => "fasta compilation"; | 100 String get name => "fasta compilation"; |
| 90 | 101 |
| 91 Future<Result<Program>> run( | 102 Future<Result<Program>> run( |
| 92 TestDescription description, ClosureConversionContext context) async { | 103 TestDescription description, ClosureConversionContext context) async { |
| 93 Program platform = await context.loadPlatform(); | 104 Program platform = await context.loadPlatform(); |
| 94 Ticker ticker = new Ticker(); | 105 Ticker ticker = new Ticker(); |
| 95 DillTarget dillTarget = new DillTarget(ticker, context.uriTranslator); | 106 DillTarget dillTarget = new DillTarget(ticker, context.uriTranslator); |
| 96 platform.unbindCanonicalNames(); | 107 platform.unbindCanonicalNames(); |
| 97 dillTarget.loader.appendLibraries(platform); | 108 dillTarget.loader.appendLibraries(platform); |
| 98 KernelTarget sourceTarget = new KernelTarget(PhysicalFileSystem.instance, | 109 KernelTarget sourceTarget = new KernelTarget(PhysicalFileSystem.instance, |
| 99 dillTarget, context.uriTranslator, context.strongMode); | 110 dillTarget, context.uriTranslator, strongMode); |
| 100 | 111 |
| 101 Program p; | 112 Program p; |
| 102 try { | 113 try { |
| 103 sourceTarget.read(description.uri); | 114 sourceTarget.read(description.uri); |
| 104 await dillTarget.buildOutlines(); | 115 await dillTarget.buildOutlines(); |
| 105 await sourceTarget.buildOutlines(); | 116 await sourceTarget.buildOutlines(); |
| 106 p = await sourceTarget.buildProgram(); | 117 p = await sourceTarget.buildProgram(); |
| 107 } on InputError catch (e, s) { | 118 } on InputError catch (e, s) { |
| 108 return fail(null, e.error, s); | 119 return fail(null, e.error, s); |
| 109 } | 120 } |
| 110 return pass(p); | 121 return pass(p); |
| 111 } | 122 } |
| 112 } | 123 } |
| 113 | 124 |
| 114 class ClosureConversion | 125 class Run extends Step<Uri, int, ClosureConversionContext> { |
| 115 extends Step<Program, Program, ClosureConversionContext> { | 126 const Run(); |
| 116 const ClosureConversion(); | |
| 117 | 127 |
| 118 String get name => "closure conversion"; | 128 String get name => "run"; |
| 119 | 129 |
| 120 Future<Result<Program>> run( | 130 Future<Result<int>> run(Uri uri, ClosureConversionContext context) async { |
| 121 Program program, ClosureConversionContext testContext) async { | 131 File generated = new File.fromUri(uri); |
| 132 StdioProcess process; |
| 122 try { | 133 try { |
| 123 program = closure_conversion.transformProgram(program); | 134 process = |
| 124 return pass(program); | 135 await StdioProcess.run(context.vm.toFilePath(), [generated.path]); |
| 125 } catch (e, s) { | 136 print(process.output); |
| 126 return crash(e, s); | 137 } finally { |
| 138 generated.parent.delete(recursive: true); |
| 127 } | 139 } |
| 140 return process.toResult(); |
| 128 } | 141 } |
| 129 } | 142 } |
| 130 | 143 |
| 131 main(List<String> arguments) => runMe(arguments, createContext, "testing.json"); | 144 main(List<String> arguments) => runMe(arguments, createContext, "testing.json"); |
| OLD | NEW |