psmux 3.3.2

Terminal multiplexer for Windows - tmux alternative for PowerShell and Windows Terminal
<#
.SYNOPSIS
    Tests for bug fixes: confirm-before, display-menu, display-message, display-popup, format variables.
.DESCRIPTION
    Verifies:
    - Bug #1: display-popup close-on-exit default, title truncation
    - Bug #2: display-message status bar rendering (manual/visual only)
    - Bug #3: display-menu item selection executes commands
    - Bug #4: confirm-before 'y' executes the confirmed command
    - Bug #5: Format variables (#S etc.) show correct session name
    - Auth fix: send_control_to_port properly authenticates loopback connections
#>

param(
    [string]$SessionName = "overlay-bugfix-test"
)

$ErrorActionPreference = "Continue"
$pass = 0; $fail = 0; $skip = 0

function Send-AuthCmd {
    param([int]$Port, [string]$Key, [string]$Cmd)
    $tcp = New-Object System.Net.Sockets.TcpClient("127.0.0.1", $Port)
    $tcp.NoDelay = $true
    $stream = $tcp.GetStream()
    $bytes = [System.Text.Encoding]::UTF8.GetBytes("AUTH $Key`n$Cmd`n")
    $stream.Write($bytes, 0, $bytes.Length)
    $stream.Flush()
    Start-Sleep -Milliseconds 200
    $tcp.Close()
}

function Get-PaneCount {
    param([string]$Session)
    $result = psmux list-panes -t $Session 2>&1
    $lines = ($result | Where-Object { $_ -match '^\d+:' })
    if ($lines -is [array]) { return $lines.Count } elseif ($lines) { return 1 } else { return 0 }
}

Write-Host "=== Overlay Bug Fix Tests ===" -ForegroundColor Cyan
Write-Host ""

# Setup: create session
$env:PSMUX_TARGET_SESSION = $SessionName
psmux new-session -d -s $SessionName 2>$null
Start-Sleep -Milliseconds 1000

$keyPath = "$env:USERPROFILE\.psmux\$SessionName.key"
$portPath = "$env:USERPROFILE\.psmux\$SessionName.port"
if (!(Test-Path $keyPath) -or !(Test-Path $portPath)) {
    Write-Host "FAIL: Session '$SessionName' not created properly" -ForegroundColor Red
    exit 1
}
$key = (Get-Content $keyPath).Trim()
$port = [int](Get-Content $portPath).Trim()
Write-Host "Session '$SessionName' created (port=$port)" -ForegroundColor Gray

# ----------------------------------------------------------------
# Test 1: display-message -p format variables (Bug #5)
# ----------------------------------------------------------------
Write-Host ""
Write-Host "--- Test 1: display-message -p format variables ---" -ForegroundColor Yellow

$sessionResult = psmux display-message -t $SessionName -p "#S" 2>&1
if ($sessionResult.Trim() -eq $SessionName) {
    Write-Host "  PASS: #S = '$($sessionResult.Trim())'" -ForegroundColor Green; $pass++
} else {
    Write-Host "  FAIL: #S = '$($sessionResult.Trim())', expected '$SessionName'" -ForegroundColor Red; $fail++
}

$winIdx = psmux display-message -t $SessionName -p "#{window_index}" 2>&1
if ($winIdx.Trim() -eq "0") {
    Write-Host "  PASS: #{window_index} = '$($winIdx.Trim())'" -ForegroundColor Green; $pass++
} else {
    Write-Host "  FAIL: #{window_index} = '$($winIdx.Trim())', expected '0'" -ForegroundColor Red; $fail++
}

# ----------------------------------------------------------------
# Test 2: confirm-before + confirm-respond y → kill-pane (Bug #4)
# ----------------------------------------------------------------
Write-Host ""
Write-Host "--- Test 2: confirm-before → kill-pane (Bug #4) ---" -ForegroundColor Yellow

# Setup: split to get 2 panes
psmux split-window -t $SessionName 2>$null
Start-Sleep -Milliseconds 500
$before = Get-PaneCount $SessionName
if ($before -ne 2) {
    Write-Host "  SKIP: Could not create 2 panes (got $before)" -ForegroundColor Yellow; $skip++
} else {
    # Send confirm-before kill-pane
    Send-AuthCmd -Port $port -Key $key -Cmd "confirm-before kill-pane"
    Start-Sleep -Milliseconds 500
    # Respond yes
    Send-AuthCmd -Port $port -Key $key -Cmd "confirm-respond y"
    Start-Sleep -Milliseconds 500

    $after = Get-PaneCount $SessionName
    if ($after -eq 1) {
        Write-Host "  PASS: kill-pane via confirm: $before → $after panes" -ForegroundColor Green; $pass++
    } else {
        Write-Host "  FAIL: Expected 1 pane after confirm kill-pane, got $after" -ForegroundColor Red; $fail++
    }
}

# ----------------------------------------------------------------
# Test 3: confirm-before + confirm-respond n → no-op
# ----------------------------------------------------------------
Write-Host ""
Write-Host "--- Test 3: confirm-before → respond n (no-op) ---" -ForegroundColor Yellow

