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

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