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}