// 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
/// })
/// ...
/// The encoding used for decoding stdout and stderr into text is controlled
/// through stdoutEncoding and stderrEncoding. The default encoding is
/// systemEncoding. If null is used no decoding will happen and the
/// ProcessResult will hold binary data.
///
/// @description Checks that if [stderrEncoding] is null no decoding is happen
/// and ProcessResult.stderr holds binary data.
/// @author ngl@unipro.ru
/// @issue 30945

import "dart:convert";
import "dart:io";
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 = 'echo';
    args = ['abc'];
  }
}

main() {
  setCommand();
  asyncStart();
  Process.run(command, args, stderrEncoding: null).then((ProcessResult results) {
    Expect.equals(0, results.exitCode);
    Expect.isTrue(results.stdout is String);
    Expect.isTrue(results.stderr is List);
    if (Platform.isWindows) {
      Expect.equals(0, (results.stderr).length);
      Expect.isTrue(results.stdout.indexOf(Platform.version) > -1);
    } else {
      Expect.isTrue(results.stdout.substring(0, 3) == "abc");
      Expect.isTrue((results.stderr).length == 0);
      Utf8Decoder decoder = new Utf8Decoder();
      String decoded = decoder.convert(results.stderr);
      Expect.equals("", decoded);
    }
    asyncEnd();
  });
}
