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}