From 89d113a52a77c23f0fae85d3d64d8aa23dc23df7 Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Sat, 17 Oct 2026 04:29:15 +0200 Subject: [PATCH] Reject unknown param in automation.clear instead of clearing all lanes Found while testing crates/engine/src/cmd/mix.rs:516 (clear_lane) Co-Authored-By: Claude Haiku 5.5 Co-Authored-By: Claude Sonnet 5.5 --- crates/engine/src/cmd/mix.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/crates/engine/src/cmd/mix.rs b/crates/engine/src/cmd/mix.rs index c0569429..d93cbe8b 100644 --- a/crates/engine/src/cmd/mix.rs +++ b/crates/engine/src/cmd/mix.rs @@ -513,7 +513,7 @@ pub(crate) fn current_value(tr: &soundcraft_model::Track, param: &AutoParam) -> fn clear_lane(e: &mut Engine, p: &Value) -> Result { let tracks = tracks_required(e, "automation.clear", p)?; - let param = str_param(p, "param").and_then(AutoParam::parse); + let param = if str_param(p, "param").is_some() { Some(lane_param(p, "automation.clear")?) } else { None }; let r = range_param(e, "automation.clear", p)?; let (a, b) = if r.is_empty() { (i64::MIN, i64::MAX) } else { (r.start, r.end) }; let s = e.session_mut(); @@ -886,4 +886,19 @@ mod tests { assert_eq!(sl.target, soundcraft_model::Route::Bus(delay)); assert_eq!((sl.level_db, sl.pan, sl.mute, sl.pre_fader), (-9.0, 0.5, true, true)); } + + #[test] + fn clear_with_unknown_param_keeps_lanes() { + let (mut e, t) = tone_session(&[(0, -6.0), (100, -3.0)]); + e.session_mut().track_mut(t).unwrap().lane_mut(&AutoParam::Pan(0)).set_point(0, 0.5); + e.session_mut().edit.selection = Range::new(0, 0); + let count = |e: &Engine| e.session().track(t).unwrap().automation.iter().map(|l| l.points.len()).sum::(); + let r = e.execute("automation.clear", &json!({"track": t.0, "param": "volum"})); + assert!(r.is_err(), "unknown param succeeded: {r:?}"); + assert_eq!(count(&e), 3, "unknown param changed the lanes"); + e.execute("automation.clear", &json!({"track": t.0, "param": "volume"})).unwrap(); + assert_eq!(count(&e), 1, "named param cleared the wrong lanes"); + e.execute("automation.clear", &json!({"track": t.0})).unwrap(); + assert_eq!(count(&e), 0, "absent param must still clear every lane"); + } }