use parser;
use grammar::parse_tree::{Span};
use normalize::resolve::resolve;
use regex::Regex;
fn check_err(expected_err: &str, grammar: &str) {
let expected_err = Regex::new(expected_err).unwrap();
let start_index = grammar.find(">>>").unwrap();
let grammar = grammar.replace(">>>", ""); let end_index = grammar.rfind("<<<").unwrap();
let grammar = grammar.replace("<<<", "");
assert!(start_index <= end_index);
let parsed_grammar = parser::parse_grammar(&grammar).unwrap();
let parsed_grammar = resolve(parsed_grammar).unwrap();
match super::validate(&parsed_grammar) {
Ok(()) => {
panic!("expected error for grammar");
}
Err(err) => {
assert_eq!(err.span, Span(start_index, end_index));
assert!(expected_err.is_match(&err.message),
"unexpected error text `{}`, did not match `{}`", err.message, expected_err);
}
}
}
#[test]
fn unknown_terminal() {
check_err(
r#"terminal `"\+"` does not have a pattern defined for it"#,
r#"grammar; X = X >>>"+"<<<;"#);
}
#[test]
fn unknown_id_terminal() {
check_err(
r#"terminal `"foo"` does not have a pattern defined for it"#,
r#"grammar; X = X >>>"foo"<<<;"#);
}