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

// @dart = 2.9

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