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}