// 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<Process> start(
///     String executable,
///     List<String> arguments, {
///     String workingDirectory,
///     Map<String, String> environment,
///     bool includeParentEnvironment: true,
///     bool runInShell: false,
///     ProcessStartMode mode: ProcessStartMode.normal
/// })
/// ...
/// If mode is ProcessStartMode.normal (the default) a child process will be
/// started with stdin, stdout and stderr connected.
///
/// @description Checks that if mode is ProcessStartMode.normal (the default) a
/// child process will be started with stdin, stdout and stderr connected. Also
/// process pid and exitCode are available.
/// @author ngl@unipro.ru
/// @issue 30945

import "dart:convert";
import "dart:io";
import "dart:async";
import "../../../Utils/expect.dart";

String command = "";
List<String> args = new List<String>.empty(growable: true);

void setCommand() {
  if (Platform.isWindows) {
    command = Platform.resolvedExecutable;
    args = ['--version'];
  } else {
    command = 'pwd';
    args = [];
  }
}

Future testEmpty(var stream) {
  return stream.toList().then((List errList) {
    Expect.equals(0, errList.length);
  });
}

Future testNotEmpty(var stream) {
  return stream.toList().then((List outList) {
    Utf8Decoder decoder = new Utf8Decoder();
    String decoded = decoder.convert(outList[0]);
    Expect.isTrue(decoded.length > 0);
  });
}

main() {
  setCommand();
  asyncStart();
  Process.start(command, args, mode: ProcessStartMode.normal)
      .then((Process process) {
    if (Platform.isWindows) {
      testEmpty(process.stderr).then((_) {
        testNotEmpty(process.stdout).then((_) {
          asyncEnd();
        });
      });
    } else {
      testEmpty(process.stderr).then((_) {
        testNotEmpty(process.stdout).then((_) {
          asyncEnd();
        });
      });
    }
  });
}
