radix.rs
3.6 kB · rust · 104 lines
1use mrlycore::json::parse;2use mrlycore::Json;3use mrlydemo::radix::*;45fn preset(name: &str) -> Json {6 let menu = parse(&radix_menu()).unwrap();7 menu["presets"]8 .as_array()9 .unwrap()10 .iter()11 .find(|card| card["name"] == name)12 .unwrap()13 .clone()14}1516fn read(card: &Json, level: usize) -> Json {17 parse(18 &radix_read(19 card["ring"].as_str().unwrap(),20 card["a"].as_i64().unwrap() as i32,21 card["c"].as_i64().unwrap() as i32,22 card["digits"].as_str().unwrap(),23 card["twists"].as_str().unwrap(),24 level,25 )26 .unwrap(),27 )28 .unwrap()29}3031#[test]32fn the_koch_preset_places_sixteen_points_at_level_two() {33 let koch = preset("koch");34 assert_eq!(koch["digits"], "0:0_1:0_2:1_2:0");35 assert_eq!(koch["twists"], "0_1_5_0");36 let read = read(&koch, 2);37 assert_eq!(read["ring"], "eisenstein");38 assert_eq!(read["q"].as_u64().unwrap(), 9);39 assert_eq!(read["size"].as_u64().unwrap(), 4);40 assert_eq!(read["fill"], "16");41 assert_eq!(read["distinct"].as_u64().unwrap(), 16);42 assert_eq!(read["glued"], false);43 assert_eq!(read["canonical"], false);44 assert_eq!(read["cap"].as_u64().unwrap(), 8);45 assert_eq!(46 format!("{:.6}", read["dimension"].as_f64().unwrap()),47 "1.261860"48 );49 let points = radix_points("eisenstein", 3, 0, "0:0_1:0_2:1_2:0", "0_1_5_0", 2).unwrap();50 assert_eq!(points.len(), 32);51 assert_eq!((points[0], points[1]), (0.0, 0.0));52}5354#[test]55fn the_twisted_two_digits_glue_four_words_onto_three_points() {56 let read = parse(&radix_read("gaussian", 2, 0, "0:0_1:0", "0_2", 2).unwrap()).unwrap();57 assert_eq!(read["fill"], "4");58 assert_eq!(read["distinct"].as_u64().unwrap(), 3);59 assert_eq!(read["glued"], true);60 assert_eq!(read["code"], "3");61 assert_eq!(read["canonical"], true);62 let plain = parse(&radix_read("gaussian", 2, 0, "0:0_1:0", "0_0", 2).unwrap()).unwrap();63 assert_eq!(plain["distinct"].as_u64().unwrap(), 4);64 assert_eq!(plain["glued"], false);65}6667#[test]68fn the_carpet_preset_fills_sixty_four_words_at_level_two() {69 let carpet = preset("carpet");70 assert_eq!(carpet["label"], "the carpet, box digits");71 let read = read(&carpet, 2);72 assert_eq!(read["ring"], "gaussian");73 assert_eq!(read["q"].as_u64().unwrap(), 9);74 assert_eq!(read["size"].as_u64().unwrap(), 8);75 assert_eq!(read["fill"], "64");76 assert_eq!(read["distinct"].as_u64().unwrap(), 64);77 assert_eq!(read["canonical"], false);78 assert_eq!(79 format!("{:.6}", read["dimension"].as_f64().unwrap()),80 "1.892789"81 );82 assert_eq!(radix_cap(carpet["digits"].as_str().unwrap()).unwrap(), 5);83}8485#[test]86fn a_level_over_the_cap_and_a_broken_dial_are_refused() {87 assert!(radix_read("gaussian", 3, 0, "0:0", "0", 17).is_err());88 assert!(radix_read("gaussian", 1, 0, "0:0", "0", 1).is_err());89 assert!(radix_read("mrly", 2, 0, "0:0", "0", 1).is_err());90 assert!(radix_read("gaussian", 2, 0, "0:0_1:0", "0", 1).is_err());91 assert!(radix_read("gaussian", 2, 0, "", "", 1).is_err());92 assert!(radix_points("eisenstein", 2, 0, "0:0_1:0", "0_9", 1).is_err());93}9495#[test]96fn a_congruent_digit_pair_is_refused_without_a_panic() {97 let fault = radix_read("eisenstein", 3, 0, "0:0_2:0_-1:0", "0_0_0", 1).unwrap_err();98 assert!(99 format!("{fault:?}").contains("congruent modulo the base"),100 "{fault:?}"101 );102 assert!(radix_points("eisenstein", 3, 0, "0:0_2:0_-1:0", "0_0_0", 1).is_err());103 assert!(radix_read("eisenstein", 3, 0, "0:0_2:0_2:1", "0_0_0", 1).is_ok());104}