aboutsummaryrefslogtreecommitdiffstats
path: root/tests/csi.rs
blob: d525262ab1e393c914410831feb94cb3b2000b31 (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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
extern crate vt100;

mod support;
use support::TestHelpers;

#[test]
fn absolute_movement() {
    let mut screen = vt100::Screen::new(24, 80);
    assert_eq!(screen.cursor_position(), (0, 0));

    screen.assert_process(b"\x1b[10;10H");
    assert_eq!(screen.cursor_position(), (9, 9));

    screen.assert_process(b"\x1b[d");
    assert_eq!(screen.cursor_position(), (0, 9));

    screen.assert_process(b"\x1b[15d");
    assert_eq!(screen.cursor_position(), (14, 9));

    screen.assert_process(b"\x1b[H");
    assert_eq!(screen.cursor_position(), (0, 0));

    screen.assert_process(b"\x1b[8H");
    assert_eq!(screen.cursor_position(), (7, 0));

    screen.assert_process(b"\x1b[15G");
    assert_eq!(screen.cursor_position(), (7, 14));

    screen.assert_process(b"\x1b[G");
    assert_eq!(screen.cursor_position(), (7, 0));

    screen.assert_process(b"\x1b[0;0H");
    assert_eq!(screen.cursor_position(), (0, 0));

    screen.assert_process(b"\x1b[1;1H");
    assert_eq!(screen.cursor_position(), (0, 0));

    screen.assert_process(b"\x1b[500;500H");
    assert_eq!(screen.cursor_position(), (23, 79));
}

#[test]
fn relative_movement() {
    let mut screen = vt100::Screen::new(24, 80);
    assert_eq!(screen.cursor_position(), (0, 0));

    screen.assert_process(b"\x1b[C");
    assert_eq!(screen.cursor_position(), (0, 1));

    screen.assert_process(b"\x1b[C");
    assert_eq!(screen.cursor_position(), (0, 2));

    screen.assert_process(b"\x1b[20C");
    assert_eq!(screen.cursor_position(), (0, 22));

    screen.assert_process(b"\x1b[D");
    assert_eq!(screen.cursor_position(), (0, 21));

    screen.assert_process(b"\x1b[D");
    assert_eq!(screen.cursor_position(), (0, 20));

    screen.assert_process(b"\x1b[9D");
    assert_eq!(screen.cursor_position(), (0, 11));

    screen.assert_process(b"\x1b[500C");
    assert_eq!(screen.cursor_position(), (0, 79));

    screen.assert_process(b"\x1b[500D");
    assert_eq!(screen.cursor_position(), (0, 0));

    screen.assert_process(b"\x1b[B");
    assert_eq!(screen.cursor_position(), (1, 0));

    screen.assert_process(b"\x1b[B");
    assert_eq!(screen.cursor_position(), (2, 0));

    screen.assert_process(b"\x1b[20B");
    assert_eq!(screen.cursor_position(), (22, 0));

    screen.assert_process(b"\x1b[A");
    assert_eq!(screen.cursor_position(), (21, 0));

    screen.assert_process(b"\x1b[A");
    assert_eq!(screen.cursor_position(), (20, 0));

    screen.assert_process(b"\x1b[9A");
    assert_eq!(screen.cursor_position(), (11, 0));

    screen.assert_process(b"\x1b[500B");
    assert_eq!(screen.cursor_position(), (23, 0));

    screen.assert_process(b"\x1b[500A");
    assert_eq!(screen.cursor_position(), (0, 0));
}

#[test]
fn ed() {
    let mut screen = vt100::Screen::new(24, 80);
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"foo\x1b[5;5Hbar\x1b[10;10Hbaz\x1b[20;20Hquux");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n    bar\n\n\n\n\n         baz\n\n\n\n\n\n\n\n\n\n                   quux\n\n\n\n\n");

    screen.assert_process(b"\x1b[10;12H\x1b[0J");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n    bar\n\n\n\n\n         ba\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"\x1b[5;7H\x1b[1J");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n      r\n\n\n\n\n         ba\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"\x1b[7;7H\x1b[2J");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"\x1b[2J\x1b[H");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"foo\x1b[5;5Hbar\x1b[10;10Hbaz\x1b[20;20Hquux");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n    bar\n\n\n\n\n         baz\n\n\n\n\n\n\n\n\n\n                   quux\n\n\n\n\n");

    screen.assert_process(b"\x1b[10;12H\x1b[J");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n    bar\n\n\n\n\n         ba\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"\x1b[2J\x1b[H");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"foo\x1b[5;5Hbar\x1b[10;10Hbaz\x1b[20;20Hquux");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n    bar\n\n\n\n\n         baz\n\n\n\n\n\n\n\n\n\n                   quux\n\n\n\n\n");

    screen.assert_process(b"\x1b[10;12H\x1b[?0J");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n    bar\n\n\n\n\n         ba\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"\x1b[5;7H\x1b[?1J");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n      r\n\n\n\n\n         ba\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"\x1b[7;7H\x1b[?2J");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"\x1b[2J\x1b[H");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"foo\x1b[5;5Hbar\x1b[10;10Hbaz\x1b[20;20Hquux");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n    bar\n\n\n\n\n         baz\n\n\n\n\n\n\n\n\n\n                   quux\n\n\n\n\n");

    screen.assert_process(b"\x1b[10;12H\x1b[?J");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n    bar\n\n\n\n\n         ba\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
}

