// 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:path/path.dart' as path;

import 'spawn_uri__package_uri__test.dart';

final executable = Platform.executable;

main() async {
  // Make a folder structure that has both ".dart_tool/package_config.json" and
  // ".packages" and ensure VM prefers to use ".packages".
  await withTempDir((String tempDir) async {
    // Setup bogus ".packages" with "foo -> ..." with invalid mapping.
    final dotPackagesPath = path.join(tempDir, '.packages');
    final dotPackagesFile = File(dotPackagesPath);
    await dotPackagesFile.writeAsString(buildDotPackages('invalid'));

    // Setup ".dart_tool/package_config.json".
    final dotDartToolDir = path.join(tempDir, '.dart_tool');
    await Directory(dotDartToolDir).create();
    final packageConfigJsonPath =
        path.join(dotDartToolDir, 'package_config.json');
    final packageConfigJsonFile = File(packageConfigJsonPath);
    await packageConfigJsonFile.writeAsString(buildPackageConfig('foo', true));

    final mainFile = path.join(tempDir, 'main.dart');
    await File(mainFile).writeAsString('''
import 'dart:io' as io;
import 'dart:isolate';

main() async {
  final uri = await Isolate.packageConfig;
  final expectedUri = Uri.parse('${packageConfigJsonFile.uri}');
  if (uri != expectedUri) {
    throw 'VM should use .packages file (but used \$uri).';
  }
}
''');

    await run(executable, [mainFile]);
  });
}
