shell.rs

3.9 kB · rust · 108 lines

1use demos::shell::*;2use mrlyrs::core::error::parse;34#[test]5fn the_shell_exports_answer() {6    let read = parse(&shell_read("7", 3, 2, 100).unwrap()).unwrap();7    assert_eq!(read["depth"], 5);8    assert_eq!(read["side"], 243);9    assert_eq!(read["leaves"], 201);10    assert_eq!(read["orphans"], 0);11    assert_eq!(read["exact"], true);12    let column = |key: &str| {13        read["levels"]14            .as_array()15            .unwrap()16            .iter()17            .map(|row| row[key].to_string())18            .collect::<Vec<String>>()19            .join(",")20    };21    assert_eq!(column("boxes"), "201,67,23,7,3,1");22    assert_eq!(column("want"), column("boxes"));23    assert_eq!(column("live"), "134,48,18,7,3,1");24    assert_eq!(column("three"), "false,true,false,false,false,true");2526    let nodes = shell_nodes("7", 3, 2, 100, None, None).unwrap();27    assert_eq!(nodes.len(), 5 * 302);28    assert_eq!(&nodes[0..5], &[0, 0, 100, 0, 1]);29    assert_eq!(nodes[5 * 301 + 4], 1);30    let leaves = nodes.chunks(5).filter(|node| node[0] == 0).count();31    assert_eq!(leaves, 201);3233    let small = parse(&shell_read("7", 3, 2, 7).unwrap()).unwrap();34    assert_eq!(small["depth"], 2);35    assert_eq!(small["leaves"], 15);36    assert_eq!(small["live"], 10);3738    let art = shell_pixels("7", 3, 2, 100, 3, None, None).unwrap();39    assert_eq!((art.width, art.height), (486, 486));40    assert_eq!(art.rgba.len(), 4 * 486 * 486);4142    assert!(shell_read("7", 3, 2, 0).is_err());43    assert!(shell_read("7", 3, 2, 243).is_err());44    assert!(shell_pixels("7", 3, 2, 100, 6, None, None).is_err());45}4647fn widths(nodes: &[u32]) -> Vec<usize> {48    let mut out = Vec::new();49    for node in nodes.chunks(5) {50        let level = node[0] as usize;51        while out.len() <= level {52            out.push(0);53        }54        out[level] += 1;55    }56    out57}5859#[test]60fn one_branch_of_the_tree_is_the_zoom_the_page_draws() {61    let whole = shell_nodes("7", 3, 2, 242, None, None).unwrap();62    assert_eq!(63        whole,64        shell_nodes("7", 3, 2, 242, Some(5), Some(0)).unwrap()65    );66    let boxes = widths(&whole);67    println!("shell_nodes r=242 boxes {boxes:?}");68    assert_eq!(boxes, [485, 161, 53, 17, 5, 1]);69    let read = parse(&shell_read("7", 3, 2, 242).unwrap()).unwrap();70    let (mut leaves, mut live, mut shapes) = (0usize, 0usize, Vec::new());71    for seat in 0..boxes[4] {72        let branch = shell_nodes("7", 3, 2, 242, Some(4), Some(seat as u32)).unwrap();73        let wide = widths(&branch);74        assert_eq!(wide.len(), 5, "seat={seat}");75        assert_eq!(*wide.last().unwrap(), 1, "seat={seat}");76        for node in branch.chunks(5) {77            let level = node[0] as usize;78            if level + 1 < wide.len() {79                assert!(80                    (node[3] as usize) < wide[level + 1],81                    "seat={seat} j={level}"82                );83            } else {84                assert_eq!(node[3], u32::MAX, "seat={seat}");85            }86        }87        leaves += wide[0];88        live += branch89            .chunks(5)90            .filter(|node| node[0] == 0 && node[4] == 1)91            .count();92        shapes.push(format!("{wide:?}"));93    }94    println!("shell_nodes r=242 branches {}", shapes.join(" "));95    assert_eq!(96        shapes.join(" "),97        "[95, 31, 10, 3, 1] [130, 44, 15, 5, 1] [35, 11, 3, 1, 1] [130, 44, 15, 5, 1] [95, 31, 10, 3, 1]"98    );99    println!("shell_nodes r=242 branch leaves {leaves} live {live}");100    assert_eq!(leaves, 485);101    assert_eq!(live as u64, read["live"].as_u64().unwrap());102    let plain = shell_pixels("7", 3, 2, 242, 4, None, None).unwrap();103    let ringed = shell_pixels("7", 3, 2, 242, 4, Some(4), Some(2)).unwrap();104    assert_ne!(plain.rgba, ringed.rgba);105    assert!(shell_nodes("7", 3, 2, 242, Some(6), None).is_err());106    assert!(shell_nodes("7", 3, 2, 242, Some(4), Some(5)).is_err());107    assert!(shell_pixels("7", 3, 2, 242, 4, Some(4), Some(9)).is_err());108}