rust/crates/parser/src/tests.rs

72 lines
1.8 KiB
Rust
Raw Normal View History

2021-12-12 12:32:58 -06:00
use std::{
fmt::Write,
fs,
path::{Path, PathBuf},
};
use expect_test::expect_file;
2021-12-18 06:31:50 -06:00
use crate::LexedStr;
2021-12-12 12:32:58 -06:00
#[test]
fn valid_lexes_input() {
for case in TestCase::list("lexer/ok") {
let actual = lex(&case.text);
expect_file![case.txt].assert_eq(&actual)
}
}
#[test]
fn invalid_lexes_input() {
for case in TestCase::list("lexer/err") {
let actual = lex(&case.text);
expect_file![case.txt].assert_eq(&actual)
}
}
fn lex(text: &str) -> String {
2021-12-18 06:31:50 -06:00
let lexed = LexedStr::new(text);
2021-12-12 12:32:58 -06:00
let mut res = String::new();
2021-12-18 06:31:50 -06:00
for i in 0..lexed.len() {
let kind = lexed.kind(i);
let text = lexed.text(i);
let error = lexed.error(i);
let error = error.map(|err| format!(" error: {}", err)).unwrap_or_default();
writeln!(res, "{:?} {:?}{}", kind, text, error).unwrap();
2021-12-12 12:32:58 -06:00
}
res
}
#[derive(PartialEq, Eq, PartialOrd, Ord)]
struct TestCase {
rs: PathBuf,
txt: PathBuf,
text: String,
}
impl TestCase {
fn list(path: &'static str) -> Vec<TestCase> {
let crate_root_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
let test_data_dir = crate_root_dir.join("test_data");
let dir = test_data_dir.join(path);
let mut res = Vec::new();
let read_dir = fs::read_dir(&dir)
.unwrap_or_else(|err| panic!("can't `read_dir` {}: {}", dir.display(), err));
for file in read_dir {
let file = file.unwrap();
let path = file.path();
if path.extension().unwrap_or_default() == "rs" {
let rs = path;
let txt = rs.with_extension("txt");
let text = fs::read_to_string(&rs).unwrap();
res.push(TestCase { rs, txt, text });
}
}
res.sort();
res
}
}