feat: implement clip deletion via 'd' key and CMD_DELETE command
This commit is contained in:
committed by
Loic Coenen (aider)
parent
18eb27e9c8
commit
2c30bba5fa
94
e2e/test_delete_clip.ts
Normal file
94
e2e/test_delete_clip.ts
Normal file
@@ -0,0 +1,94 @@
|
||||
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();
|
||||
}
|
||||
Reference in New Issue
Block a user