// Copyright (c) 2017, 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.

/**
 * @assertion
 * Future<ProcessResult> run(
 *     String executable,
 *     List<String> arguments, {
 *     String workingDirectory,
 *     Map<String, String> environment,
 *     bool includeParentEnvironment: true,
 *     bool runInShell: false,
 *     Encoding stdoutEncoding: systemEncoding,
 *     Encoding stderrEncoding: systemEncoding
 * })
 *
 * Starts a process and runs it non-interactively to completion. The process
 * run is executable with the specified arguments.
 * ...
 * Returns a Future<ProcessResult> that completes with the result of running
 * the process, i.e., exit code, standard out and standard in.
 *
 * @description Checks that static method [run] starts a process and runs it
 * non-interactively to completion. Returns a Future<ProcessResult> that
 * completes with the result of running the process, i.e., exit code, standard
 * out and standard in. Test that there should be an error code 64 if invalid
 * file path is used on Windows
 * (see https://github.com/dart-lang/sdk/issues/31611)
 * @author sgrekhov@unipro.ru
 * @issue 31611
 */
import "dart:io";
import "../../../Utils/expect.dart";

main() {
  if (Platform.isWindows) {
    String executable = Platform.resolvedExecutable;
    File file = new File.fromUri(Platform.script.resolve("not_existing.dart"));
    asyncStart();
    Process.run(executable, [file.path]).then((ProcessResult results) {
      Expect.equals(64, results.exitCode);
      Expect.notEquals("", results.stderr);
      asyncEnd();
    });
  }
}
