use crate::engine::EvalConfig;
use crate::engine::eval::Engine;
use crate::test_workbook::TestWorkbook;
use formualizer_parse::LiteralValue;
use formualizer_parse::parser::parse;
#[test]
fn spill_commit_is_atomic_under_fault() {
let wb = TestWorkbook::new();
let mut engine = Engine::new(wb, EvalConfig::default());
engine
.set_cell_formula("Sheet1", 1, 1, parse("={1,2;3,4}").unwrap())
.unwrap();
let _ = engine.evaluate_all().unwrap();
let anchor_vertex = engine
.graph
.get_vertex_id_for_address(&engine.graph.make_cell_ref("Sheet1", 1, 1))
.copied()
.expect("anchor vertex");
let rows = vec![
vec![
LiteralValue::Number(7.0),
LiteralValue::Number(8.0),
LiteralValue::Number(9.0),
],
vec![
LiteralValue::Number(10.0),
LiteralValue::Number(11.0),
LiteralValue::Number(12.0),
],
];
let mut targets = Vec::new();
for r in 0..rows.len() as u32 {
for c in 0..rows[0].len() as u32 {
targets.push(engine.graph.make_cell_ref("Sheet1", 1 + r, 1 + c));
}
}
engine
.graph
.plan_spill_region(anchor_vertex, &targets)
.unwrap();
let res = engine.graph.commit_spill_region_atomic_with_fault(
anchor_vertex,
targets.clone(),
rows.clone(),
Some(2),
);
assert!(res.is_err());
assert_eq!(
engine.get_cell_value("Sheet1", 1, 1),
Some(LiteralValue::Number(1.0))
);
assert_eq!(
engine.get_cell_value("Sheet1", 1, 2),
Some(LiteralValue::Number(2.0))
);
assert_eq!(
engine.get_cell_value("Sheet1", 2, 1),
Some(LiteralValue::Number(3.0))
);
assert_eq!(
engine.get_cell_value("Sheet1", 2, 2),
Some(LiteralValue::Number(4.0))
);
}
#[test]
fn spill_resize_shrink_is_atomic() {
let wb = TestWorkbook::new();
let mut engine = Engine::new(wb, EvalConfig::default());
engine
.set_cell_formula("Sheet1", 1, 1, parse("={1,2;3,4}").unwrap())
.unwrap();
let _ = engine.evaluate_all().unwrap();
engine
.set_cell_formula("Sheet1", 1, 1, parse("={9}").unwrap())
.unwrap();
let _ = engine.evaluate_all().unwrap();
assert_eq!(
engine.get_cell_value("Sheet1", 1, 1),
Some(LiteralValue::Number(9.0))
);
assert_eq!(engine.get_cell_value("Sheet1", 1, 2), None);
assert_eq!(engine.get_cell_value("Sheet1", 2, 1), None);
assert_eq!(engine.get_cell_value("Sheet1", 2, 2), None);
}
#[test]
fn spill_resize_shrink_with_fault_rolls_back() {
let wb = TestWorkbook::new();
let mut engine = Engine::new(wb, EvalConfig::default());
engine
.set_cell_formula("Sheet1", 1, 1, parse("={1,2;3,4}").unwrap())
.unwrap();
let _ = engine.evaluate_all().unwrap();
let anchor_vertex = engine
.graph
.get_vertex_id_for_address(&engine.graph.make_cell_ref("Sheet1", 1, 1))
.copied()
.expect("anchor vertex");
let rows = vec![vec![LiteralValue::Number(9.0)]];
let targets = vec![engine.graph.make_cell_ref("Sheet1", 1, 1)];
engine
.graph
.plan_spill_region(anchor_vertex, &targets)
.unwrap();
let res =
engine
.graph
.commit_spill_region_atomic_with_fault(anchor_vertex, targets, rows, Some(0));
assert!(res.is_err());
assert_eq!(
engine.get_cell_value("Sheet1", 1, 1),
Some(LiteralValue::Number(1.0))
);
assert_eq!(
engine.get_cell_value("Sheet1", 1, 2),
Some(LiteralValue::Number(2.0))
);
assert_eq!(
engine.get_cell_value("Sheet1", 2, 1),
Some(LiteralValue::Number(3.0))
);
assert_eq!(
engine.get_cell_value("Sheet1", 2, 2),
Some(LiteralValue::Number(4.0))
);
}
#[test]
fn spill_resize_grow_is_atomic() {
let wb = TestWorkbook::new();
let mut engine = Engine::new(wb, EvalConfig::default());
engine
.set_cell_formula("Sheet1", 1, 1, parse("={1,2;3,4}").unwrap())
.unwrap();
let _ = engine.evaluate_all().unwrap();
engine
.set_cell_formula("Sheet1", 1, 1, parse("={10,20,30;40,50,60}").unwrap())
.unwrap();
let _ = engine.evaluate_all().unwrap();
assert_eq!(
engine.get_cell_value("Sheet1", 1, 1),
Some(LiteralValue::Number(10.0))
);
assert_eq!(
engine.get_cell_value("Sheet1", 1, 2),
Some(LiteralValue::Number(20.0))
);
assert_eq!(
engine.get_cell_value("Sheet1", 1, 3),
Some(LiteralValue::Number(30.0))
);
assert_eq!(
engine.get_cell_value("Sheet1", 2, 1),
Some(LiteralValue::Number(40.0))
);
assert_eq!(
engine.get_cell_value("Sheet1", 2, 2),
Some(LiteralValue::Number(50.0))
);
assert_eq!(
engine.get_cell_value("Sheet1", 2, 3),
Some(LiteralValue::Number(60.0))
);
}