Include error recovery examples in test suite

This commit is contained in:
Max Brunsfeld 2019-01-20 16:58:49 -08:00
parent f6cdd5e3d4
commit 6105bf9909
4 changed files with 52 additions and 34 deletions

2
.gitignore vendored
View file

@ -1,4 +1,4 @@
log.html
log*.html
.idea
*.xcodeproj

View file

@ -28,21 +28,9 @@ lazy_static! {
#[test]
fn test_real_language_corpus_files() {
let mut log_session = None;
let mut parser = Parser::new();
let mut parser = get_parser(&mut log_session, "log1.html");
let grammars_dir = fixtures_dir().join("grammars");
if *LOG_ENABLED {
parser.set_logger(Some(Box::new(|log_type, msg| {
if log_type == LogType::Lex {
eprintln!(" {}", msg);
} else {
eprintln!("{}", msg);
}
})));
} else if *LOG_GRAPH_ENABLED {
log_session = Some(util::log_graphs(&mut parser, "log.html").unwrap());
}
let mut did_fail = false;
for language_name in LANGUAGES.iter().cloned() {
if let Some(filter) = LANGUAGE_FILTER.as_ref() {
@ -60,8 +48,35 @@ fn test_real_language_corpus_files() {
did_fail |= run_mutation_tests(&mut parser, test);
}
drop(parser);
drop(log_session);
if did_fail {
panic!("Corpus tests failed");
}
}
#[test]
fn test_error_corpus_files() {
let mut log_session = None;
let mut parser = get_parser(&mut log_session, "log2.html");
let corpus_dir = fixtures_dir().join("error_corpus");
let mut did_fail = false;
for entry in fs::read_dir(&corpus_dir).unwrap() {
let entry = entry.unwrap();
let language_name = entry.file_name();
let language_name = language_name.to_str().unwrap().replace("_errors.txt", "");
if let Some(filter) = LANGUAGE_FILTER.as_ref() {
if language_name != filter.as_str() {
continue;
}
}
eprintln!("language: {:?}", language_name);
let test = parse_tests(&entry.path()).unwrap();
let language = get_language(&language_name);
parser.set_language(language).unwrap();
did_fail |= run_mutation_tests(&mut parser, test);
}
if did_fail {
panic!("Corpus tests failed");
@ -71,21 +86,9 @@ fn test_real_language_corpus_files() {
#[test]
fn test_feature_corpus_files() {
let mut log_session = None;
let mut parser = Parser::new();
let mut parser = get_parser(&mut log_session, "log3.html");
let test_grammars_dir = fixtures_dir().join("test_grammars");
if *LOG_ENABLED {
parser.set_logger(Some(Box::new(|log_type, msg| {
if log_type == LogType::Lex {
eprintln!(" {}", msg);
} else {
eprintln!("{}", msg);
}
})));
} else if *LOG_GRAPH_ENABLED {
log_session = Some(util::log_graphs(&mut parser, "log.html").unwrap());
}
let mut did_fail = false;
for entry in fs::read_dir(&test_grammars_dir).unwrap() {
let entry = entry.unwrap();
@ -134,9 +137,6 @@ fn test_feature_corpus_files() {
}
}
drop(parser);
drop(log_session);
if did_fail {
panic!("Corpus tests failed");
}
@ -179,3 +179,21 @@ fn run_mutation_tests(parser: &mut Parser, test: TestEntry) -> bool {
}
}
}
fn get_parser(session: &mut Option<util::LogSession>, log_filename: &str) -> Parser {
let mut parser = Parser::new();
if *LOG_ENABLED {
parser.set_logger(Some(Box::new(|log_type, msg| {
if log_type == LogType::Lex {
eprintln!(" {}", msg);
} else {
eprintln!("{}", msg);
}
})));
} else if *LOG_GRAPH_ENABLED {
*session = Some(util::log_graphs(&mut parser, log_filename).unwrap());
}
parser
}

View file

@ -53,7 +53,7 @@ impl Drop for LogSession {
if cfg!(target_os = "macos")
&& fs::metadata(&self.0).unwrap().len() > HTML_HEADER.len() as u64
{
Command::new("open").arg("log.html").output().unwrap();
Command::new("open").arg(&self.0).output().unwrap();
}
} else {
eprintln!(

View file

@ -36,7 +36,7 @@ Missing object-literal values
(program (expression_statement (object
(pair (property_identifier) (identifier))
(pair (property_identifier) (yield_expression (MISSING))))))
(pair (property_identifier) (MISSING)))))
===================================================
Extra identifiers in expressions