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}