// Copyright (c) 2016, 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 "dart:isolate";
import "package:expect/expect.dart";

main() async {
  var pkgRoot = Uri.parse("file:///no/such/directory/");
  var pkgConfig = Uri.parse("file:///no/such/.packages");
  try {
    var i = await Isolate.spawnUri(Platform.script, [], null,
        packageRoot: pkgRoot, packageConfig: pkgConfig);
  } catch (e) {
    print(e);
    Expect.isTrue(e is ArgumentError);
  }
  try {
    var i = await Isolate.spawnUri(Platform.script, [], null,
        packageRoot: pkgRoot, automaticPackageResolution: true);
  } catch (e) {
    print(e);
    Expect.isTrue(e is ArgumentError);
  }
  try {
    var i = await Isolate.spawnUri(Platform.script, [], null,
        packageConfig: pkgConfig, automaticPackageResolution: true);
  } catch (e) {
    print(e);
    Expect.isTrue(e is ArgumentError);
  }
  try {
    var i = await Isolate.spawnUri(Platform.script, [], null,
        packageRoot: pkgRoot,
        packageConfig: pkgConfig,
        automaticPackageResolution: true);
  } catch (e) {
    print(e);
    Expect.isTrue(e is ArgumentError);
  }
}
