blob: c66801fe14429a109ef7b8d32a001a45919a8ea9 [file] [log] [blame]
// 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.
/// Test that the dart2js copy of [KernelVisitor] generates the expected IR as
/// defined by kernel spec-mode test files.
import 'dart:io';
import 'dart:async';
import 'package:compiler/src/compiler.dart' show Compiler;
import 'package:compiler/src/elements/elements.dart';
import 'package:compiler/src/js_backend/backend.dart' show JavaScriptBackend;
import 'package:compiler/src/commandline_options.dart' show Flags;
import 'package:kernel/ast.dart';
import 'package:kernel/text/ast_to_text.dart';
import 'package:kernel/transformations/mixin_full_resolution.dart';
import 'package:kernel/class_hierarchy.dart';
import 'package:path/path.dart' as pathlib;
import 'package:test/test.dart';
import '../memory_compiler.dart';
const String TESTCASE_DIR = 'pkg/kernel/testcases/';
const List<String> SKIP_TESTS = const <String>[
/// The test expects an unpatched api.
'external',
];
main(List<String> arguments) async {
Directory directory = new Directory('${TESTCASE_DIR}/input');
for (FileSystemEntity file in directory.listSync()) {
if (file is File && file.path.endsWith('.dart')) {
String name = pathlib.basenameWithoutExtension(file.path);
bool selected = arguments.contains(name);
if (!selected) {
if (arguments.isNotEmpty) continue;
if (SKIP_TESTS.contains(name)) continue;
}
test(name, () async {
var compiler = await newCompiler();
await compiler.run(file.absolute.uri);
LibraryElement library =
await compiler.libraryLoader.loadLibrary(file.absolute.uri);
JavaScriptBackend backend = compiler.backend;
StringBuffer buffer = new StringBuffer();
Program program = backend.kernelTask.buildProgram(library);
new MixinFullResolution().transform(program);
new Printer(buffer)
.writeLibraryFile(program.mainMethod.enclosingLibrary);
String actual = buffer.toString();
String expected =
new File('${TESTCASE_DIR}/spec-mode/$name.baseline.txt')
.readAsStringSync();
if (selected) {
String input =
new File('${TESTCASE_DIR}/input/$name.dart').readAsStringSync();
print('============================================================');
print(name);
print('--input-----------------------------------------------------');
print(input);
print('--expected--------------------------------------------------');
print(expected);
print('--actual----------------------------------------------------');
print(actual);
}
expect(actual, equals(expected));
});
}
}
}
Future<Compiler> newCompiler() async {
var compiler = compilerFor(
options: [Flags.analyzeOnly, Flags.analyzeAll, Flags.useKernel]);
await compiler.setupSdk();
// The visitor no longer enqueues elements that are not reachable from the
// program. The mixin-full resolution transform run by the test expects to
// find dart.core::Iterator.
var core = await compiler.libraryLoader.loadLibrary(Uri.parse('dart:core'));
var cls = core.implementation.localLookup('Iterator');
cls.ensureResolved(compiler.resolution);
return compiler;
}