use super::common::get_vertex_ids_in_order;
use crate::engine::{DependencyGraph, Scheduler};
use formualizer_common::LiteralValue;
use formualizer_parse::parser::{ASTNode, ASTNodeType, ReferenceType};
fn ref_ast(row: u32, col: u32) -> ASTNode {
ASTNode {
node_type: ASTNodeType::Reference {
original: format!("R{row}C{col}"),
reference: ReferenceType::cell(None, row, col),
},
source_token: None,
contains_volatile: false,
}
}
#[test]
fn test_schedule_creation_end_to_end() {
let mut graph = DependencyGraph::new();
graph
.set_cell_value("Sheet1", 1, 1, LiteralValue::Int(1))
.unwrap(); graph
.set_cell_value("Sheet1", 1, 2, LiteralValue::Int(1))
.unwrap(); graph
.set_cell_formula("Sheet1", 2, 2, ref_ast(1, 1))
.unwrap(); graph
.set_cell_formula("Sheet1", 2, 3, ref_ast(2, 2))
.unwrap();
let scheduler = Scheduler::new(&graph);
let all_vertex_ids = get_vertex_ids_in_order(&graph);
let schedule = scheduler.create_schedule(&all_vertex_ids).unwrap();
assert!(schedule.cycles.is_empty());
assert_eq!(schedule.layers.len(), 3);
assert_eq!(schedule.layers[0].vertices.len(), 2); assert_eq!(schedule.layers[1].vertices.len(), 1); assert_eq!(schedule.layers[2].vertices.len(), 1); }
#[test]
fn test_cycle_separation_logic() {
let mut graph = DependencyGraph::new();
graph
.set_cell_formula("Sheet1", 1, 1, ref_ast(1, 2))
.unwrap(); graph
.set_cell_formula("Sheet1", 1, 2, ref_ast(1, 1))
.unwrap(); graph
.set_cell_value("Sheet1", 2, 1, LiteralValue::Int(1))
.unwrap(); graph
.set_cell_formula("Sheet1", 2, 2, ref_ast(2, 1))
.unwrap();
let scheduler = Scheduler::new(&graph);
let all_vertex_ids = get_vertex_ids_in_order(&graph);
let schedule = scheduler.create_schedule(&all_vertex_ids).unwrap();
assert_eq!(schedule.cycles.len(), 1);
assert_eq!(schedule.cycles[0].len(), 2);
assert_eq!(schedule.layers.len(), 2);
assert_eq!(schedule.layers[0].vertices.len(), 1); assert_eq!(schedule.layers[1].vertices.len(), 1); }
#[test]
fn test_scheduling_with_external_dependencies() {
let mut graph = DependencyGraph::new();
graph
.set_cell_value("Sheet1", 1, 1, LiteralValue::Int(1))
.unwrap(); graph
.set_cell_formula("Sheet1", 1, 2, ref_ast(1, 1))
.unwrap();
let all_vertex_ids = get_vertex_ids_in_order(&graph);
let b1_id = all_vertex_ids[1]; let dirty_vertices = vec![b1_id];
let scheduler = Scheduler::new(&graph);
let schedule = scheduler.create_schedule(&dirty_vertices).unwrap();
assert!(schedule.cycles.is_empty());
assert_eq!(schedule.layers.len(), 1);
assert_eq!(schedule.layers[0].vertices.len(), 1);
assert_eq!(schedule.layers[0].vertices[0], b1_id);
}