diff --git a/crates/engine/src/cmd/design/slide_background.rs b/crates/engine/src/cmd/design/slide_background.rs index 0de78e7e..92f3ce77 100644 --- a/crates/engine/src/cmd/design/slide_background.rs +++ b/crates/engine/src/cmd/design/slide_background.rs @@ -1,6 +1,6 @@ use super::{ Arc, BTreeSet, Background, Fill, NO_ID_SPACE, Presentation, Result, Session, Target, Value, bad, bool_or, bool_param, color_param, color_value, - f64_param, ok, usize_param, with_param, + f64_param, ok, opt_usize_param, usize_param, with_param, }; pub(super) fn background(s: &mut Session, p: &Value) -> Result { @@ -62,7 +62,7 @@ pub(super) fn background(s: &mut Session, p: &Value) -> Result { )); }; let all = bool_or(p, "all", false); - let index = usize_param(p, "index"); + let index = opt_usize_param(p, "index", "design.background")?; if matches!(op, BgOp::Adjust) { let next = { let st = s.doc()?; diff --git a/crates/engine/src/cmd/design/tests.rs b/crates/engine/src/cmd/design/tests.rs index 9765fcc8..82eed6fe 100644 --- a/crates/engine/src/cmd/design/tests.rs +++ b/crates/engine/src/cmd/design/tests.rs @@ -485,3 +485,16 @@ fn background_all_clears_layout_overrides_even_if_slides_and_master_match() { s.execute("design.background", &json!({"color": "#AA0000", "all": true})).unwrap(); assert_eq!(undo_len(&s), n + 1, "now it is truly a no-op"); } + +#[test] +fn background_rejects_invalid_index() { + let mut s = Session::with_new(); + s.execute("slide.new", &json!({})).unwrap(); + s.execute("slide.go", &json!({"index": 0})).unwrap(); + let before = s.doc().unwrap().doc.slides[0].background.clone(); + for bad in [json!(-1), json!(1.5)] { + assert!(s.execute("design.background", &json!({"color": "#0000C8", "index": bad})).is_err()); + assert!(s.execute("design.background", &json!({"transparency": 0.5, "index": bad})).is_err()); + assert_eq!(s.doc().unwrap().doc.slides[0].background, before); + } +}