aboutsummaryrefslogtreecommitdiffstats
path: root/examples/fuzz.rs
blob: 6ae7d47b771a1bfcb2544b6110707ab5fc15e07d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
use std::io::Read as _;

#[path = "../tests/helpers/mod.rs"]
mod helpers;

fn main() {
    let mut vt_base = vt100::Parser::default();
    let mut vt_diff = vt100::Parser::default();
    let mut prev_screen = vt_base.screen().clone();
    let empty_screen = vt100::Parser::default().screen().clone();
    loop {
        let mut byte = [0];
        match std::io::stdin().read(&mut byte) {
            Ok(bytes) => {
                if bytes != 1 {
                    break;
                }
            }
            Err(e) => {
                eprintln!("{}", e);
                break;
            }
        }
        vt_base.process(&byte);

        let mut vt_full = vt100::Parser::default();
        vt_full.process(&vt_base.screen().state_formatted());
        vt_full.process(&vt_base.screen().bells_diff(&empty_screen));
        assert!(
            helpers::compare_screens(vt_base.screen(), vt_full.screen()),
            "full"
        );

        vt_diff.process(&vt_base.screen().state_diff(&prev_screen));
        vt_diff.process(&vt_base.screen().bells_diff(&empty_screen));
        prev_screen = vt_base.screen().clone();
        assert!(
            helpers::compare_screens(vt_base.screen(), vt_diff.screen()),
            "diff"
        );

        let mut vt_rows = vt100::Parser::default();
        let mut wrapped = false;
        for (idx, row) in vt_base.screen().rows_formatted(0, 80).enumerate() {
            vt_rows.process(b"\x1b[m");
            if !wrapped {
                vt_rows.process(format!("\x1b[{}H", idx + 1).as_bytes());
            }
            vt_rows.process(&row);
            wrapped = vt_base.screen().row_wrapped(idx.try_into().unwrap());
        }
        vt_rows.process(&vt_base.screen().cursor_state_formatted());
        vt_rows.process(&vt_base.screen().attributes_formatted());
        vt_rows.process(&vt_base.screen().input_mode_formatted());
        vt_rows.process(&vt_base.screen().title_formatted());
        vt_rows.process(&vt_base.screen().bells_diff(&empty_screen));
        assert!(
            helpers::compare_screens(vt_base.screen(), vt_rows.screen()),
            "rows"
        );
    }
}