dynparser 0.4.2

Dynamic parser. You can define rules at run time. It's possible to use peg format
Documentation
//-----------------------------------------------------------------------
//
//  mod parser::expression  TEST
//
//-----------------------------------------------------------------------

use super::{parse_expr, Expression, MultiExpr, NRep, RepInfo, Status};
use parser::atom::Atom;

#[test]
fn test_parse_literal_ok() {
    let rules = rules!{};
    let status_init = Status::init("aaaaaaaaaaaaaaaa", &rules);
    let expr = Expression::Simple(Atom::Literal("aaa".to_string()));
    let (status, _) = parse_expr(status_init, &expr).ok().unwrap();

    assert!(status.pos.col == 3);
    assert!(status.pos.n == 3);
    assert!(status.pos.row == 0);
}

#[test]
fn test_parse_literal_error() {
    let rules = rules!{};
    let status_init = Status::init("aaaaaaaaaaaaaaaa", &rules);
    let expr = Expression::Simple(Atom::Literal("bb".to_string()));
    assert!(parse_expr(status_init, &expr).is_err());
}

#[test]
fn test_parse_and_ok() {
    let rules = rules!{};
    let status_init = Status::init("aaaaaaaaaaaaaaaa", &rules);
    let and_rules = vec![
        Expression::Simple(Atom::Literal("aa".to_string())),
        Expression::Simple(Atom::Literal("aa".to_string())),
    ];
    let expr = Expression::And(MultiExpr(and_rules));

    let (status, _) = parse_expr(status_init, &expr).ok().unwrap();

    assert_eq!(status.pos.col, 4);
    assert_eq!(status.pos.n, 4);
    assert_eq!(status.pos.row, 0);
}

#[test]
fn test_parse_and_fail() {
    let rules = rules!{};
    let status_init = Status::init("aaaaaaaaaaaaaaaa", &rules);
    let and_rules = vec![
        Expression::Simple(Atom::Literal("aa".to_string())),
        Expression::Simple(Atom::Literal("bb".to_string())),
    ];
    let expr = Expression::And(MultiExpr(and_rules));

    assert!(parse_expr(status_init, &expr).is_err());
}

#[test]
fn test_parse_not_ok() {
    let rules = rules!{};
    let status_init = Status::init("aa", &rules);

    let expr_not = Expression::Not(Box::new(Expression::Simple(Atom::Literal(
        "bb".to_string(),
    ))));
    let (status, _) = parse_expr(status_init, &expr_not).ok().unwrap();

    assert_eq!(status.pos.col, 0);
    assert_eq!(status.pos.n, 0);
    assert_eq!(status.pos.row, 0);
}

#[test]
fn test_parse_not_fail() {
    let rules = rules!{};
    let status_init = Status::init("aa", &rules);

    let expr_not = Expression::Not(Box::new(Expression::Simple(Atom::Literal(
        "aa".to_string(),
    ))));
    assert!(parse_expr(status_init, &expr_not).is_err());
}

#[test]
fn test_parse_or_ok() {
    let rules = rules!{};
    {
        let status_init = Status::init("aaaaaaaaaaaaaaaa", &rules);
        let rules = vec![
            Expression::Simple(Atom::Literal("aa".to_string())),
            Expression::Simple(Atom::Literal("aa".to_string())),
        ];
        let expr = Expression::Or(MultiExpr(rules));

        let (status, _) = parse_expr(status_init, &expr).ok().unwrap();

        assert_eq!(status.pos.col, 2);
        assert_eq!(status.pos.n, 2);
        assert_eq!(status.pos.row, 0);
    }
    {
        let status_init = Status::init("aaaaaaaaaaaaaaaa", &rules);
        let rules = vec![
            Expression::Simple(Atom::Literal("aa".to_string())),
            Expression::Simple(Atom::Literal("bb".to_string())),
        ];
        let expr = Expression::Or(MultiExpr(rules));

        let (status, _) = parse_expr(status_init, &expr).ok().unwrap();

        assert_eq!(status.pos.col, 2);
        assert_eq!(status.pos.n, 2);
        assert_eq!(status.pos.row, 0);
    }
    {
        let status_init = Status::init("aaaaaaaaaaaaaaaa", &rules);
        let rules = vec![
            Expression::Simple(Atom::Literal("bb".to_string())),
            Expression::Simple(Atom::Literal("aa".to_string())),
        ];
        let expr = Expression::Or(MultiExpr(rules));

        let (status, _) = parse_expr(status_init, &expr).ok().unwrap();

        assert_eq!(status.pos.col, 2);
        assert_eq!(status.pos.n, 2);
        assert_eq!(status.pos.row, 0);
    }
}

