sumset.rs

2.7 kB · rust · 82 lines

1use demos::sumset::*;2use mrlyrs::core::error::parse;3use mrlyrs::core::Json;45fn read(level: u32, x: u32) -> Json {6    parse(&sumset_read(level, x).unwrap()).unwrap()7}89fn six(v: f64) -> u64 {10    (v * 1e6).floor() as u6411}1213#[test]14fn the_read_counts_s_at_the_powers_of_three() {15    let rows: Vec<Json> = (4..=10).map(|k| read(10, 3u32.pow(k))).collect();16    let counts: Vec<u64> = rows.iter().map(|r| r["count"].as_u64().unwrap()).collect();17    let densities: Vec<u64> = rows18        .iter()19        .map(|r| six(r["density"].as_f64().unwrap()))20        .collect();21    assert_eq!(counts, [79, 203, 626, 1941, 5963, 17025, 45968]);22    assert_eq!(23        densities,24        [975308, 835390, 858710, 887517, 908855, 864959, 778472]25    );26}2728#[test]29fn the_deepest_dip_sits_just_below_three_to_the_fifteen() {30    let dip = read(16, 14348906);31    assert_eq!(dip["count"].as_u64(), Some(10953840));32    assert_eq!(six(dip["density"].as_f64().unwrap()), 763391);33    assert_eq!(dip["member"].as_bool(), Some(false));34    let envelope = sumset_envelope(16, 720).unwrap();35    let low = envelope36        .iter()37        .filter(|v| !v.is_nan())38        .fold(f32::INFINITY, |a, &b| a.min(b));39    let high = envelope40        .iter()41        .filter(|v| !v.is_nan())42        .fold(0f32, |a, &b| a.max(b));43    assert_eq!((format!("{low:.5}"), high), ("0.76339".to_string(), 1.0));44}4546#[test]47fn the_strip_goes_dark_on_a367090() {48    let strip = sumset_strip(6, 0, 250, 250).unwrap();49    let dark: Vec<usize> = (0..250).filter(|&i| strip[i] == 0.0).collect();50    assert_eq!(dark.len(), 40);51    assert_eq!(dark[..6], [62, 63, 143, 144, 207, 208]);52}5354#[test]55fn the_pairs_carry_the_census_readings() {56    let rows = parse(&sumset_pairs(16).unwrap()).unwrap();57    let rows = rows.as_array().unwrap();58    let flag = |key: &str| {59        rows.iter()60            .filter(|r| r[key].as_bool() == Some(true))61            .count()62    };63    assert_eq!((rows.len(), flag("clean"), flag("copy")), (17, 6, 5));64    let up: Vec<u64> = rows[..4]65        .iter()66        .map(|r| (r["ratio"].as_f64().unwrap() * 1e6).ceil() as u64)67        .collect();68    assert_eq!(up, [1467705, 1638125, 1664808, 1724517]);69    let centre = rows70        .iter()71        .find(|r| r["three"] == 15 && r["four"] == 12)72        .unwrap();73    assert_eq!(centre["gap"].to_string(), "[12766859,14348906]");74    assert_eq!(centre["energy"].as_str(), Some("2737906338"));75}7677#[test]78fn the_height_and_the_cursor_are_refused_outside_their_range() {79    assert!(sumset_read(17, 1).is_err() && sumset_read(5, 1).is_err());80    assert!(sumset_read(8, 0).is_err() && sumset_read(8, 6562).is_err());81    assert!(sumset_strip(8, 10, 12, 3).is_err() && sumset_envelope(8, 0).is_err());82}