add up dependant test
This commit is contained in:
1 parent
bb3be32b19
commit
42888f0cbc
1 file changed
+117
@@ -714,3 +714,120 @@ fn up_pass() {
|
|||||||
assert_eq!(tree.get(child2).unwrap(), &1);
|
assert_eq!(tree.get(child2).unwrap(), &1);
|
||||||
assert_eq!(tree.get(grandchild2).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<i32> for AddPass {
|
||||||
|
fn pass<'a>(
|
||||||
|
&self,
|
||||||
|
node: &mut i32,
|
||||||
|
children: &mut dyn Iterator<Item = &'a mut i32>,
|
||||||
|
) -> PassReturn {
|
||||||
|
*node += children.map(|i| *i).sum::<i32>();
|
||||||
|
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<i32> for SubtractPass {
|
||||||
|
fn pass<'a>(
|
||||||
|
&self,
|
||||||
|
node: &mut i32,
|
||||||
|
children: &mut dyn Iterator<Item = &'a mut i32>,
|
||||||
|
) -> PassReturn {
|
||||||
|
*node -= children.map(|i| *i).sum::<i32>();
|
||||||
|
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);
|
||||||
|
}
|
||||||
Reference in new issue
Block a user