aboutsummaryrefslogtreecommitdiffstats
path: root/examples/fuzz.rs
blob: aa4289d058f630bca7be36512c83fbb1a8254f00 (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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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();
    let mut idx = 0;
    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_full.screen(), vt_base.screen()),
            "{}: full",
            idx,
        );

        let mut vt_diff_empty = vt100::Parser::default();
        vt_diff_empty.process(&vt_base.screen().state_diff(&empty_screen));
        vt_diff_empty.process(&vt_base.screen().bells_diff(&empty_screen));
        assert!(
            helpers::compare_screens(
                vt_diff_empty.screen(),
                vt_base.screen()
            ),
            "{}: diff-empty",
            idx,
        );

        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_diff.screen(), vt_base.screen()),
            "{}: diff",
            idx,
        );

        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_rows.screen(), vt_base.screen()),
            "{}: rows",
            idx,
        );

        idx += 1;
    }
}