// Currently disabled as they somewhat mess up the test output.
module std::os::process @test @if(false);
import std::os, std::io;

fn void test_inherit_stdio_stdout()
{
    // Test that with inherit_stdio, we can't capture stdout
    String[] command;
    $if env::WIN32:
        command = { "cmd.exe", "/c", "echo Hello with inherit_stdio" };
    $else
        command = { "echo", "Hello with inherit_stdio" };
    $endif
    
    SubProcess process = process::create(command, 
        { .search_user_path = true, .inherit_stdio = true })!!;
    defer process.destroy();
    
    // Join the process
    process.join()!!;
    
    // When using inherit_stdio, read_stdout should return 0 bytes
    char[100] buffer;
    usz bytes_read = process.read_stdout(&buffer[0], buffer.len)!!;
    assert(bytes_read == 0, "Expected 0 bytes when using inherit_stdio, got %d", bytes_read);
    
    // stdout() should return an empty file
    File stdout_file = process.stdout();
    assert(stdout_file.file == null, "Expected null file when using inherit_stdio");
}

fn void test_inherit_stdio_stderr()
{
    // Test that with inherit_stdio, stderr is also null
    String[] command;
    $if env::WIN32:
        command = { "cmd.exe", "/c", "echo Error >&2" };
    $else
        command = { "sh", "-c", "echo Error >&2" };
    $endif
    
    SubProcess process = process::create(command,
        { .search_user_path = true, .inherit_stdio = true })!!;
    defer process.destroy();
    
    process.join()!!;
    
    // stderr() should return null file
    File stderr_file = process.stderr();
    assert(stderr_file.file == null, "Expected null file when using inherit_stdio");
    
    // read_stderr should return 0 bytes
    char[100] buffer;
    usz bytes_read = process.read_stderr(&buffer[0], buffer.len)!!;
    assert(bytes_read == 0, "Expected 0 bytes when reading stderr with inherit_stdio");
}

fn void test_inherit_stdio_comparison()
{
    // Compare behavior with and without inherit_stdio
    String[] command;
    $if env::WIN32:
        command = { "cmd.exe", "/c", "echo Test output" };
    $else
        command = { "echo", "Test output" };
    $endif
    
    // First without inherit_stdio
    SubProcess process1 = process::create(command, { .search_user_path = true })!!;
    defer process1.destroy();
    
    process1.join()!!;
    
    char[100] buffer1;
    usz bytes_read1 = process1.read_stdout(&buffer1[0], buffer1.len)!!;
    assert(bytes_read1 > 0, "Expected output without inherit_stdio");
    
    // Now with inherit_stdio
    SubProcess process2 = process::create(command, 
        { .search_user_path = true, .inherit_stdio = true })!!;
    defer process2.destroy();
    
    process2.join()!!;
    
    char[100] buffer2;
    usz bytes_read2 = process2.read_stdout(&buffer2[0], buffer2.len)!!;
    assert(bytes_read2 == 0, "Expected no output with inherit_stdio");
}

fn void test_inherit_stdio_exit_code()
{
    // Test that processes complete successfully with inherit_stdio
    String[] command;
    $if env::WIN32:
        command = { "cmd.exe", "/c", "exit 0" };
    $else
        command = { "true" };
    $endif
    
    SubProcess process = process::create(command,
        { .search_user_path = true, .inherit_stdio = true })!!;
    defer process.destroy();
    
    CInt exit_code = process.join()!!;
    assert(exit_code == 0, "Process should exit with code 0, got %d", exit_code);
    
    // Verify process is not running after join
    assert(!process.is_alive, "Process should not be running after join");
}

fn void test_inherit_stdio_redirect() 
{
    // This test verifies that stdio inheritance doesn't crash and works with the OS
    String[] command;
    
    $if env::WIN32:
        // Create a test command that will write to stdout
        command = { "cmd.exe", "/c", "echo Test output from child process with inherit_stdio" };
    $else
        // For POSIX systems
        command = { "echo", "Test output from child process with inherit_stdio" };
    $endif
    
    // Create a subprocess that inherits stdio
    SubProcess process = process::create(command,
        { .search_user_path = true, .inherit_stdio = true })!!;
    defer process.destroy();
    
    // Wait for process to complete
    CInt exit_code = process.join()!!;
    
    // Since inherit_stdio is enabled, verify:
    // 1. Process completed successfully
    // 2. We can't read from its stdout/stderr (as expected)
    assert(exit_code == 0, "Process should complete successfully");
    assert(process.stdout().file == null, "stdout should be null with inherit_stdio");
    assert(process.stderr().file == null, "stderr should be null with inherit_stdio");
    
    char[100] buffer;
    usz stdout_bytes = process.read_stdout(&buffer[0], buffer.len)!!;
    usz stderr_bytes = process.read_stderr(&buffer[0], buffer.len)!!;
    
    assert(stdout_bytes == 0, "Should read 0 bytes from stdout");
    assert(stderr_bytes == 0, "Should read 0 bytes from stderr");
}