parser-test 0.1.0

Declarative tester for parsers
Documentation

This crate allows you to write parser's tests like follows:

let input = "#( a b #items x y )*";
let spans = "   ^ ^ ^----^ ^ ^ ";
let expected = [
    Rule::token,
    Rule::token,
    Rule::interpolate,
    Rule::token,
    Rule::token,
];

Highlight each token with ^, ^^ or ^---^ to indicate it's span. Any parser can be used, as long as you implement TestToken trait for it's output.

For example:

struct TestToken {
    start: usize,
    end: usize,
    rule: Rule,
}

impl parser_test::Token for TestToken {
    type Rule = Rule;

    fn start(&self) -> usize {
        self.start
    }

    fn end(&self) -> usize {
        self.end
    }

    fn rule(&self) -> Self::Rule {
        self.rule
    }
}

So far this crate is used to test pest parsers:

let mut output = Lexer::parse(Rule::interpolate_repetition, input).unwrap();
let output = output.next().unwrap().into_inner().map(|t| {
    let span = t.as_span();
    TestToken {
        start: span.start(),
        end: span.end() - 1,
        rule: t.as_rule()
    }
});
assert!(parser_test::test(output, expected, spans));