| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // BSD-style license that can be found in the LICENSE.md file. | |
| 4 | |
| 5 library fasta.testing.suite; | |
| 6 | |
| 7 import 'dart:async' show Future; | |
| 8 | |
| 9 import 'dart:convert' show JSON; | |
| 10 | |
| 11 import 'package:analyzer/src/generated/sdk.dart' show DartSdk; | |
| 12 | |
| 13 import 'package:front_end/src/fasta/testing/validating_instrumentation.dart' | |
| 14 show ValidatingInstrumentation; | |
| 15 | |
| 16 import 'package:kernel/ast.dart' show Library, Program; | |
| 17 | |
| 18 import 'package:analyzer/src/kernel/loader.dart' show DartLoader; | |
| 19 | |
| 20 import 'package:kernel/target/targets.dart' show Target, TargetFlags, getTarget; | |
| 21 | |
| 22 import 'package:testing/testing.dart' | |
| 23 show Chain, ExpectationSet, Result, Step, TestDescription; | |
| 24 | |
| 25 import '../errors.dart' show InputError; | |
| 26 | |
| 27 import 'kernel_chain.dart' | |
| 28 show MatchExpectation, Print, Run, Verify, TestContext, WriteDill; | |
| 29 | |
| 30 import '../ticker.dart' show Ticker; | |
| 31 | |
| 32 import '../translate_uri.dart' show TranslateUri; | |
| 33 | |
| 34 import '../analyzer/analyzer_target.dart' show AnalyzerTarget; | |
| 35 | |
| 36 import '../kernel/kernel_target.dart' show KernelTarget; | |
| 37 | |
| 38 import '../dill/dill_target.dart' show DillTarget; | |
| 39 | |
| 40 export 'kernel_chain.dart' show STRONG_MODE, TestContext; | |
| 41 | |
| 42 export 'package:testing/testing.dart' show Chain, runMe; | |
| 43 | |
| 44 const String ENABLE_FULL_COMPILE = " full compile "; | |
| 45 | |
| 46 const String AST_KIND_INDEX = " AST kind index "; | |
| 47 | |
| 48 const String EXPECTATIONS = ''' | |
| 49 [ | |
| 50 { | |
| 51 "name": "VerificationError", | |
| 52 "group": "Fail" | |
| 53 } | |
| 54 ] | |
| 55 '''; | |
| 56 | |
| 57 String shortenAstKindName(AstKind astKind, bool strongMode) { | |
| 58 switch (astKind) { | |
| 59 case AstKind.Analyzer: | |
| 60 return strongMode ? "dartk-strong" : "dartk"; | |
| 61 case AstKind.Kernel: | |
| 62 return strongMode ? "strong" : "direct"; | |
| 63 } | |
| 64 throw "Unknown AST kind: $astKind"; | |
| 65 } | |
| 66 | |
| 67 enum AstKind { | |
| 68 Analyzer, | |
| 69 Kernel, | |
| 70 } | |
| 71 | |
| 72 class FastaContext extends TestContext { | |
| 73 final TranslateUri uriTranslator; | |
| 74 | |
| 75 final List<Step> steps; | |
| 76 | |
| 77 final ExpectationSet expectationSet = | |
| 78 new ExpectationSet.fromJsonList(JSON.decode(EXPECTATIONS)); | |
| 79 | |
| 80 Future<Program> platform; | |
| 81 | |
| 82 FastaContext( | |
| 83 Uri sdk, | |
| 84 Uri vm, | |
| 85 Uri packages, | |
| 86 bool strongMode, | |
| 87 DartSdk dartSdk, | |
| 88 bool updateExpectations, | |
| 89 this.uriTranslator, | |
| 90 bool fullCompile, | |
| 91 AstKind astKind) | |
| 92 : steps = <Step>[ | |
| 93 new Outline(fullCompile, astKind, strongMode, | |
| 94 updateExpectations: updateExpectations), | |
| 95 const Print(), | |
| 96 new Verify(fullCompile), | |
| 97 new MatchExpectation( | |
| 98 fullCompile | |
| 99 ? ".${shortenAstKindName(astKind, strongMode)}.expect" | |
| 100 : ".outline.expect", | |
| 101 updateExpectations: updateExpectations) | |
| 102 ], | |
| 103 super(sdk, vm, packages, strongMode, dartSdk) { | |
| 104 if (fullCompile) { | |
| 105 steps.add(const WriteDill()); | |
| 106 steps.add(const Run()); | |
| 107 } | |
| 108 } | |
| 109 | |
| 110 Future<Program> createPlatform() { | |
| 111 return platform ??= new Future<Program>(() async { | |
| 112 DartLoader loader = await createLoader(); | |
| 113 Target target = | |
| 114 getTarget("vm", new TargetFlags(strongMode: options.strongMode)); | |
| 115 loader.loadProgram(Uri.base.resolve("pkg/fasta/test/platform.dart"), | |
| 116 target: target); | |
| 117 var program = loader.program; | |
| 118 if (loader.errors.isNotEmpty) { | |
| 119 throw loader.errors.join("\n"); | |
| 120 } | |
| 121 Library mainLibrary = program.mainMethod.enclosingLibrary; | |
| 122 program.uriToSource.remove(mainLibrary.fileUri); | |
| 123 program = new Program( | |
| 124 program.libraries.where((Library l) => l != mainLibrary).toList(), | |
| 125 program.uriToSource); | |
| 126 target.performModularTransformations(program); | |
| 127 target.performGlobalTransformations(program); | |
| 128 return program; | |
| 129 }); | |
| 130 } | |
| 131 | |
| 132 static Future<FastaContext> create( | |
| 133 Chain suite, Map<String, String> environment) async { | |
| 134 return TestContext.create(suite, environment, (Chain suite, | |
| 135 Map<String, String> environment, | |
| 136 Uri sdk, | |
| 137 Uri vm, | |
| 138 Uri packages, | |
| 139 bool strongMode, | |
| 140 DartSdk dartSdk, | |
| 141 bool updateExpectations) async { | |
| 142 TranslateUri uriTranslator = await TranslateUri.parse(packages); | |
| 143 String astKindString = environment[AST_KIND_INDEX]; | |
| 144 AstKind astKind = astKindString == null | |
| 145 ? null | |
| 146 : AstKind.values[int.parse(astKindString)]; | |
| 147 return new FastaContext( | |
| 148 sdk, | |
| 149 vm, | |
| 150 packages, | |
| 151 strongMode, | |
| 152 dartSdk, | |
| 153 updateExpectations, | |
| 154 uriTranslator, | |
| 155 environment.containsKey(ENABLE_FULL_COMPILE), | |
| 156 astKind); | |
| 157 }); | |
| 158 } | |
| 159 } | |
| 160 | |
| 161 class Outline extends Step<TestDescription, Program, FastaContext> { | |
| 162 final bool fullCompile; | |
| 163 | |
| 164 final AstKind astKind; | |
| 165 | |
| 166 final bool strongMode; | |
| 167 | |
| 168 const Outline(this.fullCompile, this.astKind, this.strongMode, | |
| 169 {this.updateExpectations: false}); | |
| 170 | |
| 171 final bool updateExpectations; | |
| 172 | |
| 173 String get name { | |
| 174 return fullCompile ? "${astKind} compile" : "outline"; | |
| 175 } | |
| 176 | |
| 177 bool get isCompiler => fullCompile; | |
| 178 | |
| 179 Future<Result<Program>> run( | |
| 180 TestDescription description, FastaContext context) async { | |
| 181 Program platform = await context.createPlatform(); | |
| 182 Ticker ticker = new Ticker(); | |
| 183 DillTarget dillTarget = new DillTarget(ticker, context.uriTranslator); | |
| 184 dillTarget.loader | |
| 185 ..input = Uri.parse("org.dartlang:platform") // Make up a name. | |
| 186 ..setProgram(platform); | |
| 187 KernelTarget sourceTarget = astKind == AstKind.Analyzer | |
| 188 ? new AnalyzerTarget(dillTarget, context.uriTranslator, strongMode) | |
| 189 : new KernelTarget(dillTarget, context.uriTranslator, strongMode); | |
| 190 | |
| 191 Program p; | |
| 192 try { | |
| 193 sourceTarget.read(description.uri); | |
| 194 await dillTarget.writeOutline(null); | |
| 195 var instrumentation = new ValidatingInstrumentation(); | |
| 196 await instrumentation.loadExpectations(description.uri); | |
| 197 sourceTarget.loader.instrumentation = instrumentation; | |
| 198 p = await sourceTarget.writeOutline(null); | |
| 199 if (fullCompile) { | |
| 200 p = await sourceTarget.writeProgram(null); | |
| 201 instrumentation.finish(); | |
| 202 if (instrumentation.hasProblems) { | |
| 203 if (updateExpectations) { | |
| 204 await instrumentation.fixSource(description.uri); | |
| 205 } else { | |
| 206 return fail(null, instrumentation.problemsAsString); | |
| 207 } | |
| 208 } | |
| 209 } | |
| 210 } on InputError catch (e, s) { | |
| 211 return fail(null, e.error, s); | |
| 212 } | |
| 213 return pass(p); | |
| 214 } | |
| 215 } | |
| OLD | NEW |