#[test]
fn test_parse_or_fail() {
    let rules = rules!{};
    let status_init = Status::init("aaaaaaaaaaaaaaaa", &rules);
    let and_rules = vec![
        Expression::Simple(Atom::Literal("cc".to_string())),
        Expression::Simple(Atom::Literal("bb".to_string())),
    ];
    let expr = Expression::And(MultiExpr(and_rules));

    assert!(parse_expr(status_init, &expr).is_err());
}

#[test]
fn test_parse_repeat_ok() {
    let rules = rules!{};
    let repeat_literal = |literal, min, max: Option<NRep>| {
        Expression::Repeat(RepInfo {
            expression: Box::new(Expression::Simple(Atom::Literal(literal))),
            min,
            max,
        })
    };

    {
        let status_init = Status::init("aaaaaa", &rules);
        let expr = repeat_literal("aa".to_string(), NRep(0), None);
        let (status, _) = parse_expr(status_init, &expr).ok().unwrap();

        assert_eq!(status.pos.col, 6);
        assert_eq!(status.pos.n, 6);
        assert_eq!(status.pos.row, 0);
    }
    {
        let status_init = Status::init("aaaaaa", &rules);
        let expr = repeat_literal("aa".to_string(), NRep(3), None);
        let (status, _) = parse_expr(status_init, &expr).ok().unwrap();

        assert_eq!(status.pos.col, 6);
        assert_eq!(status.pos.n, 6);
        assert_eq!(status.pos.row, 0);
    }
    {
        let status_init = Status::init("aaaaaa", &rules);
        let expr = repeat_literal("aa".to_string(), NRep(0), Some(NRep(3)));
        let (status, _) = parse_expr(status_init, &expr).ok().unwrap();

        assert_eq!(status.pos.col, 6);
        assert_eq!(status.pos.n, 6);
        assert_eq!(status.pos.row, 0);
    }
    {
        let status_init = Status::init("aaaaaa", &rules);
        let expr = repeat_literal("aa".to_string(), NRep(0), Some(NRep(1)));
        let (status, _) = parse_expr(status_init, &expr).ok().unwrap();

        assert_eq!(status.pos.col, 2);
        assert_eq!(status.pos.n, 2);
        assert_eq!(status.pos.row, 0);
    }
    {
        let status_init = Status::init("aaaaaa", &rules);
        let expr = repeat_literal("bb".to_string(), NRep(0), None);
        let (status, _) = parse_expr(status_init, &expr).ok().unwrap();

        assert_eq!(status.pos.col, 0);
        assert_eq!(status.pos.n, 0);
        assert_eq!(status.pos.row, 0);
    }
}

#[test]
fn test_parse_repeat_fail() {
    let rules = rules!{};
    let repeat_literal = |literal, min, max: Option<NRep>| {
        Expression::Repeat(RepInfo {
            expression: Box::new(Expression::Simple(Atom::Literal(literal))),
            min,
            max,
        })
    };

    {
        let status_init = Status::init("aaaaaa", &rules);
        let expr = repeat_literal("aa".to_string(), NRep(4), None);
        assert!(parse_expr(status_init, &expr).is_err());
    }
}