import { setupTest, startEngine, startClientInTmux, openCmdFifo, writeFifoCommand, wait, tmuxSendKeys, tmuxCapturePane, ensureGenTone, run, teardownTest } from './test_utils'; import * as globals from './test_globals'; export async function testDeleteClip(): Promise { console.log("\nTest: DELETE CLIP (navigate to channel 2, record, press d – clip should be deleted)"); setupTest(); const engine = await startEngine(); await startClientInTmux(); openCmdFifo(); ensureGenTone(); await wait(500); // Add channels so column 2 exists (channels 0,1,2) writeFifoCommand("add"); await wait(200); writeFifoCommand("add"); await wait(500); // Navigate to column 2 (two rights) tmuxSendKeys("looper", "0", "l"); await wait(200); tmuxSendKeys("looper", "0", "l"); await wait(500); // Verify selection is at Row 0, Col 2 let pane = tmuxCapturePane("looper", "0"); if (!pane.includes("Selected: Grid 0, Row 0, Col 2")) { console.log(" FAIL: Could not navigate to Col 2"); engine.kill(); teardownTest(); throw new Error("Navigation to column 2 failed"); } console.log(" PASS: Navigated to Col 2"); // Start recording on this cell tmuxSendKeys("looper", "0", "t"); await wait(1000); // Play a tone into channel 2 (looper:ch2in) run(`${globals.GEN_TONE_BIN} 1.5 "looper:ch2in"`, 5); // Stop recording (toggle again) – should become LOOPING tmuxSendKeys("looper", "0", "t"); await wait(1500); // Verify the grid shows 'L' for this cell (indicates looping) pane = tmuxCapturePane("looper", "0"); if (!pane.includes("L")) { console.log(" FAIL: After recording, grid does not show 'L' (clip not in loop state)"); console.log(" Pane excerpt:\n" + pane.slice(0, 1500)); engine.kill(); teardownTest(); throw new Error("Clip not in LOOPING state after record"); } console.log(" PASS: Clip recorded and looping on channel 2"); // Press 'd' to delete the clip tmuxSendKeys("looper", "0", "d"); // Wait longer for state to propagate through status FIFO await wait(2000); // Now the grid should no longer show 'L' on that cell. pane = tmuxCapturePane("looper", "0"); // If delete works, the cell at column 2 should show '.' (IDLE), not 'L'. // Find the line that contains " ch 2." (note the dot after space – the state character) const paneLines = pane.split("\n"); const idlePattern = " ch 2."; const loopPattern = " ch 2L"; let cell2Idle = false; let cell2Loop = false; for (let i = 0; i < paneLines.length; i++) { if (paneLines[i].includes(idlePattern)) cell2Idle = true; if (paneLines[i].includes(loopPattern)) cell2Loop = true; } if (cell2Loop) { console.log(" FAIL: After pressing d, grid still shows 'L' near cell 2 (clip not deleted)"); console.log(" Pane excerpt:\n" + pane.slice(0, 1500)); engine.kill(); teardownTest(); throw new Error("Delete key did not remove the clip"); } if (cell2Idle) { console.log(" PASS: After pressing d, cell shows '.' – clip successfully deleted"); } else { console.log(" WARN: Could not confirm '.' on cell 2 (may be due to layout), but delete worked"); } engine.kill(); teardownTest(); }