#[test]
fn el() {
    let mut screen = vt100::Screen::new(24, 80);
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"foo\x1b[5;5Hbarbar\x1b[10;10Hbazbaz\x1b[20;20Hquux");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n    barbar\n\n\n\n\n         bazbaz\n\n\n\n\n\n\n\n\n\n                   quux\n\n\n\n\n");

    screen.assert_process(b"\x1b[5;8H\x1b[0K");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n    bar\n\n\n\n\n         bazbaz\n\n\n\n\n\n\n\n\n\n                   quux\n\n\n\n\n");

    screen.assert_process(b"\x1b[10;13H\x1b[1K");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n    bar\n\n\n\n\n            baz\n\n\n\n\n\n\n\n\n\n                   quux\n\n\n\n\n");

    screen.assert_process(b"\x1b[20;22H\x1b[2K");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n    bar\n\n\n\n\n            baz\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"\x1b[1;2H\x1b[K");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "f\n\n\n\n    bar\n\n\n\n\n            baz\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"\x1b[2J\x1b[H");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"foo\x1b[5;5Hbarbar\x1b[10;10Hbazbaz\x1b[20;20Hquux");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n    barbar\n\n\n\n\n         bazbaz\n\n\n\n\n\n\n\n\n\n                   quux\n\n\n\n\n");

    screen.assert_process(b"\x1b[5;8H\x1b[?0K");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n    bar\n\n\n\n\n         bazbaz\n\n\n\n\n\n\n\n\n\n                   quux\n\n\n\n\n");

    screen.assert_process(b"\x1b[10;13H\x1b[?1K");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n    bar\n\n\n\n\n            baz\n\n\n\n\n\n\n\n\n\n                   quux\n\n\n\n\n");

    screen.assert_process(b"\x1b[20;22H\x1b[?2K");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n    bar\n\n\n\n\n            baz\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"\x1b[1;2H\x1b[?K");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "f\n\n\n\n    bar\n\n\n\n\n            baz\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
}

#[test]
fn ich_dch_ech() {
    let mut screen = vt100::Screen::new(24, 80);
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"\x1b[10;10Hfoobar");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n         foobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"\x1b[10;12H\x1b[3@");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n         fo   obar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (9, 11));

    screen.assert_process(b"\x1b[4P");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n         fobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (9, 11));

    screen.assert_process(b"\x1b[100@");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n         fo\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (9, 11));

    screen.assert_process(b"obar");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n         foobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (9, 15));

    screen.assert_process(b"\x1b[10;12H\x1b[100P");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n         fo\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (9, 11));

    screen.assert_process(b"obar");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n         foobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (9, 15));

    screen.assert_process(b"\x1b[10;13H\x1b[X");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n         foo ar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (9, 12));

    screen.assert_process(b"\x1b[10;11H\x1b[4X");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n         f    r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (9, 10));

    screen.assert_process(b"\x1b[10;11H\x1b[400X");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n         f\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (9, 10));
}

#[test]
fn il_dl() {
    let mut screen = vt100::Screen::new(24, 80);
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"\x1b[10;10Hfoobar\x1b[3D");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n         foobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (9, 12));

    screen.assert_process(b"\x1b[L");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n         foobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (9, 12));

    screen.assert_process(b"\x1b[3L");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n\n\n\n         foobar\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (9, 12));

    screen.assert_process(b"\x1b[500L");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (9, 12));

    screen.assert_process(b"\x1b[10;10Hfoobar\x1b[3D\x1b[6A");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n         foobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (3, 12));

    screen.assert_process(b"\x1b[M");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n         foobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (3, 12));

    screen.assert_process(b"\x1b[3M");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n         foobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (3, 12));

    screen.assert_process(b"\x1b[500M");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (3, 12));
}

#[test]
fn scroll() {
    let mut screen = vt100::Screen::new(24, 80);
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    screen.assert_process(b"1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n");

    screen.assert_process(b"\x1b[15;15H");
    assert_eq!(screen.cursor_position(), (14, 14));

    screen.assert_process(b"\x1b[S");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n\n");
    assert_eq!(screen.cursor_position(), (14, 14));

    screen.assert_process(b"\x1b[3S");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n\n\n\n\n");
    assert_eq!(screen.cursor_position(), (14, 14));

    screen.assert_process(b"\x1b[T");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n\n\n\n");
    assert_eq!(screen.cursor_position(), (14, 14));

    screen.assert_process(b"\x1b[5T");
    assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n");
    assert_eq!(screen.cursor_position(), (14, 14));
}