// Copyright (c) 2020, 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/kernel.dart';
import 'package:test/test.dart';
import 'package:vm/transformations/deferred_loading.dart'
    show transformComponent;

import '../common_test_utils.dart';

final String pkgVmDir = Platform.script.resolve('../..').toFilePath();

runTestCase(Uri source) async {
  final target = new TestingVmTarget(new TargetFlags());
  Component component =
      await compileTestCaseToKernelProgram(source, target: target);

  // Disrupt the import order as a way of simulating issue 42985.
  final reversed = component.libraries.reversed.toList();
  component.libraries.setAll(0, reversed);

  component = transformComponent(component);

  // Remove core libraries so the expected output isn't enormous and broken by
  // core libraries changes.
  component.libraries.removeWhere((lib) => lib.importUri.scheme == "dart");

  String actual = kernelComponentToString(component);

  // Remove absolute library URIs.
  actual = actual.replaceAll(new Uri.file(pkgVmDir).toString(), '#pkg/vm');

  compareResultWithExpectationsFile(source, actual);
}

main() {
  group('deferred-loading', () {
    final testCasesDir =
        new Directory(pkgVmDir + '/testcases/transformations/deferred_loading');

    for (var entry in testCasesDir
        .listSync(recursive: true, followLinks: false)
        .reversed) {
      if (entry.path.endsWith("main.dart")) {
        test(entry.path, () => runTestCase(entry.uri));
      }
    }
  });
}