$beforeN = Get-PaneCount $SessionName
Send-AuthCmd -Port $port -Key $key -Cmd "confirm-before kill-pane"
Start-Sleep -Milliseconds 500
Send-AuthCmd -Port $port -Key $key -Cmd "confirm-respond n"
Start-Sleep -Milliseconds 500

$afterN = Get-PaneCount $SessionName
if ($afterN -eq $beforeN) {
    Write-Host "  PASS: confirm-respond n preserved pane count ($afterN)" -ForegroundColor Green; $pass++
} else {
    Write-Host "  FAIL: Expected $beforeN panes after 'n', got $afterN" -ForegroundColor Red; $fail++
}

# ----------------------------------------------------------------
# Test 4: confirm-before → split-window (loopback auth, Bug #4 + auth fix)
# ----------------------------------------------------------------
Write-Host ""
Write-Host "--- Test 4: confirm-before → split-window (loopback) ---" -ForegroundColor Yellow

$beforeSplit = Get-PaneCount $SessionName
Send-AuthCmd -Port $port -Key $key -Cmd "confirm-before split-window"
Start-Sleep -Milliseconds 500
Send-AuthCmd -Port $port -Key $key -Cmd "confirm-respond y"
Start-Sleep -Milliseconds 1000

$afterSplit = Get-PaneCount $SessionName
if ($afterSplit -eq ($beforeSplit + 1)) {
    Write-Host "  PASS: split-window via confirm: $beforeSplit → $afterSplit panes" -ForegroundColor Green; $pass++
} else {
    Write-Host "  FAIL: Expected $($beforeSplit + 1) panes after confirm split, got $afterSplit" -ForegroundColor Red; $fail++
}

# ----------------------------------------------------------------
# Test 5: display-menu → menu-select (Bug #3)
# ----------------------------------------------------------------
Write-Host ""
Write-Host "--- Test 5: display-menu → menu-select kill-pane (Bug #3) ---" -ForegroundColor Yellow

# Ensure we have 2+ panes
$currentPanes = Get-PaneCount $SessionName
if ($currentPanes -lt 2) {
    psmux split-window -t $SessionName 2>$null
    Start-Sleep -Milliseconds 500
    $currentPanes = Get-PaneCount $SessionName
}

if ($currentPanes -lt 2) {
    Write-Host "  SKIP: Could not create 2 panes for menu test" -ForegroundColor Yellow; $skip++
} else {
    $beforeMenu = $currentPanes
    # Display menu with kill-pane as first item
    Send-AuthCmd -Port $port -Key $key -Cmd 'display-menu "Kill Pane" k kill-pane "New Window" n new-window'
    Start-Sleep -Milliseconds 500
    # Select item 0 (Kill Pane)
    Send-AuthCmd -Port $port -Key $key -Cmd "menu-select 0"
    Start-Sleep -Milliseconds 500

    $afterMenu = Get-PaneCount $SessionName
    if ($afterMenu -eq ($beforeMenu - 1)) {
        Write-Host "  PASS: menu-select kill-pane: $beforeMenu → $afterMenu panes" -ForegroundColor Green; $pass++
    } else {
        Write-Host "  FAIL: Expected $($beforeMenu - 1) panes after menu kill-pane, got $afterMenu" -ForegroundColor Red; $fail++
    }
}

# ----------------------------------------------------------------
# Test 6: display-message without -p (Bug #2 - status bar)
# ----------------------------------------------------------------
Write-Host ""
Write-Host "--- Test 6: display-message without -p (Bug #2) ---" -ForegroundColor Yellow
Write-Host "  INFO: Status bar display requires TUI client - testing command acceptance" -ForegroundColor Gray

# Just verify the command doesn't error
Send-AuthCmd -Port $port -Key $key -Cmd 'display-message "Hello from test"'
Start-Sleep -Milliseconds 200
# If we get here without crash, the command was accepted
Write-Host "  PASS: display-message command accepted by server" -ForegroundColor Green; $pass++

# ----------------------------------------------------------------
# Test 7: display-popup close-on-exit default (Bug #1)
# ----------------------------------------------------------------
Write-Host ""
Write-Host "--- Test 7: display-popup (Bug #1) ---" -ForegroundColor Yellow
Write-Host "  INFO: Popup rendering requires TUI client - testing command acceptance" -ForegroundColor Gray

Send-AuthCmd -Port $port -Key $key -Cmd 'display-popup "echo test"'
Start-Sleep -Milliseconds 500
# Close the popup
Send-AuthCmd -Port $port -Key $key -Cmd 'overlay-close'
Start-Sleep -Milliseconds 200
Write-Host "  PASS: display-popup + overlay-close accepted" -ForegroundColor Green; $pass++

# ----------------------------------------------------------------
# Cleanup
# ----------------------------------------------------------------
Write-Host ""
psmux kill-session -t $SessionName 2>$null

# Results
Write-Host "=== Results ===" -ForegroundColor Cyan
Write-Host "  PASS: $pass" -ForegroundColor Green
Write-Host "  FAIL: $fail" -ForegroundColor Red
Write-Host "  SKIP: $skip" -ForegroundColor Yellow
Write-Host ""

if ($fail -gt 0) { exit 1 } else { exit 0 }