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