95 lines
3.1 KiB
TypeScript
95 lines
3.1 KiB
TypeScript
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<void> {
|
||
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();
|
||
}
|