From a2181a5a485dcab5083baa9b06b6925ad81f7318 Mon Sep 17 00:00:00 2001 From: Brian Hung Date: Wed, 23 Jul 2025 00:00:53 -0700 Subject: [PATCH] fix empty row deletion --- .../user_model/test_batch_row_column_diff.rs | 19 +++++++++++++++++++ base/src/user_model/common.rs | 4 ++++ 2 files changed, 23 insertions(+) diff --git a/base/src/test/user_model/test_batch_row_column_diff.rs b/base/src/test/user_model/test_batch_row_column_diff.rs index 3819ed9..829e6d8 100644 --- a/base/src/test/user_model/test_batch_row_column_diff.rs +++ b/base/src/test/user_model/test_batch_row_column_diff.rs @@ -4,6 +4,7 @@ use bitcode::decode; use crate::{ + constants::{LAST_COLUMN, LAST_ROW}, test::util::new_empty_model, user_model::history::{Diff, QueueDiffs}, UserModel, @@ -225,3 +226,21 @@ fn delete_mixed_empty_and_filled_rows() { assert_eq!(model.get_formatted_cell_value(0, 9, 1).unwrap(), "Row9"); assert_eq!(model.get_formatted_cell_value(0, 10, 1).unwrap(), "After"); } + +#[test] +fn boundary_validation() { + let base = new_empty_model(); + let mut model = UserModel::from_model(base); + + // Test deleting rows beyond valid range + assert!(model.delete_rows(0, LAST_ROW, 2).is_err()); + assert!(model.delete_rows(0, LAST_ROW + 1, 1).is_err()); + + // Test deleting columns beyond valid range + assert!(model.delete_columns(0, LAST_COLUMN, 2).is_err()); + assert!(model.delete_columns(0, LAST_COLUMN + 1, 1).is_err()); + + // Test valid boundary deletions (should work with our empty row fix) + assert!(model.delete_rows(0, LAST_ROW, 1).is_ok()); + assert!(model.delete_columns(0, LAST_COLUMN, 1).is_ok()); +} diff --git a/base/src/user_model/common.rs b/base/src/user_model/common.rs index 629bc6a..e48de70 100644 --- a/base/src/user_model/common.rs +++ b/base/src/user_model/common.rs @@ -924,6 +924,10 @@ impl UserModel { // Collect diffs from bottom to top so that `undo` re-inserts rows // in the correct order (top to bottom). for r in (row..row + row_count).rev() { + if !is_valid_row(r) { + return Err(format!("Row number '{r}' is not valid.")); + } + let mut row_data = None; for rd in &worksheet.rows { if rd.r == r {