/*
 * Copyright (c) 2018, 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 void add(List<int> data)
 * Adds byte data to the target consumer, ignoring [encoding].
 * The [encoding] does not apply to this method, and the [data] list is passed
 * directly to the target consumer as a stream event.
 * @description Checks that [data] passed directly and all is OK for any
 * [encoding] if the [data] contains some ascii codes.
 * @author iarkh@unipro.ru
 */
import "../../../Utils/expect.dart";
import "dart:convert";
import "dart:io";

List<int> aList = [0, 126, 84, 69, 83, 14, 84, 127];

run_process(IOSink sink) {
  sink.add(aList);
}

run_main(String mode, Encoding enc) async {
  String executable = Platform.resolvedExecutable;
  String eScript = Platform.script.toString();
  int called = 0;

  await Process.run(
          executable, [...Platform.executableArguments, eScript, mode],
          stdoutEncoding: enc, stderrEncoding: enc)
      .then((ProcessResult results) {
    Expect.equals(
        enc.decode(aList), mode == "err" ? results.stderr : results.stdout);
    called++;
  });
  Expect.equals(1, called);
}

main(List<String> args) {
  if (args.length > 0)
    run_process(args[0] == "err" ? stderr : stdout);
  else {
    run_main("out", ascii);
    run_main("out", utf8);
    run_main("out", latin1);
    run_main("out", systemEncoding);

    run_main("err", ascii);
    run_main("err", utf8);
    run_main("err", latin1);
    run_main("err", systemEncoding);
  }
}
