From c5d43a33e6ee1267b3e0658f198b60c54a730447 Mon Sep 17 00:00:00 2001 From: MarekSpodBiedry <73122968+MarekSpodBiedry@users.noreply.github.com> Date: Mon, 12 Oct 2026 08:27:34 +0200 Subject: [PATCH] Reject table.resize to a range that does not overlap the table (#575) --- crates/engine/src/cmd/extra.rs | 2 +- crates/engine/tests/table_resize_overlap.rs | 29 +++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 crates/engine/tests/table_resize_overlap.rs diff --git a/crates/engine/src/cmd/extra.rs b/crates/engine/src/cmd/extra.rs index a08f080..7eae0ff 100644 --- a/crates/engine/src/cmd/extra.rs +++ b/crates/engine/src/cmd/extra.rs @@ -812,7 +812,7 @@ fn table_resize(s: &mut Session, p: &Json) -> Result { let sheet = cx.sheet_mut(si)?; let headers: Vec = (r.start.col..=r.end.col).map(|c| sheet.value(CellRef::new(r.start.row, c)).display()).collect(); let t = sheet.tables.get_mut(ti).ok_or_else(|| bad("table", "gone"))?; - if r.start.row != t.range.start.row { + if r.start.row != t.range.start.row || !r.intersects(&t.range) { return Err(EngineError::Other( "The headers must remain in the same row, and the resulting table range must overlap the original table range.".into(), )); diff --git a/crates/engine/tests/table_resize_overlap.rs b/crates/engine/tests/table_resize_overlap.rs new file mode 100644 index 0000000..f8442cc --- /dev/null +++ b/crates/engine/tests/table_resize_overlap.rs @@ -0,0 +1,29 @@ +use gridcraft_engine::Session; +use serde_json::json; + +fn table() -> Session { + let mut s = Session::new(); + s.new_workbook(); + s.execute("range.setValues", json!({"range":"A1", "values":[["Item", "Qty"], ["x", "7"]]})).unwrap(); + s.execute("insert.table", json!({"range":"A1:B2", "header":true, "name":"T"})).unwrap(); + s +} + +fn table_range(s: &Session) -> String { + s.doc().unwrap().wb.active().unwrap().tables[0].range.a1() +} + +#[test] +fn resize_to_disjoint_range_is_rejected_and_keeps_table() { + let mut s = table(); + assert!(s.execute("table.resize", json!({"table":"T", "range":"D1:E2"})).is_err()); + assert_eq!(table_range(&s), "A1:B2"); + assert_eq!(s.doc().unwrap().wb.active().unwrap().tables[0].columns[1].name, "Qty"); +} + +#[test] +fn resize_to_overlapping_range_still_works() { + let mut s = table(); + s.execute("table.resize", json!({"table":"T", "range":"B1:C2"})).unwrap(); + assert_eq!(table_range(&s), "B1:C2"); +}