#[test]
fn test_non_topological_order_handling() {
let graph = load_onnx("non_topological_order.onnx");
println!("\n=== Non-Topological Order Test ===");
println!("Input ONNX node order (non-topological):");
println!(" 1. Add (uses abs_out)");
println!(" 2. Abs (uses relu_out)");
println!(" 3. Relu (uses input)");
println!("\nCorrect execution order should be: Relu → Abs → Add\n");
let relu_node = graph.nodes.iter().position(|n| n.name().contains("relu"));
let abs_node = graph.nodes.iter().position(|n| n.name().contains("abs"));
let add_node = graph.nodes.iter().position(|n| n.name().contains("add"));
if let (Some(relu_pos), Some(abs_pos), Some(add_pos)) = (relu_node, abs_node, add_node) {
println!("Parsed IR node positions:");
println!(" Relu at position {}", relu_pos);
println!(" Abs at position {}", abs_pos);
println!(" Add at position {}", add_pos);
for (i, node) in graph.nodes.iter().enumerate() {
println!("\nNode {}: '{}'", i, node.name());
println!(" Inputs: {:?}", node.inputs().iter().map(|a| &a.name).collect::<Vec<_>>());
println!(" Outputs: {:?}", node.outputs().iter().map(|a| &a.name).collect::<Vec<_>>());
}
assert_eq!(graph.nodes.len(), 3, "Should have 3 nodes");
assert_eq!(graph.outputs.len(), 1, "Should have 1 output");
println!("\n✓ Parser correctly handled non-topological input order");
println!(" The graph structure is valid for execution");
} else {
panic!("Could not find all expected nodes in parsed graph");
}
}