| // Copyright (c) 2024, 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. |
| |
| import 'dart:convert' show json; |
| import 'dart:io'; |
| |
| import 'package:kernel/ast.dart'; |
| import 'package:kernel/core_types.dart'; |
| import 'package:kernel/kernel.dart'; |
| import 'package:kernel/target/targets.dart'; |
| import 'package:test/test.dart'; |
| import 'package:vm/modular/target/vm.dart' show VmTarget; |
| import 'package:vm/transformations/dynamic_interface_annotator.dart' |
| show annotateComponent; |
| |
| import '../common_test_utils.dart'; |
| |
| final Uri pkgVmDir = Platform.script.resolve('../..'); |
| |
| runTestCase(Uri testCaseDir) async { |
| final mainDart = testCaseDir.resolve('main.dart'); |
| final dynamicInterface = testCaseDir.resolve('dynamic_interface.yaml'); |
| final dynamicInterfaceYaml = |
| File.fromUri(dynamicInterface).readAsStringSync(); |
| final expectedDetailedDynamicInterface = testCaseDir.resolve( |
| 'detailed_dynamic_interface.json', |
| ); |
| |
| final target = VmTarget(TargetFlags()); |
| Component component = await compileTestCaseToKernelProgram( |
| mainDart, |
| target: target, |
| ); |
| final coreTypes = CoreTypes(component); |
| final detailedDynamicInterfaceJson = <String, List<Map<String, String>>>{}; |
| annotateComponent( |
| dynamicInterfaceYaml, |
| dynamicInterface, |
| component, |
| coreTypes, |
| detailedDynamicInterfaceJson: detailedDynamicInterfaceJson, |
| ); |
| |
| for (final lib in component.libraries) { |
| if (!lib.importUri.isScheme('dart')) { |
| print(lib.fileUri); |
| final actual = kernelLibraryToString( |
| lib, |
| ).replaceAll(pkgVmDir.toString(), 'file:pkg/vm/'); |
| compareResultWithExpectationsFile(lib.fileUri, actual); |
| } |
| } |
| |
| // Filter out core libraries. |
| for (final section in detailedDynamicInterfaceJson.entries) { |
| section.value.removeWhere((entry) => entry['library']!.startsWith('dart:')); |
| } |
| |
| final actualDetailedDynamicInterface = |
| json |
| .encode(detailedDynamicInterfaceJson) |
| .replaceAll(pkgVmDir.toString(), 'file:pkg/vm/') + |
| "\n"; |
| compareResultWithExpectationsFile( |
| expectedDetailedDynamicInterface, |
| actualDetailedDynamicInterface, |
| ); |
| } |
| |
| main() { |
| test('dynamic-interface-annotator', () async { |
| final testCaseDir = pkgVmDir.resolve( |
| 'testcases/transformations/dynamic_interface_annotator/', |
| ); |
| await runTestCase(testCaseDir); |
| }); |
| } |