| Index: pkg/kernel/test/closures/suite.dart
|
| diff --git a/pkg/kernel/test/closures/suite.dart b/pkg/kernel/test/closures/suite.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4c3b9a5611096f08482f800b31974bf16c446ad8
|
| --- /dev/null
|
| +++ b/pkg/kernel/test/closures/suite.dart
|
| @@ -0,0 +1,193 @@
|
| +// 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.md file.
|
| +
|
| +library test.kernel.closures.suite;
|
| +
|
| +import 'dart:async' show Future;
|
| +
|
| +import 'dart:io' show Directory, File, Platform;
|
| +
|
| +import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
|
| +
|
| +import 'package:kernel/analyzer/loader.dart'
|
| + show DartLoader, DartOptions, createDartSdk;
|
| +
|
| +import 'package:kernel/target/targets.dart' show Target, TargetFlags, getTarget;
|
| +
|
| +import 'package:kernel/repository.dart' show Repository;
|
| +
|
| +import 'kernel_chain.dart'
|
| + show MatchExpectation, Print, ReadDill, SanityCheck, WriteDill;
|
| +
|
| +import 'package:testing/testing.dart'
|
| + show
|
| + Chain,
|
| + ChainContext,
|
| + Result,
|
| + StdioProcess,
|
| + Step,
|
| + TestDescription,
|
| + runMe;
|
| +
|
| +import 'package:kernel/ast.dart' show Program;
|
| +
|
| +import 'package:kernel/transformations/closure_conversion.dart'
|
| + as closure_conversion;
|
| +
|
| +import 'package:package_config/discovery.dart' show loadPackagesFile;
|
| +
|
| +class TestContext extends ChainContext {
|
| + final Uri vm;
|
| +
|
| + final Uri packages;
|
| +
|
| + final DartOptions options;
|
| +
|
| + final DartSdk dartSdk;
|
| +
|
| + final List<Step> steps;
|
| +
|
| + TestContext(String sdk, this.vm, Uri packages, bool strongMode, this.dartSdk,
|
| + bool updateExpectations)
|
| + : packages = packages,
|
| + options = new DartOptions(
|
| + strongMode: strongMode,
|
| + sdk: sdk,
|
| + packagePath: packages.toFilePath()),
|
| + steps = <Step>[
|
| + const Kernel(),
|
| + const Print(),
|
| + const SanityCheck(),
|
| + const ClosureConversion(),
|
| + const Print(),
|
| + const SanityCheck(),
|
| + new MatchExpectation(".expect",
|
| + updateExpectations: updateExpectations),
|
| + const WriteDill(),
|
| + const ReadDill(),
|
| + const Run(),
|
| + ];
|
| +
|
| + Future<DartLoader> createLoader() async {
|
| + Repository repository = new Repository();
|
| + return new DartLoader(repository, options, await loadPackagesFile(packages),
|
| + dartSdk: dartSdk);
|
| + }
|
| +}
|
| +
|
| +enum Environment {
|
| + directory,
|
| + file,
|
| +}
|
| +
|
| +Future<String> getEnvironmentVariable(
|
| + String name, Environment kind, String undefined, notFound(String n)) async {
|
| + String result = Platform.environment[name];
|
| + if (result == null) {
|
| + throw undefined;
|
| + }
|
| + switch (kind) {
|
| + case Environment.directory:
|
| + if (!await new Directory(result).exists()) throw notFound(result);
|
| + break;
|
| +
|
| + case Environment.file:
|
| + if (!await new File(result).exists()) throw notFound(result);
|
| + break;
|
| + }
|
| + return result;
|
| +}
|
| +
|
| +Future<bool> fileExists(Uri base, String path) async {
|
| + return await new File.fromUri(base.resolve(path)).exists();
|
| +}
|
| +
|
| +Future<TestContext> createContext(
|
| + Chain suite, Map<String, String> environment) async {
|
| + const String suggestion = """Try building the patched SDK by running
|
| + 'tools/build.py patched_sdk'""";
|
| +
|
| + // TODO(karlklose): The path is different on MacOS.
|
| + String sdk = "out/DebugX64/patched_sdk/";
|
| + Uri sdkUri = Uri.base.resolve(sdk);
|
| + const String asyncDart = "lib/async/async.dart";
|
| + if (!await fileExists(sdkUri, asyncDart)) {
|
| + throw "Couldn't find the patched SDK. $suggestion";
|
| + }
|
| + const String asyncSources = "lib/async/async_sources.gypi";
|
| + if (await fileExists(sdkUri, asyncSources)) {
|
| + throw "Found '$asyncSources' in '$sdk', so it isn't a patched SDK. "
|
| + "$suggestion";
|
| + }
|
| +
|
| + // TODO(karlklose): select the VM based on the mode.
|
| + Uri vm = Uri.base.resolve("out/ReleaseX64/dart");
|
| +
|
| + Uri packages = Uri.base.resolve(".packages");
|
| + bool strongMode = false;
|
| + bool updateExpectations = environment["updateExpectations"] != "false";
|
| + return new TestContext(sdk, vm, packages, strongMode,
|
| + createDartSdk(sdk, strongMode: strongMode), updateExpectations);
|
| +}
|
| +
|
| +class Kernel extends Step<TestDescription, Program, TestContext> {
|
| + const Kernel();
|
| +
|
| + String get name => "kernel";
|
| +
|
| + Future<Result<Program>> run(
|
| + TestDescription description, TestContext testContext) async {
|
| + try {
|
| + DartLoader loader = await testContext.createLoader();
|
| + Target target = getTarget(
|
| + "vm", new TargetFlags(strongMode: testContext.options.strongMode));
|
| + String path = description.file.path;
|
| + Uri uri = Uri.base.resolve(path);
|
| + Program program = loader.loadProgram(uri, target: target);
|
| + for (var error in loader.errors) {
|
| + return fail(program, "$error");
|
| + }
|
| + target.transformProgram(program);
|
| + return pass(program);
|
| + } catch (e, s) {
|
| + return crash(e, s);
|
| + }
|
| + }
|
| +}
|
| +
|
| +class ClosureConversion extends Step<Program, Program, TestContext> {
|
| + const ClosureConversion();
|
| +
|
| + String get name => "closure conversion";
|
| +
|
| + Future<Result<Program>> run(Program program, TestContext testContext) async {
|
| + try {
|
| + program = closure_conversion.transformProgram(program);
|
| + return pass(program);
|
| + } catch (e, s) {
|
| + return crash(e, s);
|
| + }
|
| + }
|
| +}
|
| +
|
| +class Run extends Step<Uri, int, TestContext> {
|
| + const Run();
|
| +
|
| + String get name => "run";
|
| +
|
| + Future<Result<int>> run(Uri uri, TestContext context) async {
|
| + File generated = new File.fromUri(uri);
|
| + StdioProcess process;
|
| + try {
|
| + process = await StdioProcess
|
| + .run(context.vm.toFilePath(), [generated.path, "Hello, World!"]);
|
| + print(process.output);
|
| + } finally {
|
| + generated.parent.delete(recursive: true);
|
| + }
|
| + return process.toResult();
|
| + }
|
| +}
|
| +
|
| +main(List<String> arguments) => runMe(arguments, createContext, "testing.json");
|
|
|