From 9e4052cc2ee12751ba94909ff479bd03df141ac4 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 7 Jan 2018 14:56:08 +0300 Subject: Test utils --- .../data/parser/err/0001_item_recovery_in_file.rs | 3 + .../data/parser/err/0001_item_recovery_in_file.txt | 14 +++++ tests/lexer.rs | 39 +++---------- tests/parser.rs | 48 +++------------- tests/testutils/Cargo.toml | 8 +++ tests/testutils/src/lib.rs | 64 ++++++++++++++++++++++ 6 files changed, 104 insertions(+), 72 deletions(-) create mode 100644 tests/data/parser/err/0001_item_recovery_in_file.rs create mode 100644 tests/data/parser/err/0001_item_recovery_in_file.txt create mode 100644 tests/testutils/Cargo.toml create mode 100644 tests/testutils/src/lib.rs (limited to 'tests') diff --git a/tests/data/parser/err/0001_item_recovery_in_file.rs b/tests/data/parser/err/0001_item_recovery_in_file.rs new file mode 100644 index 000000000..98f23de1f --- /dev/null +++ b/tests/data/parser/err/0001_item_recovery_in_file.rs @@ -0,0 +1,3 @@ +if match + +struct S {} \ No newline at end of file diff --git a/tests/data/parser/err/0001_item_recovery_in_file.txt b/tests/data/parser/err/0001_item_recovery_in_file.txt new file mode 100644 index 000000000..730367694 --- /dev/null +++ b/tests/data/parser/err/0001_item_recovery_in_file.txt @@ -0,0 +1,14 @@ +FILE@[0; 21) + ERROR@[0; 10) + err: `expected item` + IDENT@[0; 2) + WHITESPACE@[2; 3) + IDENT@[3; 8) + WHITESPACE@[8; 10) + STRUCT_ITEM@[10; 21) + STRUCT_KW@[10; 16) + WHITESPACE@[16; 17) + IDENT@[17; 18) + WHITESPACE@[18; 19) + L_CURLY@[19; 20) + R_CURLY@[20; 21) diff --git a/tests/lexer.rs b/tests/lexer.rs index beca19c24..6c7531596 100644 --- a/tests/lexer.rs +++ b/tests/lexer.rs @@ -1,56 +1,31 @@ extern crate file; -#[macro_use(assert_diff)] -extern crate difference; extern crate libsyntax2; +extern crate testutils; -use std::path::{PathBuf, Path}; -use std::fs::read_dir; +use std::path::{Path}; use std::fmt::Write; use libsyntax2::{Token, tokenize}; +use testutils::{assert_equal_text, collect_tests}; #[test] fn lexer_tests() { - for test_case in lexer_test_cases() { + for test_case in collect_tests(&["lexer"]) { lexer_test_case(&test_case); } } -fn lexer_test_dir() -> PathBuf { - let dir = env!("CARGO_MANIFEST_DIR"); - PathBuf::from(dir).join("tests/data/lexer") -} - -fn lexer_test_cases() -> Vec { - let mut acc = Vec::new(); - let dir = lexer_test_dir(); - for file in read_dir(&dir).unwrap() { - let file = file.unwrap(); - let path = file.path(); - if path.extension().unwrap_or_default() == "rs" { - acc.push(path); - } - } - acc.sort(); - acc -} - fn lexer_test_case(path: &Path) { let actual = { let text = file::get_text(path).unwrap(); let tokens = tokenize(&text); dump_tokens(&tokens, &text) }; - let expected = file::get_text(&path.with_extension("txt")).unwrap(); + let path = path.with_extension("txt"); + let expected = file::get_text(&path).unwrap(); let expected = expected.as_str(); let actual = actual.as_str(); - if expected == actual { - return - } - if expected.trim() == actual.trim() { - panic!("Whitespace difference!") - } - assert_diff!(expected, actual, "\n", 0) + assert_equal_text(expected, actual, &path) } fn dump_tokens(tokens: &[Token], text: &str) -> String { diff --git a/tests/parser.rs b/tests/parser.rs index 43d04e491..518852bb2 100644 --- a/tests/parser.rs +++ b/tests/parser.rs @@ -1,46 +1,20 @@ extern crate file; -#[macro_use(assert_diff)] -extern crate difference; extern crate libsyntax2; +extern crate testutils; -use std::path::{PathBuf, Path}; -use std::fs::read_dir; +use std::path::{Path}; use std::fmt::Write; use libsyntax2::{tokenize, parse, Node, File}; +use testutils::{collect_tests, assert_equal_text}; #[test] fn parser_tests() { - for test_case in parser_test_cases() { + for test_case in collect_tests(&["parser/ok", "parser/err"]) { parser_test_case(&test_case); } } -fn parser_test_dir() -> PathBuf { - let dir = env!("CARGO_MANIFEST_DIR"); - PathBuf::from(dir).join("tests/data/parser") -} - -fn test_from_dir(dir: &Path) -> Vec { - let mut acc = Vec::new(); - for file in read_dir(&dir).unwrap() { - let file = file.unwrap(); - let path = file.path(); - if path.extension().unwrap_or_default() == "rs" { - acc.push(path); - } - } - acc.sort(); - acc -} - -fn parser_test_cases() -> Vec { - let mut acc = Vec::new(); - acc.extend(test_from_dir(&parser_test_dir().join("ok"))); - acc.extend(test_from_dir(&parser_test_dir().join("err"))); - acc -} - fn parser_test_case(path: &Path) { let actual = { let text = file::get_text(path).unwrap(); @@ -48,19 +22,13 @@ fn parser_test_case(path: &Path) { let file = parse(text, &tokens); dump_tree(&file) }; - let expected = path.with_extension("txt"); - let expected = file::get_text(&expected).expect( - &format!("Can't read {}", expected.display()) + let expected_path = path.with_extension("txt"); + let expected = file::get_text(&expected_path).expect( + &format!("Can't read {}", expected_path.display()) ); let expected = expected.as_str(); let actual = actual.as_str(); - if expected == actual { - return - } - if expected.trim() == actual.trim() { - panic!("Whitespace difference! {}", path.display()) - } - assert_diff!(expected, actual, "\n", 0) + assert_equal_text(expected, actual, &expected_path); } fn dump_tree(file: &File) -> String { diff --git a/tests/testutils/Cargo.toml b/tests/testutils/Cargo.toml new file mode 100644 index 000000000..9003822ee --- /dev/null +++ b/tests/testutils/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "testutils" +version = "0.1.0" +authors = ["Aleksey Kladov "] + +[dependencies] +file = "1.0" +difference = "1.0.0" diff --git a/tests/testutils/src/lib.rs b/tests/testutils/src/lib.rs new file mode 100644 index 000000000..9fc85cc24 --- /dev/null +++ b/tests/testutils/src/lib.rs @@ -0,0 +1,64 @@ +extern crate difference; +extern crate file; + +use std::path::{PathBuf, Path}; +use std::fs::read_dir; + +use difference::Changeset; + +pub fn assert_equal_text( + expected: &str, + actual: &str, + path: &Path +) { + if expected != actual { + print_difference(expected, actual, path) + } +} + +pub fn collect_tests(paths: &[&str]) -> Vec { + paths.iter().flat_map(|path| { + let path = test_data_dir().join(path); + test_from_dir(&path).into_iter() + }).collect() +} + +fn test_from_dir(dir: &Path) -> Vec { + let mut acc = Vec::new(); + for file in read_dir(&dir).unwrap() { + let file = file.unwrap(); + let path = file.path(); + if path.extension().unwrap_or_default() == "rs" { + acc.push(path); + } + } + acc.sort(); + acc +} + +fn print_difference(expected: &str, actual: &str, path: &Path) { + let dir = project_dir(); + let path = path.strip_prefix(&dir).unwrap_or_else(|_| path); + println!("\nfile: {}", path.display()); + if expected.trim() == actual.trim() { + println!("whitespace difference"); + println!("rewriting the file"); + file::put_text(path, actual).unwrap(); + } else { + let changeset = Changeset::new(actual, expected, "\n"); + println!("{}", changeset); + } + panic!("Comparison failed") +} + +fn project_dir() -> PathBuf { + let dir = env!("CARGO_MANIFEST_DIR"); + PathBuf::from(dir) + .parent().unwrap() + .parent().unwrap() + .to_owned() +} + +fn test_data_dir() -> PathBuf { + project_dir().join("tests/data") +} \ No newline at end of file -- cgit v1.2.3