Refactor parser tests to be more consistent
This commit is contained in:
+36
-36
@@ -234,20 +234,25 @@ impl_rule_for_many!(A B C D E F G H I J);
|
|||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
fn parse<T: Rule>(rule: &T, input: &str) -> Result<()> {
|
fn parse<T: Rule>(rule: &T, input: &str) {
|
||||||
let mut p = Parser::new(input);
|
let mut p = Parser::new(input);
|
||||||
let rule = (Ref(rule), EOF);
|
let rule = (Ref(rule), EOF);
|
||||||
rule.parse(&mut p)
|
assert!(rule.parse(&mut p).is_ok());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_err<T: Rule>(rule: &T, input: &str) {
|
||||||
|
let mut p = Parser::new(input);
|
||||||
|
let rule = (Ref(rule), EOF);
|
||||||
|
assert!(rule.parse(&mut p).is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_char_range() -> Result<()> {
|
fn test_char_range() {
|
||||||
let num = '0'..='9';
|
let num = '0'..='9';
|
||||||
let rule = (Ref(&num), star!(Ref(&num)));
|
let rule = (Ref(&num), star!(Ref(&num)));
|
||||||
parse(&rule, "0")?;
|
parse(&rule, "0");
|
||||||
parse(&rule, "123")?;
|
parse(&rule, "123");
|
||||||
parse(&rule, "9")?;
|
parse(&rule, "9");
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -255,70 +260,65 @@ mod test {
|
|||||||
let foo = ("f", "o", "o");
|
let foo = ("f", "o", "o");
|
||||||
let bar = "bar";
|
let bar = "bar";
|
||||||
let rule = (foo, " ", bar);
|
let rule = (foo, " ", bar);
|
||||||
let mut p = Parser::new("foo bar");
|
parse(&rule, "foo bar");
|
||||||
rule.parse(&mut p).unwrap();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_combinator_fn_wrapper() {
|
fn test_combinator_fn_wrapper() {
|
||||||
let foo = || "foo";
|
let foo = || "foo";
|
||||||
let bar = (foo, " ", foo);
|
let bar = (foo, " ", foo);
|
||||||
let mut p = Parser::new("foo foo");
|
parse(&bar, "foo foo");
|
||||||
bar.parse(&mut p).unwrap();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_combinator_alt() -> Result<()> {
|
fn test_combinator_alt() {
|
||||||
let item = Alt(("foo", "bar", "baz"));
|
let item = Alt(("foo", "bar", "baz"));
|
||||||
let rule = (Ref(&item), ", ", Ref(&item));
|
let rule = (Ref(&item), ", ", Ref(&item));
|
||||||
parse(&rule, "foo, bar")?;
|
parse(&rule, "foo, bar");
|
||||||
parse(&rule, "bar, baz")?;
|
parse(&rule, "bar, baz");
|
||||||
parse(&rule, "baz, foo")?;
|
parse(&rule, "baz, foo");
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_combinator_and() {
|
fn test_combinator_and() {
|
||||||
let has = |x| (star!(Not(x), Dot), x);
|
let has = |x| (star!(Not(x), Dot), x);
|
||||||
let foo_bar = (And(has("foo")), And(has("bar")), star!(Dot));
|
let foo_bar = (And(has("foo")), And(has("bar")), star!(Dot));
|
||||||
parse(&foo_bar, "foo bar").unwrap();
|
parse(&foo_bar, "foo bar");
|
||||||
parse(&foo_bar, "bar foo").unwrap();
|
parse(&foo_bar, "bar foo");
|
||||||
parse(&foo_bar, "foo foo").unwrap_err();
|
parse_err(&foo_bar, "foo foo");
|
||||||
parse(&foo_bar, "bar bar").unwrap_err();
|
parse_err(&foo_bar, "bar bar");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_combinator_dot() -> Result<()> {
|
fn test_combinator_dot() {
|
||||||
let rule = ("foo", Dot, "bar");
|
let rule = ("foo", Dot, "bar");
|
||||||
parse(&rule, "foo bar")?;
|
parse(&rule, "foo bar");
|
||||||
parse(&rule, "foodbar")?;
|
parse(&rule, "foodbar");
|
||||||
parse(&rule, "foo\nbar")?;
|
parse(&rule, "foo\nbar");
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_combinator_not() {
|
fn test_combinator_not() {
|
||||||
let rule = (Not("foo"), star!(Dot));
|
let rule = (Not("foo"), star!(Dot));
|
||||||
parse(&rule, "bar").unwrap();
|
parse(&rule, "bar");
|
||||||
parse(&rule, "barfoo").unwrap();
|
parse(&rule, "barfoo");
|
||||||
parse(&rule, "foobar").unwrap_err();
|
parse_err(&rule, "foobar");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_combinator_opt() {
|
fn test_combinator_opt() {
|
||||||
let rule = ("foo", Opt(" "), "bar");
|
let rule = ("foo", Opt(" "), "bar");
|
||||||
parse(&rule, "foobar").unwrap();
|
parse(&rule, "foobar");
|
||||||
parse(&rule, "foo bar").unwrap();
|
parse(&rule, "foo bar");
|
||||||
parse(&rule, "foo bar").unwrap_err();
|
parse_err(&rule, "foo bar");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_combinator_star() -> Result<()> {
|
fn test_combinator_star() {
|
||||||
let item = "foo";
|
let item = "foo";
|
||||||
let csv = (item, star!(", ", item));
|
let csv = (item, star!(", ", item));
|
||||||
parse(&csv, "foo")?;
|
parse(&csv, "foo");
|
||||||
parse(&csv, "foo, foo")?;
|
parse(&csv, "foo, foo");
|
||||||
parse(&csv, "foo, foo, foo")?;
|
parse(&csv, "foo, foo, foo");
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user