From 820acef50154e1fbfd1559d4113c0a83505a9612 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 5 Dec 2019 03:12:51 -0500 Subject: add a mechanism for autogenerating test fixtures --- examples/generate_fixture.rs | 99 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 examples/generate_fixture.rs (limited to 'examples') diff --git a/examples/generate_fixture.rs b/examples/generate_fixture.rs new file mode 100644 index 0000000..a411e8b --- /dev/null +++ b/examples/generate_fixture.rs @@ -0,0 +1,99 @@ +use std::convert::TryFrom as _; +use std::io::BufRead as _; +use std::io::Write as _; + +#[path = "../tests/helpers/mod.rs"] +mod helpers; + +fn main() { + let name = std::env::args().nth(1).unwrap(); + let _ = std::fs::remove_dir_all(format!("tests/data/fixtures/{}", name)); + std::fs::create_dir_all(format!("tests/data/fixtures/{}", name)).unwrap(); + + let inputs = + std::fs::File::open(format!("tests/data/fixtures/{}.in", name)) + .unwrap(); + let inputs = std::io::BufReader::new(inputs); + + let mut i = 1; + let mut prev_input = vec![]; + for line in inputs.lines() { + let line = line.unwrap(); + + let input = unhex(line.as_bytes()); + let mut input_file = std::fs::File::create(format!( + "tests/data/fixtures/{}/{}.typescript", + name, i + )) + .unwrap(); + input_file.write_all(&input).unwrap(); + + prev_input.extend(input); + let mut term = vt100::Parser::default(); + term.process(&prev_input); + let screen = helpers::FixtureScreen::from_screen(term.screen()); + + let output_file = std::fs::File::create(format!( + "tests/data/fixtures/{}/{}.json", + name, i + )) + .unwrap(); + serde_json::to_writer_pretty(output_file, &screen).unwrap(); + + i += 1; + } +} + +fn unhex(s: &[u8]) -> Vec { + let mut ret = vec![]; + let mut i = 0; + while i < s.len() { + if s[i] == b'\\' { + match s[i + 1] { + b'x' => { + let upper = s[i + 2]; + let lower = s[i + 3]; + ret.push(helpers::hex(upper, lower).unwrap()); + i += 4; + } + b'u' => { + assert_eq!(s[i + 2], b'{'); + let mut digits = vec![]; + let mut j = i + 3; + while s[j] != b'}' { + digits.push(s[j]); + j += 1; + } + let digits: Vec<_> = digits + .iter() + .copied() + .skip_while(|x| x == &b'0') + .collect(); + let digits = String::from_utf8(digits).unwrap(); + let codepoint = u32::from_str_radix(&digits, 16).unwrap(); + let c = char::try_from(codepoint).unwrap(); + let mut bytes = [0; 4]; + ret.extend(c.encode_utf8(&mut bytes).bytes()); + i = j + 1; + } + b'r' => { + ret.push(0x0d); + i += 2; + } + b'n' => { + ret.push(0x0a); + i += 2; + } + b't' => { + ret.push(0x09); + i += 2; + } + _ => panic!("invalid escape"), + } + } else { + ret.push(s[i]); + i += 1; + } + } + ret +} -- cgit v1.2.3-54-g00ecf