fix intermediate rows cols
This commit is contained in:
committed by
Nicolás Hatcher Andrés
parent
d73b5ff12d
commit
e420f7e998
@@ -172,10 +172,18 @@ pub(crate) fn stringify_reference(
|
|||||||
if sheet_index == *sheet {
|
if sheet_index == *sheet {
|
||||||
if row == *move_row {
|
if row == *move_row {
|
||||||
row += *delta;
|
row += *delta;
|
||||||
} else if (*delta > 0 && row > *move_row && row <= *move_row + *delta)
|
} else if *delta > 0 {
|
||||||
|| (*delta < 0 && row < *move_row && row >= *move_row + *delta)
|
// Moving the row downwards
|
||||||
{
|
if row > *move_row && row <= *move_row + *delta {
|
||||||
row -= *delta;
|
// Intermediate rows move up by one position
|
||||||
|
row -= 1;
|
||||||
|
}
|
||||||
|
} else if *delta < 0 {
|
||||||
|
// Moving the row upwards
|
||||||
|
if row < *move_row && row >= *move_row + *delta {
|
||||||
|
// Intermediate rows move down by one position
|
||||||
|
row += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -187,14 +195,18 @@ pub(crate) fn stringify_reference(
|
|||||||
if sheet_index == *sheet {
|
if sheet_index == *sheet {
|
||||||
if column == *move_column {
|
if column == *move_column {
|
||||||
column += *delta;
|
column += *delta;
|
||||||
} else if (*delta > 0
|
} else if *delta > 0 {
|
||||||
&& column > *move_column
|
// Moving the column to the right
|
||||||
&& column <= *move_column + *delta)
|
if column > *move_column && column <= *move_column + *delta {
|
||||||
|| (*delta < 0
|
// Intermediate columns move left by one position
|
||||||
&& column < *move_column
|
column -= 1;
|
||||||
&& column >= *move_column + *delta)
|
}
|
||||||
{
|
} else if *delta < 0 {
|
||||||
column -= *delta;
|
// Moving the column to the left
|
||||||
|
if column < *move_column && column >= *move_column + *delta {
|
||||||
|
// Intermediate columns move right by one position
|
||||||
|
column += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -734,5 +734,51 @@ fn test_move_row_height() {
|
|||||||
assert_eq!(model.get_row_height(sheet, 3), Ok(original_row4_height));
|
assert_eq!(model.get_row_height(sheet, 3), Ok(original_row4_height));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Moving a row down by two positions should shift formulas on intermediate
|
||||||
|
/// rows by only one (the row that gets skipped), not by the full delta ‒ this
|
||||||
|
/// guards against the regression fixed in the RowMove displacement logic.
|
||||||
|
#[test]
|
||||||
|
fn test_row_move_down_two_updates_intermediate_refs_by_one() {
|
||||||
|
let mut model = new_empty_model();
|
||||||
|
populate_table(&mut model);
|
||||||
|
// Set up formulas to verify intermediate rows shift by 1 (not full delta).
|
||||||
|
model._set("E3", "=G3"); // target row
|
||||||
|
model._set("E4", "=G4"); // intermediate row
|
||||||
|
model._set("E5", "=SUM(G3:J3)");
|
||||||
|
model.evaluate();
|
||||||
|
|
||||||
|
// Move row 3 down by two positions (row 3 -> row 5)
|
||||||
|
assert!(model.move_row_action(0, 3, 2).is_ok());
|
||||||
|
model.evaluate();
|
||||||
|
|
||||||
|
// Assert that references for the moved row and intermediate row are correct.
|
||||||
|
assert_eq!(model._get_formula("E3"), "=G3");
|
||||||
|
assert_eq!(model._get_formula("E5"), "=G5");
|
||||||
|
assert_eq!(model._get_formula("E4"), "=SUM(G5:J5)");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Moving a column right by two positions should shift formulas on
|
||||||
|
/// intermediate columns by only one, ensuring the ColumnMove displacement
|
||||||
|
/// logic handles multi-position moves correctly.
|
||||||
|
#[test]
|
||||||
|
fn test_column_move_right_two_updates_intermediate_refs_by_one() {
|
||||||
|
let mut model = new_empty_model();
|
||||||
|
populate_table(&mut model);
|
||||||
|
// Set up formulas to verify intermediate columns shift by 1 (not full delta).
|
||||||
|
model._set("E3", "=$G3"); // target column
|
||||||
|
model._set("E4", "=$H3"); // intermediate column
|
||||||
|
model._set("E5", "=SUM($G3:$J7)");
|
||||||
|
model.evaluate();
|
||||||
|
|
||||||
|
// Move column G (7) right by two positions (G -> I)
|
||||||
|
assert!(model.move_column_action(0, 7, 2).is_ok());
|
||||||
|
model.evaluate();
|
||||||
|
|
||||||
|
// Assert that references for moved and intermediate columns are correct.
|
||||||
|
assert_eq!(model._get_formula("E3"), "=$I3");
|
||||||
|
assert_eq!(model._get_formula("E4"), "=$G3");
|
||||||
|
assert_eq!(model._get_formula("E5"), "=SUM($I3:$J7)");
|
||||||
|
}
|
||||||
|
|
||||||
// A B C D E F G H I J K L M N O P Q R
|
// A B C D E F G H I J K L M N O P Q R
|
||||||
// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
||||||
|
|||||||
Reference in New Issue
Block a user