<#
.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 }