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

// OtherResources=process_echo_util.dart

import "dart:async";
import "dart:io";
import "dart:isolate";
import "package:path/path.dart";
import "package:async_helper/async_helper.dart";

void testRunShell() {
  test(args) {
    asyncStart();
    var script = Platform.script.resolve("process_echo_util.dart").toFilePath();
    Process.run(
            Platform.executable,
            []
              ..addAll(Platform.executableArguments)
              ..add(script)
              ..addAll(args),
            runInShell: true)
        .then((process_result) {
      var result;
      if (Platform.operatingSystem == "windows") {
        result = process_result.stdout.split("\r\n");
      } else {
        result = process_result.stdout.split("\n");
      }
      if (result.length - 1 != args.length) {
        throw "wrong number of args: $args vs $result";
      }
      for (int i = 0; i < args.length; i++) {
        if (args[i] != result[i]) {
          throw "bad result at $i: '${args[i]}' vs '${result[i]}'";
        }
      }
      asyncEnd();
    });
  }

  test(["\""]);
  test(["a b"]);
  test(["'"]);
  test(["'", "'"]);
  test(["'\"\"'\"'\"'"]);
  test(["'\"\"'", "\"'\"'"]);
  test(["'\\\"\\\"'\\", "\"\\'\"'"]);
  test(["'\$HOME'"]);
  test(["'\$tmp'"]);
  test(["arg'"]);
  test(["arg\\'", "'\\arg"]);
}

void testBadRunShell() {
  test(exe, [List<String> args = const []]) {
    asyncStart();
    Process.run(exe, args, runInShell: true).then((result) {
      if (result.exitCode == 0) {
        throw "error expected";
      }
      asyncEnd();
    });
  }

  test("'\"'");
  test("'\$HOME'");
}

void main() {
  testRunShell();
  testBadRunShell();
}
