From 42888f0cbc05045d2129c16dde48a9b50942d4b4 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Sat, 26 Nov 2022 12:13:37 -0600 Subject: [PATCH] add up dependant test --- packages/native-core/src/passes.rs | 117 +++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/packages/native-core/src/passes.rs b/packages/native-core/src/passes.rs index 99dec696d..a21d6920a 100644 --- a/packages/native-core/src/passes.rs +++ b/packages/native-core/src/passes.rs @@ -714,3 +714,120 @@ fn up_pass() { assert_eq!(tree.get(child2).unwrap(), &1); assert_eq!(tree.get(grandchild2).unwrap(), &1); } + +#[test] +fn dependant_up_pass() { + use crate::tree::{Tree, TreeLike}; + // 0 + let mut tree = Tree::new(0); + let parent = tree.root(); + // 1 + let child1 = tree.create_node(0); + tree.add_child(parent, child1); + // 2 + let grandchild1 = tree.create_node(1); + tree.add_child(child1, grandchild1); + // 3 + let child2 = tree.create_node(0); + tree.add_child(parent, child2); + // 4 + let grandchild2 = tree.create_node(1); + tree.add_child(child2, grandchild2); + + struct AddPass; + impl Pass for AddPass { + fn pass_id(&self) -> PassId { + PassId(0) + } + + fn dependancies(&self) -> &'static [PassId] { + &[PassId(1)] + } + + fn dependants(&self) -> &'static [PassId] { + &[] + } + + fn mask(&self) -> MemberMask { + MemberMask(1) + } + } + impl UpwardPass for AddPass { + fn pass<'a>( + &self, + node: &mut i32, + children: &mut dyn Iterator, + ) -> PassReturn { + *node += children.map(|i| *i).sum::(); + PassReturn { + progress: true, + mark_dirty: true, + } + } + } + + struct SubtractPass; + impl Pass for SubtractPass { + fn pass_id(&self) -> PassId { + PassId(1) + } + + fn dependancies(&self) -> &'static [PassId] { + &[] + } + + fn dependants(&self) -> &'static [PassId] { + &[PassId(0)] + } + + fn mask(&self) -> MemberMask { + MemberMask(1) + } + } + impl UpwardPass for SubtractPass { + fn pass<'a>( + &self, + node: &mut i32, + children: &mut dyn Iterator, + ) -> PassReturn { + *node -= children.map(|i| *i).sum::(); + PassReturn { + progress: true, + mark_dirty: true, + } + } + } + + let passes = vec![ + AnyPass::Upward(Box::new(AddPass)), + AnyPass::Upward(Box::new(SubtractPass)), + ]; + let dirty_nodes: DirtyNodeStates = DirtyNodeStates::default(); + dirty_nodes.insert(PassId(1), grandchild1); + dirty_nodes.insert(PassId(1), grandchild2); + resolve_passes(&mut tree, dirty_nodes, passes); + + // Tree before: + // 0=\ + // 0=\ + // 1 + // 0=\ + // 1 + // Tree after subtract: + // 2=\ + // -1=\ + // 1 + // -1=\ + // 1 + // Tree after add: + // 2=\ + // 0=\ + // 1 + // 0=\ + // 1 + assert_eq!(tree.get(tree.root()).unwrap(), &2); + assert_eq!(tree.get(child1).unwrap(), &0); + assert_eq!(tree.get(grandchild1).unwrap(), &1); + assert_eq!(tree.get(child2).unwrap(), &0); + assert_eq!(tree.get(grandchild2).unwrap(), &1); +}