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