From 63ca8bc91a2e34009a7e274a3105223040db6a37 Mon Sep 17 00:00:00 2001 From: DJMcNab <36049421+DJMcNab@users.noreply.github.com> Date: Thu, 20 Dec 2018 15:09:22 +0000 Subject: Change parser tests dir to inline/ok and inline/err --- crates/tools/src/lib.rs | 8 ++++- crates/tools/src/main.rs | 77 +++++++++++++++++++++++++++++------------------- 2 files changed, 54 insertions(+), 31 deletions(-) (limited to 'crates/tools/src') diff --git a/crates/tools/src/lib.rs b/crates/tools/src/lib.rs index 95d6e08f0..66fca5bef 100644 --- a/crates/tools/src/lib.rs +++ b/crates/tools/src/lib.rs @@ -21,6 +21,7 @@ const TOOLCHAIN: &str = "1.31.0"; pub struct Test { pub name: String, pub text: String, + pub ok: bool, } pub fn collect_tests(s: &str) -> Vec<(usize, Test)> { @@ -38,11 +39,16 @@ pub fn collect_tests(s: &str) -> Vec<(usize, Test)> { } let mut block = block.map(|(idx, line)| (idx, &line[prefix.len()..])); + let mut ok = true; let (start_line, name) = loop { match block.next() { Some((idx, line)) if line.starts_with("test ") => { break (idx, line["test ".len()..].to_string()); } + Some((idx, line)) if line.starts_with("test_fail ") => { + ok = false; + break (idx, line["test_fail ".len()..].to_string()); + } Some(_) => (), None => continue 'outer, } @@ -52,7 +58,7 @@ pub fn collect_tests(s: &str) -> Vec<(usize, Test)> { "\n", ); assert!(!text.trim().is_empty() && text.ends_with('\n')); - res.push((start_line, Test { name, text })) + res.push((start_line, Test { name, text, ok })) } res } diff --git a/crates/tools/src/main.rs b/crates/tools/src/main.rs index 8e5e2036d..08b21f7af 100644 --- a/crates/tools/src/main.rs +++ b/crates/tools/src/main.rs @@ -7,10 +7,11 @@ use std::{ use clap::{App, Arg, SubCommand}; use failure::bail; -use tools::{collect_tests, generate, install_format_hook, run, run_rustfmt, Mode, Overwrite, Result, Test, Verify}; +use tools::{collect_tests, generate, install_format_hook, run, run_rustfmt, Mode, Overwrite, Result, Test, Verify, project_root}; -const GRAMMAR_DIR: &str = "./crates/ra_syntax/src/grammar"; -const INLINE_TESTS_DIR: &str = "./crates/ra_syntax/tests/data/parser/inline"; +const GRAMMAR_DIR: &str = "crates/ra_syntax/src/grammar"; +const OK_INLINE_TESTS_DIR: &str = "crates/ra_syntax/tests/data/parser/inline/ok"; +const ERR_INLINE_TESTS_DIR: &str = "crates/ra_syntax/tests/data/parser/inline/err"; fn main() -> Result<()> { let matches = App::new("tasks") @@ -48,34 +49,43 @@ fn main() -> Result<()> { fn gen_tests(mode: Mode) -> Result<()> { let tests = tests_from_dir(Path::new(GRAMMAR_DIR))?; + fn install_tests(tests: &HashMap, into: &str, mode: Mode) -> Result<()> { + let tests_dir = project_root().join(into); + if !tests_dir.is_dir() { + fs::create_dir_all(&tests_dir)?; + } + // ok is never is actually read, but it needs to be specified to create a Test in existing_tests + let existing = existing_tests(&tests_dir, true)?; + for t in existing.keys().filter(|&t| !tests.contains_key(t)) { + panic!("Test is deleted: {}", t); + } - let inline_tests_dir = Path::new(INLINE_TESTS_DIR); - if !inline_tests_dir.is_dir() { - fs::create_dir_all(inline_tests_dir)?; - } - let existing = existing_tests(inline_tests_dir)?; - - for t in existing.keys().filter(|&t| !tests.contains_key(t)) { - panic!("Test is deleted: {}", t); + let mut new_idx = existing.len() + 2; + for (name, test) in tests { + let path = match existing.get(name) { + Some((path, _test)) => path.clone(), + None => { + let file_name = format!("{:04}_{}.rs", new_idx, name); + new_idx += 1; + tests_dir.join(file_name) + } + }; + teraron::update(&path, &test.text, mode)?; + } + Ok(()) } + install_tests(&tests.ok, OK_INLINE_TESTS_DIR, mode)?; + install_tests(&tests.err, ERR_INLINE_TESTS_DIR, mode) +} - let mut new_idx = existing.len() + 2; - for (name, test) in tests { - let path = match existing.get(&name) { - Some((path, _test)) => path.clone(), - None => { - let file_name = format!("{:04}_{}.rs", new_idx, name); - new_idx += 1; - inline_tests_dir.join(file_name) - } - }; - teraron::update(&path, &test.text, mode)?; - } - Ok(()) +#[derive(Default, Debug)] +struct Tests { + pub ok: HashMap, + pub err: HashMap, } -fn tests_from_dir(dir: &Path) -> Result> { - let mut res = HashMap::new(); +fn tests_from_dir(dir: &Path) -> Result { + let mut res = Tests::default(); for entry in ::walkdir::WalkDir::new(dir) { let entry = entry.unwrap(); if !entry.file_type().is_file() { @@ -89,19 +99,25 @@ fn tests_from_dir(dir: &Path) -> Result> { let grammar_rs = dir.parent().unwrap().join("grammar.rs"); process_file(&mut res, &grammar_rs)?; return Ok(res); - fn process_file(res: &mut HashMap, path: &Path) -> Result<()> { + fn process_file(res: &mut Tests, path: &Path) -> Result<()> { let text = fs::read_to_string(path)?; for (_, test) in collect_tests(&text) { - if let Some(old_test) = res.insert(test.name.clone(), test) { - bail!("Duplicate test: {}", old_test.name) + if test.ok { + if let Some(old_test) = res.ok.insert(test.name.clone(), test) { + bail!("Duplicate test: {}", old_test.name) + } + } else { + if let Some(old_test) = res.err.insert(test.name.clone(), test) { + bail!("Duplicate test: {}", old_test.name) + } } } Ok(()) } } -fn existing_tests(dir: &Path) -> Result> { +fn existing_tests(dir: &Path, ok: bool) -> Result> { let mut res = HashMap::new(); for file in fs::read_dir(dir)? { let file = file?; @@ -117,6 +133,7 @@ fn existing_tests(dir: &Path) -> Result> { let test = Test { name: name.clone(), text, + ok, }; if let Some(old) = res.insert(name, (path, test)) { println!("Duplicate test: {:?}", old); -- cgit v1.2.3 From 84ff52390dc278aaed3ee148ddb971d1f5d77c7e Mon Sep 17 00:00:00 2001 From: DJMcNab <36049421+DJMcNab@users.noreply.github.com> Date: Thu, 20 Dec 2018 15:09:57 +0000 Subject: Rename test_fail to test_err --- crates/tools/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/tools/src') diff --git a/crates/tools/src/lib.rs b/crates/tools/src/lib.rs index 66fca5bef..6d4ac4726 100644 --- a/crates/tools/src/lib.rs +++ b/crates/tools/src/lib.rs @@ -45,7 +45,7 @@ pub fn collect_tests(s: &str) -> Vec<(usize, Test)> { Some((idx, line)) if line.starts_with("test ") => { break (idx, line["test ".len()..].to_string()); } - Some((idx, line)) if line.starts_with("test_fail ") => { + Some((idx, line)) if line.starts_with("test_err ") => { ok = false; break (idx, line["test_fail ".len()..].to_string()); } -- cgit v1.2.3 From 134fe4f566d94fd4ca91c6417fab0ae7b3e4275f Mon Sep 17 00:00:00 2001 From: DJMcNab <36049421+DJMcNab@users.noreply.github.com> Date: Thu, 20 Dec 2018 16:45:54 +0000 Subject: Fix the tests and fix the precommit hook --- crates/tools/src/bin/pre-commit.rs | 3 ++- crates/tools/src/lib.rs | 2 +- crates/tools/src/main.rs | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) (limited to 'crates/tools/src') diff --git a/crates/tools/src/bin/pre-commit.rs b/crates/tools/src/bin/pre-commit.rs index ca1909479..bae3b26d3 100644 --- a/crates/tools/src/bin/pre-commit.rs +++ b/crates/tools/src/bin/pre-commit.rs @@ -14,13 +14,14 @@ fn update_staged() -> Result<()> { let root = project_root(); let output = Command::new("git") .arg("diff") + .arg("--diff-filter=MAR") .arg("--name-only") .arg("--cached") .current_dir(&root) .output()?; if !output.status.success() { bail!( - "`git diff --name-only --cached` exited with {}", + "`git diff --diff-filter=MAR --name-only --cached` exited with {}", output.status ); } diff --git a/crates/tools/src/lib.rs b/crates/tools/src/lib.rs index 6d4ac4726..580d8b802 100644 --- a/crates/tools/src/lib.rs +++ b/crates/tools/src/lib.rs @@ -47,7 +47,7 @@ pub fn collect_tests(s: &str) -> Vec<(usize, Test)> { } Some((idx, line)) if line.starts_with("test_err ") => { ok = false; - break (idx, line["test_fail ".len()..].to_string()); + break (idx, line["test_err ".len()..].to_string()); } Some(_) => (), None => continue 'outer, diff --git a/crates/tools/src/main.rs b/crates/tools/src/main.rs index 08b21f7af..0e54cadda 100644 --- a/crates/tools/src/main.rs +++ b/crates/tools/src/main.rs @@ -54,13 +54,13 @@ fn gen_tests(mode: Mode) -> Result<()> { if !tests_dir.is_dir() { fs::create_dir_all(&tests_dir)?; } - // ok is never is actually read, but it needs to be specified to create a Test in existing_tests + // ok is never actually read, but it needs to be specified to create a Test in existing_tests let existing = existing_tests(&tests_dir, true)?; for t in existing.keys().filter(|&t| !tests.contains_key(t)) { - panic!("Test is deleted: {}", t); + // panic!("Test is deleted: {}", t); } - let mut new_idx = existing.len() + 2; + let mut new_idx = existing.len() + 1; for (name, test) in tests { let path = match existing.get(name) { Some((path, _test)) => path.clone(), -- cgit v1.2.3 From 0ffba1e8965a75d2c07a053a0803a186fb7fa1f7 Mon Sep 17 00:00:00 2001 From: DJMcNab <36049421+DJMcNab@users.noreply.github.com> Date: Thu, 20 Dec 2018 17:29:26 +0000 Subject: Fix broken test is deleted comment --- crates/tools/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/tools/src') diff --git a/crates/tools/src/main.rs b/crates/tools/src/main.rs index 0e54cadda..7edf8f52d 100644 --- a/crates/tools/src/main.rs +++ b/crates/tools/src/main.rs @@ -57,7 +57,7 @@ fn gen_tests(mode: Mode) -> Result<()> { // ok is never actually read, but it needs to be specified to create a Test in existing_tests let existing = existing_tests(&tests_dir, true)?; for t in existing.keys().filter(|&t| !tests.contains_key(t)) { - // panic!("Test is deleted: {}", t); + panic!("Test is deleted: {}", t); } let mut new_idx = existing.len() + 1; -- cgit v1.2.3