blob: 97352233bd4302c36b94d82f6aaad162a40b719f [file] [log] [blame]
// Copyright (c) 2018, 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.
// @dart=2.9
import 'dart:io';
import 'package:kernel/target/targets.dart';
import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart';
import 'package:kernel/kernel.dart';
import 'package:test/test.dart';
import 'package:vm/transformations/pragma.dart'
show ConstantPragmaAnnotationParser;
import 'package:vm/transformations/type_flow/transformer.dart'
show transformComponent;
import '../../common_test_utils.dart';
final String pkgVmDir = Platform.script.resolve('../../..').toFilePath();
runTestCase(
Uri source, List<String> experimentalFlags, bool enableNullSafety) async {
final target =
new TestingVmTarget(new TargetFlags(enableNullSafety: enableNullSafety));
Component component = await compileTestCaseToKernelProgram(source,
target: target, experimentalFlags: experimentalFlags);
final coreTypes = new CoreTypes(component);
component = transformComponent(target, coreTypes, component,
matcher: new ConstantPragmaAnnotationParser(coreTypes),
treeShakeProtobufs: true);
String actual = kernelLibraryToString(component.mainMethod.enclosingLibrary);
// Tests in /protobuf_handler consist of multiple libraries.
// Include libraries with protobuf generated messages into the result.
if (source.toString().contains('/protobuf_handler/')) {
for (var lib in component.libraries) {
if (lib.importUri
.toString()
.contains('/protobuf_handler/lib/generated/')) {
lib.name ??= lib.importUri.pathSegments.last;
actual += kernelLibraryToString(lib);
}
}
// Remove library paths.
actual = actual.replaceAll(Uri.file(pkgVmDir).toString(), 'file:pkg/vm');
}
compareResultWithExpectationsFile(source, actual);
ensureKernelCanBeSerializedToBinary(component);
}
String argsTestName(List<String> args) {
if (args.length > 0) {
return args.last;
}
return null;
}
main(List<String> args) {
final testNameFilter = argsTestName(args);
group('transform-component', () {
final testCasesDir = new Directory(
pkgVmDir + '/testcases/transformations/type_flow/transformer');
for (var entry
in testCasesDir.listSync(recursive: true, followLinks: false)) {
final path = entry.path;
if (path.endsWith('.dart') &&
!path.endsWith('.pb.dart') &&
(testNameFilter == null || path.contains(testNameFilter))) {
final bool enableNullSafety = path.endsWith('_nnbd_strong.dart');
final bool enableNNBD = enableNullSafety || path.endsWith('_nnbd.dart');
final List<String> experimentalFlags = [
if (enableNNBD) 'non-nullable',
];
test(path,
() => runTestCase(entry.uri, experimentalFlags, enableNullSafety));
}
}
}, timeout: Timeout.none);
}