// Copyright (c) 2019, 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:io';

import 'package:kernel/ast.dart';
import 'package:kernel/kernel.dart';
import 'package:kernel/reference_from_index.dart';
import 'package:kernel/target/targets.dart';
import 'package:kernel/verifier.dart';

import 'package:test/test.dart';

import 'package:vm/transformations/ffi_native.dart' show transformLibraries;

import '../common_test_utils.dart';

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

class TestDiagnosticReporter extends DiagnosticReporter<Object, Object> {
  @override
  void report(Object message, int charOffset, int length, Uri? fileUri,
      {List<Object>? context}) {/* nop */}
}

runTestCase(Uri source) async {
  final target = TestingVmTarget(TargetFlags());

  Component component = await compileTestCaseToKernelProgram(source,
      target: target, experimentalFlags: ['generic-metadata']);

  final ReferenceFromIndex? referenceFromIndex = null;
  final DiagnosticReporter diagnosticReporter = TestDiagnosticReporter();

  transformLibraries(
      component, component.libraries, diagnosticReporter, referenceFromIndex);

  verifyComponent(component);

  final actual = kernelLibraryToString(component.mainMethod!.enclosingLibrary);

  compareResultWithExpectationsFile(source, actual);
}

main() {
  group('ffi-transformations', () {
    final testCasesDir = Directory(pkgVmDir + '/testcases/transformations/ffi');

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