use super::common::{abs_cell_ref, get_vertex_ids_in_order};
use crate::engine::VertexKind;
use formualizer_common::LiteralValue;
#[test]
fn test_vertex_creation_and_lookup() {
let mut graph = super::common::graph_truth_graph();
let summary = graph
.set_cell_value("Sheet1", 1, 1, LiteralValue::Int(42))
.unwrap();
assert!(summary.affected_vertices.is_empty());
assert!(summary.created_placeholders.is_empty());
let summary2 = graph
.set_cell_value("Sheet1", 1, 1, LiteralValue::Number(std::f64::consts::PI))
.unwrap();
assert!(summary2.affected_vertices.is_empty());
assert!(summary2.created_placeholders.is_empty());
assert_eq!(graph.vertex_len(), 0);
assert!(graph.cell_to_vertex().get(&abs_cell_ref(0, 1, 1)).is_none());
}
#[test]
fn test_cell_address_mapping() {
let mut graph = super::common::graph_truth_graph();
let addr1 = abs_cell_ref(0, 1, 1);
let addr2 = abs_cell_ref(0, 2, 2);
let addr3 = abs_cell_ref(1, 1, 1);
for (sheet, row, col, v) in [
("Sheet1", 1, 1, 1),
("Sheet1", 2, 2, 2),
("Sheet2", 1, 1, 3),
] {
graph
.set_cell_formula(
sheet,
row,
col,
super::common::literal_ast(LiteralValue::Int(v)),
)
.unwrap();
}
graph
.set_cell_value("Sheet2", 5, 5, LiteralValue::Int(4))
.unwrap();
let cell_mappings = graph.cell_to_vertex();
assert_eq!(cell_mappings.len(), 3);
assert!(cell_mappings.contains_key(&addr1));
assert!(cell_mappings.contains_key(&addr2));
assert!(cell_mappings.contains_key(&addr3));
let id1 = cell_mappings[&addr1];
let id2 = cell_mappings[&addr2];
let id3 = cell_mappings[&addr3];
assert_ne!(id1, id2);
assert_ne!(id1, id3);
assert_ne!(id2, id3);
}
#[test]
fn test_vertex_kind_transitions() {
let mut graph = super::common::graph_truth_graph();
graph
.set_cell_value("Sheet1", 1, 1, LiteralValue::Int(42))
.unwrap();
assert_eq!(graph.get_cell_value("Sheet1", 1, 1), None);
assert_eq!(graph.vertex_len(), 0);
let ast = super::common::literal_ast(LiteralValue::Int(100));
let summary = graph.set_cell_formula("Sheet1", 1, 1, ast.clone()).unwrap();
assert_eq!(summary.created_placeholders, vec![abs_cell_ref(0, 1, 1)]);
assert_eq!(graph.get_cell_value("Sheet1", 1, 1), None);
let vertex_ids = get_vertex_ids_in_order(&graph);
assert_eq!(vertex_ids.len(), 1);
let id = vertex_ids[0];
assert!(graph.is_dirty(id));
assert!(!graph.is_volatile(id));
assert_eq!(graph.get_vertex_kind(id), VertexKind::FormulaScalar);
graph
.set_cell_value("Sheet1", 1, 1, LiteralValue::Text("hello".to_string()))
.unwrap();
assert_eq!(graph.get_cell_value("Sheet1", 1, 1), None);
assert!(graph.cell_to_vertex().get(&abs_cell_ref(0, 1, 1)).is_none());
assert!(get_vertex_ids_in_order(&graph).is_empty());
graph.set_cell_formula("Sheet1", 1, 1, ast).unwrap();
assert_eq!(
graph.cell_to_vertex().get(&abs_cell_ref(0, 1, 1)).copied(),
Some(id)
);
}
#[test]
fn test_placeholder_creation() {
let mut graph = super::common::graph_truth_graph();
let ast = create_cell_ref_ast(None, 1, 2, "B1"); let summary = graph.set_cell_formula("Sheet1", 1, 1, ast).unwrap();
let vertex_ids = get_vertex_ids_in_order(&graph);
assert_eq!(vertex_ids.len(), 1);
let a1_addr = abs_cell_ref(0, 1, 1);
let b1_addr = abs_cell_ref(0, 1, 2);
assert_eq!(summary.created_placeholders, vec![a1_addr]);
assert!(graph.cell_to_vertex().get(&b1_addr).is_none());
assert_eq!(graph.baseline_stats().graph_edge_count, 1);
let a1_id = *graph.cell_to_vertex().get(&a1_addr).unwrap();
assert!(matches!(
graph.get_vertex_kind(a1_id),
VertexKind::FormulaScalar
));
}
#[test]
fn test_default_sheet_handling() {
let mut graph = super::common::graph_truth_graph();
assert_eq!(graph.default_sheet_name(), "Sheet1");
graph.set_default_sheet_by_name("MyCustomSheet");
assert_eq!(graph.default_sheet_name(), "MyCustomSheet");
}
fn create_cell_ref_ast(
sheet: Option<&str>,
row: u32,
col: u32,
original: &str,
) -> formualizer_parse::parser::ASTNode {
formualizer_parse::parser::ASTNode {
node_type: formualizer_parse::parser::ASTNodeType::Reference {
original: original.to_string(),
reference: formualizer_parse::parser::ReferenceType::cell(
sheet.map(|s| s.to_string()),
row,
col,
),
},
source_token: None,
contains_volatile: false,
}
}