star.rs
6.0 kB · rust · 171 lines
1use mrlycore::json::parse;2use mrlydemo::star::*;3use mrlymath::six::star::{arm_law, width_law, Star};45fn read(layers: usize, half: usize) -> mrlycore::Json {6 parse(&star_decay("23", layers, half).unwrap()).unwrap()7}89fn shown(value: &mrlycore::Json, places: usize) -> String {10 format!("{:.*}", places, value.as_f64().unwrap())11}1213#[test]14fn the_arm_ink_is_the_closed_form_cell_for_cell() {15 let table = parse(&star_layers("23", 8, 0).unwrap()).unwrap();16 assert_eq!(table["exact"], 8);17 let fractions: Vec<String> = (0..8)18 .map(|at| {19 let row = &table["rows"][at];20 format!("{}/{}", row["numer"], row["denom"])21 })22 .collect();23 assert_eq!(fractions.join(" "), "1/1 1/3 2/5 4/7 5/9 5/11 6/13 8/15");24 let chi: Vec<String> = (0..8)25 .map(|at| table["rows"][at]["chi"].to_string())26 .collect();27 assert_eq!(chi.join(","), "1,-1,-1,1,1,-1,-1,1");28 let star = Star::new(23).unwrap();29 for at in 0..8 {30 let number = 2 * at + 1;31 assert_eq!(star.arm(number, 0).unwrap(), arm_law(number).unwrap());32 }33}3435#[test]36fn the_background_is_the_hexagons_own_ink() {37 let table = parse(&star_layers("23", 4, 0).unwrap()).unwrap();38 let hexes: Vec<String> = (0..4)39 .map(|at| shown(&table["rows"][at]["hex"], 6))40 .collect();41 assert_eq!(hexes.join(" "), "1.000000 0.777778 0.480000 0.693878");42 assert_eq!(shown(&table["rows"][1]["excess"], 6), "-0.444444");43 let wide = parse(&star_layers("23", 4, 2).unwrap()).unwrap();44 assert_eq!(wide["exact"], 0);45 let banded: Vec<String> = (0..4)46 .map(|at| {47 let row = &wide["rows"][at];48 format!("{}/{}", row["numer"], row["denom"])49 })50 .collect();51 assert_eq!(banded.join(" "), "1/1 5/9 4/15 16/21");52}5354#[test]55fn the_cell_frame_decay_settles_on_minus_a_quarter() {56 let deep = read(100, 0);57 assert_eq!(shown(&deep["scaled"], 6), "-1.445065");58 assert_eq!(shown(&deep["logged"], 10), "-0.2937725615");59 assert_eq!(shown(&deep["residual"], 8), "-0.11975831");60 assert_eq!(shown(&deep["slope"], 6), "-0.250092");61 assert_eq!(deep["rows"][0]["slope"], mrlycore::Json::Null);62 assert_eq!(shown(&deep["constant"], 10), "-0.2937605857");63 assert_eq!(deep["branch"], "0 mod 4");64 assert_eq!(shown(&deep["predicted"], 8), "-0.11979167");65 assert_eq!(shown(&deep["target"], 8), "-0.25000000");66 assert_eq!(deep["arm"], true);67 assert_eq!(deep["deepest"], 199);6869 let shallow = read(28, 0);70 assert_eq!(shown(&shallow["scaled"], 6), "-1.126964");71 assert_eq!(shown(&shallow["logged"], 10), "-0.2939128437");72 assert_eq!(shown(&shallow["residual"], 8), "-0.11937029");73 assert_eq!(shallow["rows"].as_array().unwrap().len(), 2);74 assert_eq!(shallow["rows"][1]["layers"], 28);75 assert_eq!(shallow["rows"][0]["layers"], 14);76 let ladder = read(128, 0);77 let rungs: Vec<String> = ladder["rows"]78 .as_array()79 .unwrap()80 .iter()81 .map(|row| row["layers"].to_string())82 .collect();83 assert_eq!(rungs.join(","), "4,8,16,32,64,128");84 assert_eq!(shown(&ladder["slope"], 6), "-0.249968");85 let walk = ladder["walk"].as_array().unwrap();86 assert_eq!(walk.len(), 63);87 assert_eq!(walk[0][0], 4);88 assert_eq!(walk[62][0], 128);89 assert_eq!(shown(&walk[62][1], 6), "-1.506775");90}9192#[test]93fn the_square_term_reads_the_layer_count_mod_four() {94 let two = read(102, 0);95 assert_eq!(two["branch"], "2 mod 4");96 assert_eq!(shown(&two["predicted"], 8), "0.13020833");97 assert_eq!(shown(&two["residual"], 8), "0.13017437");98 assert_eq!(two["slope"], mrlycore::Json::Null);99 let odd = read(101, 0);100 assert_eq!(odd["branch"], "odd");101 assert_eq!(odd["slope"], mrlycore::Json::Null);102 assert_eq!(odd["predicted"], mrlycore::Json::Null);103 assert_eq!(shown(&odd["linear"], 6), "0.249724");104 assert_eq!(shown(&odd["branchConstant"], 10), "-0.1687605857");105}106107#[test]108fn a_wider_band_walks_the_coefficient_off() {109 let wide = read(200, 2);110 assert_eq!(shown(&wide["slope"], 6), "-0.166654");111 assert_eq!(shown(&wide["target"], 8), "-0.16666667");112 assert_eq!(wide["arm"], false);113 let odds: Vec<String> = [1usize, 3, 5, 7]114 .iter()115 .map(|half| format!("{:.6}", width_law(*half)))116 .collect();117 assert_eq!(odds.join(" "), "-0.250000 -0.166667 -0.100000 -0.107143");118 let family: Vec<String> = [0usize, 2, 4, 6, 8, 10, 12]119 .iter()120 .map(|half| format!("{:.6}", width_law(*half)))121 .collect();122 assert_eq!(123 family.join(" "),124 "-0.250000 -0.166667 -0.100000 -0.107143 -0.138889 -0.136364 -0.115385"125 );126}127128#[test]129fn the_stack_and_its_band_share_one_raster() {130 let field = star_field("23", 28, 64).unwrap();131 assert_eq!(field.len(), 4096);132 let inside: Vec<f64> = field133 .iter()134 .filter(|value| !value.is_nan())135 .map(|value| f64::from(*value))136 .collect();137 assert_eq!(inside.len(), 2746);138 assert_eq!(139 format!("{:.6}", inside.iter().sum::<f64>() / inside.len() as f64),140 "0.527208"141 );142 assert_eq!(format!("{}", field[32 * 64 + 32]), "0.5");143144 let arm = star_band("23", 28, 64, 0).unwrap();145 let tally = |grid: &mrlydemo::Grid, kind: u8| grid.types.iter().filter(|t| **t == kind).count();146 assert_eq!(147 format!("{},{},{}", tally(&arm, 0), tally(&arm, 1), tally(&arm, 2)),148 "34,2712,1350"149 );150 let wide = star_band("23", 28, 64, 4).unwrap();151 assert_eq!(152 format!(153 "{},{},{}",154 tally(&wide, 0),155 tally(&wide, 1),156 tally(&wide, 2)157 ),158 "257,2489,1350"159 );160 assert_eq!(format!("{}x{}", arm.width, arm.height), "64x64");161}162163#[test]164fn the_caps_and_the_odd_layers_are_held() {165 assert!(star_field("23", 1, 64).is_err());166 assert!(star_field("23", 200, 64).is_err());167 assert!(star_field("23", 28, 512).is_err());168 assert!(star_decay("23", 801, 0).is_err());169 assert!(star_layers("23", 8, 65).is_err());170 assert!(star_layers("512", 8, 0).is_err());171}