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