repr 0.8.0

The regular-expression-as-linear-logic interpretation and its implementation
Documentation
use repr::wrappers::seq;

macro_rules! assert_regex_eq {
    ($expr:expr, $rhs:literal) => {
        assert_eq!($expr.to_regex_string(), $rhs)
    };
}

#[test]
fn to_regex_string() {
    assert_regex_eq!(seq(['a']), "a");
    assert_regex_eq!(seq(['a']).mul(seq(['b'])), "ab");
    assert_regex_eq!(seq(['a']).mul(seq(['b'])).mul(seq(['c'])), "abc");
    assert_regex_eq!(seq(['a', 'b']), "ab");
    assert_regex_eq!(seq(['a', 'b', 'c']), "abc");
    assert_regex_eq!(seq(['a']).or(seq(['b'])), "(a|b)");
    assert_regex_eq!(seq(['a']).or(seq(['b'])).or(seq(['c'])), "(a|(b|c))");
    assert_regex_eq!(seq(['a']).mul(seq(['b', 'c'])), "abc");
    assert_regex_eq!(seq(['a']).mul(seq(['b', 'c', 'd'])), "abcd");
    assert_regex_eq!(seq(['a', 'b']).mul(seq(['c'])), "abc");
    assert_regex_eq!(seq(['a', 'b', 'c']).mul(seq(['d'])), "abcd");
    assert_regex_eq!(seq(['a']).inf(), "a*");
    assert_regex_eq!(seq(['a']).cap(), "(a)");
    assert_regex_eq!(seq(['a']).mul(seq(['b'])).cap(), "(ab)");
    assert_regex_eq!(seq(['a']).inf().cap(), "(a*)");
}

#[test]
fn escape() {
    assert_regex_eq!(seq(['+']), "\\+");
    assert_regex_eq!(seq(['*']), "\\*");
    assert_regex_eq!(seq(['?']), "\\?");
    assert_regex_eq!(seq(['.']), "\\.");
    assert_regex_eq!(seq(['(']), "\\(");
    assert_regex_eq!(seq([')']), "\\)");
    assert_regex_eq!(seq(['[']), "\\[");
    assert_regex_eq!(seq([']']), "\\]");
    assert_regex_eq!(seq(['{']), "\\{");
    assert_regex_eq!(seq(['}']), "\\}");
    assert_regex_eq!(seq(['^']), "\\^");
    assert_regex_eq!(seq(['$']), "\\$");
    assert_regex_eq!(seq(['|']), "\\|");
    assert_regex_eq!(seq(['\\']), "\\\\");
}

macro_rules! assert_captures {
    ($expr:expr, $rhs:literal) => {
        assert!($expr.captures($rhs).is_some());
    };
}

macro_rules! assert_not_captures {
    ($expr:expr, $rhs:literal) => {
        assert!($expr.captures($rhs).is_none());
    };
}

#[test]
fn captures() {
    assert_captures!(seq(['a']), "a");
    assert_not_captures!(seq(['a']), "aa");
    assert_captures!(seq(['a']).mul(seq(['b'])), "ab");
    assert_captures!(seq(['a']).mul(seq(['b'])).mul(seq(['c'])), "abc");
    assert_captures!(seq(['a', 'b']), "ab");
    assert_captures!(seq(['a', 'b', 'c']), "abc");
    assert_captures!(seq(['a']).or(seq(['b'])), "a");
    assert_captures!(seq(['a']).or(seq(['b'])), "b");
    assert_captures!(seq(['a']).or(seq(['b'])).or(seq(['c'])), "a");
    assert_captures!(seq(['a']).or(seq(['b'])).or(seq(['c'])), "b");
    assert_captures!(seq(['a']).or(seq(['b'])).or(seq(['c'])), "c");
    assert_captures!(seq(['a']).mul(seq(['b', 'c'])), "abc");
    assert_captures!(seq(['a']).mul(seq(['b', 'c', 'd'])), "abcd");
    assert_captures!(seq(['a', 'b']).mul(seq(['c'])), "abc");
    assert_captures!(seq(['a', 'b', 'c']).mul(seq(['d'])), "abcd");
    assert_captures!(seq(['a']).inf(), "");
    assert_captures!(seq(['a']).inf(), "a");
    assert_captures!(seq(['a']).inf(), "aa");
    assert_captures!(seq(['a']).inf(), "aaa");
    assert_captures!(seq(['a']).cap(), "a");
    assert_captures!(seq(['a']).mul(seq(['b'])).cap(), "ab");
    assert_captures!(seq(['a']).inf().cap(), "a");
}