atoms.rs

2.8 kB · rust · 83 lines

1mod tests {2    use mrlycore::atoms::*;3    use mrlycore::tensor::Tensor;4    use mrlymath::bang::factory::{corners_to_code, create, residue_corners};5    use mrlymath::bang::universe::Code;6    type Atom = fn(usize) -> Tensor;7    fn rule_code_2d(rule: impl Fn(usize, usize) -> bool) -> Code {8        let filled: Vec<Vec<u8>> = residue_corners(2, 2)9            .into_iter()10            .filter(|c| rule(c[0] as usize, c[1] as usize))11            .collect();12        corners_to_code(&filled, 2, 2)13    }14    fn rule_code_3d(rule: impl Fn(usize, usize, usize) -> bool) -> Code {15        let filled: Vec<Vec<u8>> = residue_corners(3, 2)16            .into_iter()17            .filter(|c| rule(c[0] as usize, c[1] as usize, c[2] as usize))18            .collect();19        corners_to_code(&filled, 3, 2)20    }21    #[test]22    fn atoms_2d_match_factory() {23        let pairs: Vec<(Atom, Code)> = vec![24            (carpet_2d, rule_code_2d(|x, y| x + y <= 1)),25            (net_2d, rule_code_2d(|x, y| x + y >= 1)),26            (htree_2d, rule_code_2d(|x, _| x == 0)),27            (vtree_2d, rule_code_2d(|_, y| y == 0)),28            (void_2d, rule_code_2d(|x, y| (x + y) % 2 == 0)),29        ];30        for (atom, code) in pairs {31            for n in 1..8 {32                assert_eq!(atom(n), create(code, n, 2, 2, 1).unwrap());33            }34        }35    }36    #[test]37    fn atoms_3d_match_factory() {38        let pairs: Vec<(Atom, Code)> = vec![39            (carpet_3d, rule_code_3d(|x, y, z| x + y + z <= 1)),40            (net_3d, rule_code_3d(|x, y, z| x + y + z >= 2)),41            (xtree_3d, rule_code_3d(|_, y, z| y == 0 && z == 0)),42            (ytree_3d, rule_code_3d(|x, _, z| x == 0 && z == 0)),43            (ztree_3d, rule_code_3d(|x, y, _| x == 0 && y == 0)),44            (void_3d, rule_code_3d(|x, y, z| x == y && y == z)),45        ];46        for (atom, code) in pairs {47            for n in 1..6 {48                assert_eq!(atom(n), create(code, n, 3, 2, 1).unwrap());49            }50        }51    }52    #[test]53    fn net_complements() {54        let full: Code = 15;55        assert_eq!(56            rule_code_2d(|x, y| x + y >= 1),57            full ^ rule_code_2d(|x, y| x + y == 0)58        );59        let full3: Code = 255;60        assert_eq!(61            rule_code_3d(|x, y, z| x + y + z >= 2),62            full3 ^ rule_code_3d(|x, y, z| x + y + z <= 1)63        );64    }65    #[test]66    fn carpet_3d_is_menger() {67        assert_eq!(rule_code_3d(|x, y, z| x + y + z <= 1), 23);68        assert_eq!(carpet_3d(3).sum(), 20);69    }70    #[test]71    fn trees_are_rotations() {72        for n in 1..6 {73            let h = htree_2d(n);74            let v = vtree_2d(n);75            assert_eq!(h.sum(), v.sum());76            for x in 0..n {77                for y in 0..n {78                    assert_eq!(h.get(&[x, y]), v.get(&[y, x]));79                }80            }81        }82    }83}