From 45498c826890810f46a0145004aff060a08b3b62 Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Tue, 27 Oct 2026 02:34:20 +0000 Subject: [PATCH] Shift selection memory location ends on Cut Time and Insert Time Found while testing crates/engine/src/cmd/event.rs:162-167 (insert_time) and :188-194 (cut_time) Co-Authored-By: Claude Haiku 5.5 Co-Authored-By: Claude Sonnet 5.5 --- crates/engine/src/cmd/event.rs | 6 ++++++ crates/engine/tests/it/edit_modes.rs | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/crates/engine/src/cmd/event.rs b/crates/engine/src/cmd/event.rs index 018209b6..de9a056d 100644 --- a/crates/engine/src/cmd/event.rs +++ b/crates/engine/src/cmd/event.rs @@ -163,6 +163,8 @@ fn insert_time(e: &mut Engine, p: &Value) -> Result { if m.start >= r.start { m.start += r.len(); m.end += r.len(); + } else if m.end > r.start { + m.end += r.len(); } } Ok(json!({"inserted": r.len()})) @@ -190,6 +192,10 @@ fn cut_time(e: &mut Engine, p: &Value) -> Result { if m.start >= r.end { m.start -= r.len(); m.end -= r.len(); + } else if m.end >= r.end { + m.end -= r.len(); + } else if m.end > r.start { + m.end = r.start; } } Ok(json!({"removed": r.len()})) diff --git a/crates/engine/tests/it/edit_modes.rs b/crates/engine/tests/it/edit_modes.rs index 27d4a649..dc93d503 100644 --- a/crates/engine/tests/it/edit_modes.rs +++ b/crates/engine/tests/it/edit_modes.rs @@ -413,3 +413,23 @@ fn shuffle_lock_and_snap_rules_hold_when_a_call_names_tracks() { run(&mut e, "edit.mode", json!({"mode": "grid"})); assert!(e.execute("edit.snap_to_grid", &json!({"tracks": [t.0]})).is_err()); } + +fn selection_marker(e: &mut Engine, start: i64, end: i64) -> usize { + run(e, "markers.add", json!({"kind": "selection", "start": start, "end": end})); + e.session().markers.len() - 1 +} + +#[test] +fn cut_and_insert_time_move_the_end_of_a_spanning_selection_memory_location() { + let (mut e, _, _) = engine("slip"); + let a = selection_marker(&mut e, 1000, 5000); + let b = selection_marker(&mut e, 1000, 2500); + run(&mut e, "event.cut_time", json!({"start": 2000, "end": 3000})); + let m = &e.session().markers; + assert_eq!((m[a].start, m[a].end), (1000, 4000)); + assert_eq!((m[b].start, m[b].end), (1000, 2000)); + run(&mut e, "event.insert_time", json!({"start": 2000, "length": 1000})); + let m = &e.session().markers; + assert_eq!((m[a].start, m[a].end), (1000, 5000)); + assert_eq!((m[b].start, m[b].end), (1000, 2000)); +}