Move the original get_draw_order code into the tree_iter module.

This commit is contained in:
Tom Alexander
2026-07-01 19:57:30 -04:00
parent 8c4f0868a4
commit fab5c2c634
19 changed files with 1141 additions and 609 deletions

View File

@@ -0,0 +1,55 @@
use crate::nix_util::running_build::is_transparent_predicate;
use crate::nix_util::running_build::print_dag;
use super::ReverseTreeIter;
use super::get_draw_order;
use super::test_util::BuildInstruction;
use super::test_util::build_activity_tree_from_instructions;
use super::test_util::get_every_possible_addition;
fn compare_single_tree(
instructions: &Vec<BuildInstruction>,
) -> Result<(), Box<dyn std::error::Error>> {
let activity_tree = build_activity_tree_from_instructions(instructions, true)?;
let original_draw_order = get_draw_order(&activity_tree);
let reverse_draw_order = ReverseTreeIter::new(
&activity_tree,
None,
|entry| entry.get_activity().is_active(),
is_transparent_predicate,
|_entry| true,
)
.get_draw_order();
if original_draw_order != reverse_draw_order {
println!("Draw order mismatch!");
println!("Instructions: {:?}", instructions);
println!("Original: {:?}", original_draw_order);
println!("Reverse: {:?}", reverse_draw_order);
print_dag(&activity_tree, original_draw_order);
print_dag(&activity_tree, reverse_draw_order);
return Err("mismatch".into());
}
Ok(())
}
#[test]
#[ignore]
fn reverse_tree_order_draw_order_iterative() -> Result<(), Box<dyn std::error::Error>> {
let mut prev_generation: Vec<Vec<BuildInstruction>> = Vec::new();
let mut current_generation: Vec<Vec<BuildInstruction>> = vec![vec![]];
// Iterate through every possible tree with N nodes.
for _ in 0..7 {
std::mem::swap(&mut prev_generation, &mut current_generation);
for old_state in prev_generation.drain(..) {
for new_state in get_every_possible_addition(&old_state) {
compare_single_tree(&new_state)?;
current_generation.push(new_state);
}
}
}
Ok(())
}