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

import 'dart:io';

import "package:expect/expect.dart";
import "package:path/path.dart" as path;

import "process_test_util.dart";

void testProcessRunBinaryOutput() {
  var result = Process.runSync(getProcessTestFileName(), const [
    "0",
    "0",
    "0",
    "0",
  ], stdoutEncoding: null);
  Expect.isTrue(result.stdout is List<int>);
  Expect.isTrue(result.stderr is String);

  result = Process.runSync(getProcessTestFileName(), const [
    "0",
    "0",
    "0",
    "0",
  ], stderrEncoding: null);
  Expect.isTrue(result.stdout is String);
  Expect.isTrue(result.stderr is List<int>);

  result = Process.runSync(
    getProcessTestFileName(),
    const ["0", "0", "0", "0"],
    stdoutEncoding: null,
    stderrEncoding: null,
  );
  Expect.isTrue(result.stdout is List<int>);
  Expect.isTrue(result.stderr is List<int>);
}

void testProcessPathWithSpace() {
  // Bug: https://github.com/dart-lang/sdk/issues/37751
  var processTest = new File(getProcessTestFileName());
  var dir = Directory.systemTemp.createTempSync('process_run_test');
  try {
    File(path.join(dir.path, 'path')).createSync();
    var innerDir = Directory(path.join(dir.path, 'path with space'));
    innerDir.createSync();
    processTest = processTest.copySync(
      path.join(
        innerDir.path,
        'process_run_test${getPlatformExecutableExtension()}',
      ),
    );
    // It will run executables without throwing exception.
    var result = Process.runSync(processTest.path, []);
    // Kill the isolate because next test reuse the exe file.
    Process.killPid(result.pid);
    // Manually escape the path
    if (Platform.isWindows) {
      result = Process.runSync('"${processTest.path}"', []);
      Process.killPid(result.pid);
    }
    result = Process.runSync('${processTest.path}', []);
    Process.killPid(result.pid);
  } catch (e) {
    Expect.fail('System should find process_run_test executable ($e)');
  } finally {
    // Clean up the temp files and directory
    dir.deleteSync(recursive: true);
  }
}

void main() {
  testProcessRunBinaryOutput();
  testProcessPathWithSpace();
}
