1 use std::convert::TryFrom as _;
2 use std::io::BufRead as _;
3 use std::io::Write as _;
4
5 #[path = "../tests/helpers/mod.rs"]
6 mod helpers;
7
main()8 fn main() {
9 let name = std::env::args().nth(1).unwrap();
10 let _ = std::fs::remove_dir_all(format!("tests/data/fixtures/{}", name));
11 std::fs::create_dir_all(format!("tests/data/fixtures/{}", name)).unwrap();
12
13 let inputs =
14 std::fs::File::open(format!("tests/data/fixtures/{}.in", name))
15 .unwrap();
16 let inputs = std::io::BufReader::new(inputs);
17
18 let mut i = 1;
19 let mut prev_input = vec![];
20 for line in inputs.lines() {
21 let line = line.unwrap();
22
23 let input = unhex(line.as_bytes());
24 let mut input_file = std::fs::File::create(format!(
25 "tests/data/fixtures/{}/{}.typescript",
26 name, i
27 ))
28 .unwrap();
29 input_file.write_all(&input).unwrap();
30
31 prev_input.extend(input);
32 let mut term = vt100::Parser::default();
33 term.process(&prev_input);
34 let screen = helpers::FixtureScreen::from_screen(term.screen());
35
36 let output_file = std::fs::File::create(format!(
37 "tests/data/fixtures/{}/{}.json",
38 name, i
39 ))
40 .unwrap();
41 serde_json::to_writer_pretty(output_file, &screen).unwrap();
42
43 i += 1;
44 }
45 }
46
unhex(s: &[u8]) -> Vec<u8>47 fn unhex(s: &[u8]) -> Vec<u8> {
48 let mut ret = vec![];
49 let mut i = 0;
50 while i < s.len() {
51 if s[i] == b'\\' {
52 match s[i + 1] {
53 b'x' => {
54 let upper = s[i + 2];
55 let lower = s[i + 3];
56 ret.push(helpers::hex(upper, lower).unwrap());
57 i += 4;
58 }
59 b'u' => {
60 assert_eq!(s[i + 2], b'{');
61 let mut digits = vec![];
62 let mut j = i + 3;
63 while s[j] != b'}' {
64 digits.push(s[j]);
65 j += 1;
66 }
67 let digits: Vec<_> = digits
68 .iter()
69 .copied()
70 .skip_while(|x| x == &b'0')
71 .collect();
72 let digits = String::from_utf8(digits).unwrap();
73 let codepoint = u32::from_str_radix(&digits, 16).unwrap();
74 let c = char::try_from(codepoint).unwrap();
75 let mut bytes = [0; 4];
76 ret.extend(c.encode_utf8(&mut bytes).bytes());
77 i = j + 1;
78 }
79 b'r' => {
80 ret.push(0x0d);
81 i += 2;
82 }
83 b'n' => {
84 ret.push(0x0a);
85 i += 2;
86 }
87 b't' => {
88 ret.push(0x09);
89 i += 2;
90 }
91 _ => panic!("invalid escape"),
92 }
93 } else {
94 ret.push(s[i]);
95 i += 1;
96 }
97 }
98 ret
99 }
100