use super::Tree; #[derive(Debug, Hash, Eq, PartialEq, Clone, Copy)] enum Def { NoSafetyInvariants, HasSafetyInvariants, } impl super::Def for Def { fn has_safety_invariants(&self) -> bool { self == &Self::HasSafetyInvariants } } mod prune { use super::*; mod should_simplify { use super::*; #[test] fn seq_1() { let layout: Tree = Tree::def(Def::NoSafetyInvariants).then(Tree::from_bits(0x00)); assert_eq!( layout.prune(&|d| matches!(d, Def::HasSafetyInvariants)), Tree::from_bits(0x00) ); } #[test] fn seq_2() { let layout: Tree = Tree::from_bits(0x00) .then(Tree::def(Def::NoSafetyInvariants)) .then(Tree::from_bits(0x01)); assert_eq!( layout.prune(&|d| matches!(d, Def::HasSafetyInvariants)), Tree::from_bits(0x00).then(Tree::from_bits(0x01)) ); } } mod should_reject { use super::*; #[test] fn invisible_def() { let layout: Tree = Tree::def(Def::HasSafetyInvariants); assert_eq!( layout.prune(&|d| matches!(d, Def::HasSafetyInvariants)), Tree::uninhabited() ); } #[test] fn invisible_def_in_seq_len_2() { let layout: Tree = Tree::def(Def::NoSafetyInvariants).then(Tree::def(Def::HasSafetyInvariants)); assert_eq!( layout.prune(&|d| matches!(d, Def::HasSafetyInvariants)), Tree::uninhabited() ); } #[test] fn invisible_def_in_seq_len_3() { let layout: Tree = Tree::def(Def::NoSafetyInvariants) .then(Tree::from_bits(0x00)) .then(Tree::def(Def::HasSafetyInvariants)); assert_eq!( layout.prune(&|d| matches!(d, Def::HasSafetyInvariants)), Tree::uninhabited() ); } } mod should_accept { use super::*; #[test] fn visible_def() { let layout: Tree = Tree::def(Def::NoSafetyInvariants); assert_eq!(layout.prune(&|d| matches!(d, Def::HasSafetyInvariants)), Tree::unit()); } #[test] fn visible_def_in_seq_len_2() { let layout: Tree = Tree::def(Def::NoSafetyInvariants).then(Tree::def(Def::NoSafetyInvariants)); assert_eq!(layout.prune(&|d| matches!(d, Def::HasSafetyInvariants)), Tree::unit()); } #[test] fn visible_def_in_seq_len_3() { let layout: Tree = Tree::def(Def::NoSafetyInvariants) .then(Tree::from_bits(0x00)) .then(Tree::def(Def::NoSafetyInvariants)); assert_eq!( layout.prune(&|d| matches!(d, Def::HasSafetyInvariants)), Tree::from_bits(0x00) ); } } }