// 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

// VMOptions=--enable-isolate-groups --experimental-enable-isolate-groups-jit
// VMOptions=--no-enable-isolate-groups

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);
  }
}
