fix deleting empty row

This commit is contained in:
Brian Hung
2025-07-22 19:01:45 -07:00
committed by Nicolás Hatcher Andrés
parent fe87dc49b4
commit b07603b728
2 changed files with 74 additions and 2 deletions

View File

@@ -64,7 +64,7 @@ fn undo_redo_after_batch_delete() {
model.set_user_input(0, 20, 1, "A").unwrap();
model.set_user_input(0, 1, 20, "B").unwrap();
// Fill the rows we are about to delete so the diff list can be produced
// Fill some of the rows we are about to delete for testing
for r in 10..15 {
model.set_user_input(0, r, 1, "tmp").unwrap();
}
@@ -153,3 +153,75 @@ fn edge_case_single_operation() {
let list = last_diff_list(&mut model);
assert_eq!(list.len(), 1);
}
#[test]
fn delete_empty_rows() {
let base = new_empty_model();
let mut model = UserModel::from_model(base);
// Set data in rows 1 and 10, leaving rows 5-8 empty
model.set_user_input(0, 1, 1, "Before").unwrap();
model.set_user_input(0, 10, 1, "After").unwrap();
// Delete empty rows 5-8
assert!(model.delete_rows(0, 5, 4).is_ok());
// Verify shift
assert_eq!(model.get_formatted_cell_value(0, 1, 1).unwrap(), "Before");
assert_eq!(model.get_formatted_cell_value(0, 6, 1).unwrap(), "After");
// Verify diffs are in reverse order with empty data
let list = last_diff_list(&mut model);
assert_eq!(list.len(), 4);
let mut expected_row = 8;
for diff in &list {
match diff {
Diff::DeleteRow { row, old_data, .. } => {
assert_eq!(*row, expected_row);
assert!(old_data.data.is_empty());
expected_row -= 1;
}
_ => panic!("Unexpected diff variant"),
}
}
// Undo/redo
model.undo().unwrap();
assert_eq!(model.get_formatted_cell_value(0, 10, 1).unwrap(), "After");
model.redo().unwrap();
assert_eq!(model.get_formatted_cell_value(0, 6, 1).unwrap(), "After");
}
#[test]
fn delete_mixed_empty_and_filled_rows() {
let base = new_empty_model();
let mut model = UserModel::from_model(base);
// Alternating filled and empty rows
model.set_user_input(0, 5, 1, "Row5").unwrap();
model.set_user_input(0, 7, 1, "Row7").unwrap();
model.set_user_input(0, 9, 1, "Row9").unwrap();
model.set_user_input(0, 10, 1, "After").unwrap();
assert!(model.delete_rows(0, 5, 5).is_ok());
assert_eq!(model.get_formatted_cell_value(0, 5, 1).unwrap(), "After");
// Verify mix of empty and filled row diffs
let list = last_diff_list(&mut model);
assert_eq!(list.len(), 5);
let filled_count = list
.iter()
.filter(|diff| match diff {
Diff::DeleteRow { old_data, .. } => !old_data.data.is_empty(),
_ => false,
})
.count();
assert_eq!(filled_count, 3);
// Undo
model.undo().unwrap();
assert_eq!(model.get_formatted_cell_value(0, 5, 1).unwrap(), "Row5");
assert_eq!(model.get_formatted_cell_value(0, 7, 1).unwrap(), "Row7");
assert_eq!(model.get_formatted_cell_value(0, 9, 1).unwrap(), "Row9");
assert_eq!(model.get_formatted_cell_value(0, 10, 1).unwrap(), "After");
}