/*
 * 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 void exit(int code)
 * The handling of exit codes is platform specific.
 * On Linux and OS X an exit code for normal termination will always be in the
 * range [0..255]. If an exit code outside this range is set the actual exit
 * code will be the lower 8 bits masked off and treated as an unsigned value.
 * E.g. using an exit code of [-1] will result in an actual exit code of [255]
 * being reported.
 * @description Checks for Linux OS that if exit codes is not in the [0..255]
 * range than lower 8 bits masked off and treated as unsigned value is returned.
 * @author iarkh@unipro.ru
 */
import "../../../Utils/expect.dart";
import "dart:io";

run_process(i) {
  exit(i);
}

run_main(int code, int expected) async {
  String executable = Platform.resolvedExecutable;
  String eScript = Platform.script.toString();
  int called = 0;
  await Process.run(executable, [
    ...Platform.executableArguments,
    eScript,
    code.toString()
  ]).then((ProcessResult results) {
    Expect.equals(expected, results.exitCode);
    called++;
  });
  Expect.equals(1, called);
}

main(List<String> args) {
  if (!Platform.isWindows) {
    if (args.length > 0)
      run_process(int.parse(args[0]));
    else {
      run_main(-1, 255);
      run_main(-255, 1);
      run_main(-1000, 24);
      run_main(256, 0);
      run_main(300, 44);
      run_main(400, 144);
      run_main(10000, 16);
    }
  }
}
