anybox-rs 0.10.0

one API for the most popular passthrough boxes
Documentation
use super::{YscFrames, drain, key, wire};
use crate::transport::codec::Incoming;

#[test]
fn every_literal_example_in_the_shipped_docs_is_split_without_becoming_input() {
    let examples = [
        r#"{"cmd":30,"x":100,"y":50,"c":1,"rx":1.0,"ry":1.0,"rc":0}"#,
        r#"{"cmd":31,"x":100,"y":50,"c":1,"rx":1.0,"ry":1.0,"rc":0}"#,
        r#"{"cmd":32,"b":1,"c":10}"#,
        r#"{"cmd":33,"b":1,"s":1}"#,
        r#"{"cmd":34,"status":1}"#,
        r#"{"cmd":35,"w":-1,"c":100}"#,
        r#"{"cmd":36,"s":0,"e":1,"t":3,"p":1,"w":-1,"i":30,"d":10,"ij":5,"dj":2}"#,
        r#"{"cmd":37,"s":-1}"#,
        r#"{"cmd":38}"#,
        r#"{"cmd":39,"e":1,"t":1,"ax":10,"fx":0,"py":5,"fy":0}"#,
        r#"{"cmd":40}"#,
        r#"{"cmd":41}"#,
        r#"{"cmd":42,"e":1,"p":2,"n":4,"d":0,"j":15}"#,
        r#"{"cmd":43}"#,
        r#"{"cmd":44}"#,
        r#"{"cmd":50}"#,
        r#"{"cmd":132}"#,
        r#"{"cmd":133,"baud":3000000}"#,
        r#"{"cmd":34,"status":0}"#,
        r#"{"cmd":35,"w":-1,"c":200}"#,
        r#"{"cmd":35,"w":1,"c":100}"#,
        r#"{"cmd":36,"s":0,"e":1,"t":3,"p":1,"w":-1,"i":30,"d":10}"#,
        r#"{"cmd":36,"s":0,"e":1,"t":3,"p":1,"w":-1}"#,
        r#"{"cmd":36,"s":2,"e":1,"t":16,"p":0,"w":-1}"#,
        r#"{"cmd":36,"s":2,"e":1,"t":16,"p":0,"w":-1,"i":30,"d":10}"#,
        r#"{"cmd":36,"s":0,"e":0,"t":3,"p":1,"w":-1}"#,
        r#"{"cmd":37,"s":0}"#,
        r#"{"cmd":45,"kc":4,"down":1}"#,
        r#"{"cmd":45,"kc":4,"down":0}"#,
        r#"{"cmd":45,"kc":225,"down":1}"#,
        r#"{"cmd":45,"kc":225,"down":0}"#,
        r#"{"cmd":46}"#,
        r#"{"cmd":47,"s":"Wasd123A123vciseC"}"#,
        r#"{"cmd":47,"s":"Hello World!"}"#,
        r#"{"cmd":47,"s":"test@123"}"#,
        r#"{"cmd":47,"s":"!@#$%^&*()"}"#,
        r#"{"cmd":47,"s":""}"#,
        r#"{"cmd":48}"#,
        r#"km.move(100,50)"#,
        r#"km.left(1)"#,
        r#"km.left(0)"#,
        r#"km.left(2)"#,
        r#"km.right(1)"#,
        r#"km.right(0)"#,
        r#"km.right(2)"#,
        r#"km.middle(1)"#,
        r#"km.middle(0)"#,
        r#"km.middle(2)"#,
        r#"km.ms1(1)"#,
        r#"km.ms1(0)"#,
        r#"km.ms2(1)"#,
        r#"km.ms2(0)"#,
        r#"km.wheel(1)"#,
        r#"km.wheel(-1)"#,
        r#"km.lock_mx(1)"#,
        r#"km.lock_mx(0)"#,
        r#"km.lock_my(1)"#,
        r#"km.lock_my(0)"#,
        r#"km.lock_ml(1)"#,
        r#"km.lock_ml(0)"#,
        r#"km.lock_mr(1)"#,
        r#"km.lock_mr(0)"#,
        r#"km.lock_mm(1)"#,
        r#"km.lock_mm(0)"#,
        r#"km.lock_ms1(1)"#,
        r#"km.lock_ms1(0)"#,
        r#"km.lock_ms2(1)"#,
        r#"km.lock_ms2(0)"#,
        r#"km.catch_ml(1)"#,
        r#"km.catch_ml(0)"#,
        r#"km.catch_mm(1)"#,
        r#"km.catch_mr(1)"#,
        r#"km.catch_ms1(1)"#,
        r#"km.catch_ms2(1)"#,
        r#"km.invert_x(1)"#,
        r#"km.invert_x(0)"#,
        r#"km.invert_y(1)"#,
        r#"km.invert_y(0)"#,
        r#"km.swap_xy(1)"#,
        r#"km.swap_xy(0)"#,
        r#"km.scroll_side(1)"#,
        r#"km.scroll_side(0)"#,
        r#"km.scroll_lr(1)"#,
        r#"km.scroll_lr(0)"#,
        r#"km.buttons(1,10)"#,
        r#"km.serial("abc123")"#,
        r#"km.serial()"#,
        r#"km.serial(0)"#,
        r#"km.echo(1)"#,
        r#"km.echo(0)"#,
        r#"km.baud(3000000)"#,
        r#"km.version()"#,
        r#"km.reboot()"#,
    ];
    assert_eq!(examples.len(), 93);
    for example in examples {
        let bytes = if example.starts_with('{') {
            wire(example)
        } else {
            format!("{example}\r\n>>> ").into_bytes()
        };
        for boundary in 0..=bytes.len() {
            let mut codec = YscFrames::probe();
            let mut buffer = bytes[..boundary].to_vec();
            let mut incoming = drain(&mut codec, &mut buffer);
            buffer.extend_from_slice(&bytes[boundary..]);
            incoming.extend(drain(&mut codec, &mut buffer));
            assert_eq!(incoming.len(), 1, "{example} split {boundary}");
            if example.starts_with('{') {
                assert!(matches!(incoming[0], Incoming::Noise), "{example}");
            } else {
                assert!(
                    matches!(incoming[0], Incoming::Reply(value) if value == key(example.as_bytes())),
                    "{example}"
                );
            }
        }
    }
}