crop.rs

5.8 kB · rust · 180 lines

1use demos::crop::crop_collapse;2use mrlyrs::core::error::parse;34fn scales(read: &mrlyrs::core::Json) -> Vec<i64> {5    read["scales"]6        .as_array()7        .unwrap()8        .iter()9        .map(|scale| scale["start"].as_i64().unwrap())10        .collect()11}1213fn profile(read: &mrlyrs::core::Json, scale: usize) -> Vec<f64> {14    read["scales"][scale]["main"]15        .as_array()16        .unwrap()17        .iter()18        .map(|v| v.as_f64().unwrap())19        .collect()20}2122fn ladder(read: &mrlyrs::core::Json, key: &str) -> String {23    let rows = read["pairs"].as_array().unwrap();24    let step: Vec<String> = rows25        .iter()26        .filter(|pair| pair["high"].as_i64().unwrap() == pair["low"].as_i64().unwrap() + 1)27        .map(|pair| match pair[key].as_f64() {28            Some(v) => format!("{v:.6}"),29            None => "none".to_string(),30        })31        .collect();32    step.join(",")33}3435#[test]36fn the_two_scales_the_collapse_panel_lays_on_each_other() {37    let read = |code: &str, dimension: usize, level: usize, centre: &str| {38        parse(&crop_collapse(code, 3, level, 2, dimension, centre, 16).unwrap()).unwrap()39    };40    let carpet = read("7", 2, 6, "corner");41    println!("crop_collapse carpet scales {:?}", scales(&carpet));42    assert_eq!(scales(&carpet), [1, 3, 9, 27, 81, 243]);43    println!(44        "crop_collapse carpet d {:.9} mass {} top {}",45        carpet["d"].as_f64().unwrap(),46        carpet["mass"],47        carpet["top"]48    );49    assert_eq!(50        format!("{:.9}", carpet["d"].as_f64().unwrap()),51        "1.892789261"52    );53    assert_eq!(54        (55            carpet["mass"].as_str().unwrap(),56            carpet["top"].as_i64().unwrap()57        ),58        ("8", 728)59    );60    let deep: Vec<String> = profile(&carpet, 5)[..4]61        .iter()62        .map(|v| format!("{v:.6}"))63        .collect();64    println!("crop_collapse carpet deep {}", deep.join(","));65    assert_eq!(deep.join(","), "0.751038,0.779830,0.803768,0.810867");66    println!("crop_collapse carpet step sup {}", ladder(&carpet, "sup"));67    assert_eq!(68        ladder(&carpet, "sup"),69        "0.353553,0.222183,0.110138,0.042663,0.015114"70    );71    println!(72        "crop_collapse carpet step share {}",73        ladder(&carpet, "share")74    );75    assert_eq!(76        ladder(&carpet, "share"),77        "0.534078,0.305035,0.145250,0.055448,0.019546"78    );79    let shares: Vec<f64> = carpet["pairs"]80        .as_array()81        .unwrap()82        .iter()83        .filter(|pair| pair["high"].as_i64().unwrap() == pair["low"].as_i64().unwrap() + 1)84        .map(|pair| pair["share"].as_f64().unwrap())85        .collect();86    for step in shares.windows(2) {87        assert!(step[1] < step[0], "the gap must shrink with the scale");88    }89    let sponge = read("23", 3, 4, "corner");90    println!("crop_collapse sponge scales {:?}", scales(&sponge));91    assert_eq!(scales(&sponge), [1, 3, 9, 27]);92    println!(93        "crop_collapse sponge step share {}",94        ladder(&sponge, "share")95    );96    assert_eq!(ladder(&sponge, "share"), "0.805610,0.366087,0.229755");97    let hole = read("7", 2, 6, "centre");98    let levels: Vec<String> = hole["scales"]99        .as_array()100        .unwrap()101        .iter()102        .map(|scale| format!("{:.6}", scale["level"].as_f64().unwrap()))103        .collect();104    println!("crop_collapse centre levels {}", levels.join(","));105    assert_eq!(106        levels.join(","),107        "0.000000,0.000000,0.000000,0.000000,0.668835"108    );109    println!("crop_collapse centre step share {}", ladder(&hole, "share"));110    assert_eq!(111        ladder(&hole, "share"),112        "0.000000,0.000000,0.000000,3.081886"113    );114    assert!(crop_collapse("7", 3, 6, 2, 2, "corner", 1).is_err());115    assert!(crop_collapse("7", 1, 6, 2, 2, "corner", 16).is_err());116}117118fn ridges(read: &mrlyrs::core::Json) -> String {119    let rows: Vec<String> = read["scales"]120        .as_array()121        .unwrap()122        .iter()123        .map(|scale| match scale["ridge"].as_f64() {124            Some(v) => format!("{v:.6}"),125            None => "none".to_string(),126        })127        .collect();128    rows.join(",")129}130131fn drift(read: &mrlyrs::core::Json, scale: usize) -> Vec<f64> {132    read["scales"][scale]["drift"]133        .as_array()134        .unwrap()135        .iter()136        .map(|v| v.as_f64().unwrap())137        .collect()138}139140#[test]141fn the_defect_ridge_the_collapse_panel_folds_beside_it() {142    let carpet = parse(&crop_collapse("7", 3, 6, 2, 2, "corner", 16).unwrap()).unwrap();143    println!("crop_collapse carpet ridges {}", ridges(&carpet));144    assert_eq!(145        ridges(&carpet),146        "0.798324,1.688227,0.600112,0.389870,0.445603,none"147    );148    println!(149        "crop_collapse carpet drift 4 len {}",150        drift(&carpet, 4).len()151    );152    let deep: Vec<String> = drift(&carpet, 4)[..4]153        .iter()154        .map(|v| format!("{v:.6}"))155        .collect();156    println!("crop_collapse carpet drift 4 {}", deep.join(","));157    assert_eq!(deep.join(","), "0.593262,0.167396,0.489821,0.131627");158    println!(159        "crop_collapse carpet drift 3 head {:.6}",160        drift(&carpet, 3)[0]161    );162    assert_eq!(format!("{:.6}", drift(&carpet, 3)[0]), "0.000000");163    println!("crop_collapse carpet ridge sup {}", ladder(&carpet, "rsup"));164    assert_eq!(165        ladder(&carpet, "rsup"),166        "2.000000,2.859375,0.789696,0.714173,none"167    );168    println!(169        "crop_collapse carpet ridge share {}",170        ladder(&carpet, "rshare")171    );172    assert_eq!(173        ladder(&carpet, "rshare"),174        "1.184675,1.693714,1.315914,1.602712,none"175    );176    let sponge = parse(&crop_collapse("23", 3, 4, 2, 3, "corner", 16).unwrap()).unwrap();177    println!("crop_collapse sponge ridges {}", ridges(&sponge));178    assert_eq!(ridges(&sponge), "3.868696,3.649261,1.456937,none");179    assert!(sponge["scales"][3]["drift"].as_array().unwrap().is_empty());180}