psmux 3.3.2

Terminal multiplexer for Windows - tmux alternative for PowerShell and Windows Terminal
# Issue #42 Tests - tmux -V / -v version flag, $TMUX env var, format variables
# https://github.com/psmux/psmux/issues/42
$ErrorActionPreference = "Continue"
$script:TestsPassed = 0
$script:TestsFailed = 0

function Write-Pass { param($msg) Write-Host "[PASS] $msg" -ForegroundColor Green; $script:TestsPassed++ }
function Write-Fail { param($msg) Write-Host "[FAIL] $msg" -ForegroundColor Red; $script:TestsFailed++ }
function Write-Info { param($msg) Write-Host "[INFO] $msg" -ForegroundColor Cyan }
function Write-Test { param($msg) Write-Host "[TEST] $msg" -ForegroundColor White }

$PSMUX = "$PSScriptRoot\..\target\release\psmux.exe"
if (-not (Test-Path $PSMUX)) {
    $PSMUX = "$PSScriptRoot\..\target\debug\psmux.exe"
}
if (-not (Test-Path $PSMUX)) {
    Write-Host "[FATAL] psmux binary not found. Run 'cargo build --release' first." -ForegroundColor Red
    exit 1
}

# Also test the tmux alias binary
$TMUX = "$PSScriptRoot\..\target\release\tmux.exe"
if (-not (Test-Path $TMUX)) {
    $TMUX = "$PSScriptRoot\..\target\debug\tmux.exe"
}

Write-Info "Using psmux binary: $PSMUX"
Write-Info "Using tmux binary: $TMUX"

# ============================================================
# Test 1: psmux -V (capital) prints version and exits
# ============================================================
Write-Test "Test 1: psmux -V prints version"
$output = & $PSMUX -V 2>&1
if ($LASTEXITCODE -eq 0 -and $output -match "psmux \d+\.\d+") {
    Write-Pass "psmux -V prints version: $output"
} else {
    Write-Fail "psmux -V did not print version (exit=$LASTEXITCODE): $output"
}

# ============================================================
# Test 2: psmux -v (lowercase) prints version and exits
# ============================================================
Write-Test "Test 2: psmux -v prints version (not hang/TUI)"
$job = Start-Job -ScriptBlock {
    param($bin)
    & $bin -v 2>&1
} -ArgumentList $PSMUX
$completed = $job | Wait-Job -Timeout 5
if ($completed) {
    $output = Receive-Job $job
    $exitCode = $job.ChildJobs[0].JobStateInfo.Reason
    if ($output -match "psmux \d+\.\d+") {
        Write-Pass "psmux -v prints version: $output"
    } else {
        Write-Fail "psmux -v unexpected output: $output"
    }
} else {
    Write-Fail "psmux -v hung (launched TUI instead of printing version)"
    Stop-Job $job
}
Remove-Job $job -Force

# ============================================================
# Test 3: tmux -V (capital) prints version and exits
# ============================================================
Write-Test "Test 3: tmux -V prints version"
if (Test-Path $TMUX) {
    $output = & $TMUX -V 2>&1
    if ($LASTEXITCODE -eq 0 -and $output -match "tmux \d+\.\d+") {
        Write-Pass "tmux -V prints version: $output"
    } else {
        Write-Fail "tmux -V did not print version (exit=$LASTEXITCODE): $output"
    }
} else {
    Write-Info "Skipped: tmux binary not found"
}

# ============================================================
# Test 4: tmux -v (lowercase) prints version and exits
# ============================================================
Write-Test "Test 4: tmux -v prints version (not hang/TUI)"
if (Test-Path $TMUX) {
    $job = Start-Job -ScriptBlock {
        param($bin)
        & $bin -v 2>&1
    } -ArgumentList $TMUX
    $completed = $job | Wait-Job -Timeout 5
    if ($completed) {
        $output = Receive-Job $job
        if ($output -match "tmux \d+\.\d+") {
            Write-Pass "tmux -v prints version: $output"
        } else {
            Write-Fail "tmux -v unexpected output: $output"
        }
    } else {
        Write-Fail "tmux -v hung (launched TUI instead of printing version)"
        Stop-Job $job
    }
    Remove-Job $job -Force
} else {
    Write-Info "Skipped: tmux binary not found"
}

