// 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('--verbosity=warning')
              ..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();
}