# ============================================================
# Test 5: psmux --version prints version
# ============================================================
Write-Test "Test 5: psmux --version prints version"
$output = & $PSMUX --version 2>&1
if ($LASTEXITCODE -eq 0 -and $output -match "psmux \d+\.\d+") {
    Write-Pass "psmux --version prints version: $output"
} else {
    Write-Fail "psmux --version did not print version (exit=$LASTEXITCODE): $output"
}

# ============================================================
# Test 6: $TMUX env var inside pane has correct port (not 0)
# ============================================================
Write-Test "Test 6: TMUX env var inside initial pane has non-zero port"
$SESSION_NAME = "issue42_test_$(Get-Random)"
# Kill any lingering sessions
& $PSMUX kill-server -t $SESSION_NAME 2>&1 | Out-Null
Start-Sleep -Milliseconds 500

Start-Process -FilePath $PSMUX -ArgumentList "new-session", "-d", "-s", $SESSION_NAME -PassThru -WindowStyle Hidden | Out-Null
Start-Sleep -Seconds 3

# Verify session started
$sessions = (& $PSMUX ls 2>&1) -join "`n"
if ($sessions -notmatch [regex]::Escape($SESSION_NAME)) {
    Write-Fail "Could not start test session for TMUX env test"
} else {
    # Send a command to echo $TMUX inside the pane
    & $PSMUX send-keys -t $SESSION_NAME "echo TMUX_VAL=`$env:TMUX" Enter
    Start-Sleep -Seconds 2

    $paneContent = & $PSMUX capture-pane -t $SESSION_NAME -p 2>&1
    $paneText = ($paneContent | Out-String)

    # Look for TMUX_VAL= line and check the port is not 0
    if ($paneText -match "TMUX_VAL=/tmp/psmux-\d+/[^,]+,(\d+),\d+") {
        $portVal = $Matches[1]
        if ($portVal -ne "0") {
            Write-Pass "TMUX env has valid port: $portVal"
        } else {
            Write-Fail "TMUX env port is 0 (session lookup will fail)"
        }
    } else {
        Write-Fail "Could not find TMUX env var in pane output. Content: $($paneText.Substring(0, [Math]::Min(200, $paneText.Length)))"
    }
}

# ============================================================
# Test 7: Format variables work without -t from inside pane
# ============================================================
Write-Test "Test 7: Format variables resolve correctly from inside pane context"
# Use the session from Test 6 — send a command that runs psmux display-message
& $PSMUX send-keys -t $SESSION_NAME "& '$PSMUX' display-message -p '#{session_name}'" Enter
Start-Sleep -Seconds 2

$paneContent = & $PSMUX capture-pane -t $SESSION_NAME -p 2>&1
$paneText = ($paneContent | Out-String)

if ($paneText -match [regex]::Escape($SESSION_NAME)) {
    Write-Pass "Format variable #{session_name} resolved to '$SESSION_NAME' inside pane"
} else {
    Write-Fail "Format variable did not resolve inside pane. Content: $($paneText.Substring(0, [Math]::Min(300, $paneText.Length)))"
}

# Cleanup
Write-Info "Cleaning up session: $SESSION_NAME"
& $PSMUX kill-server -t $SESSION_NAME 2>&1 | Out-Null
Start-Sleep -Seconds 1

# ============================================================
# Summary
# ============================================================
Write-Host ""
Write-Host "========================================" -ForegroundColor White
Write-Host "  Issue #42 Test Results" -ForegroundColor White
Write-Host "========================================" -ForegroundColor White
Write-Host "  Passed: $($script:TestsPassed)" -ForegroundColor Green
Write-Host "  Failed: $($script:TestsFailed)" -ForegroundColor $(if ($script:TestsFailed -gt 0) { "Red" } else { "Green" })
Write-Host "========================================" -ForegroundColor White

if ($script:TestsFailed -gt 0) { exit 1 } else { exit 0 }