mod common;
use hashconsing::HConsign;
use simple_term_rewriter::process::strategy::RewriteProcess;
use simple_term_rewriter::term::syntax::TermFactory;
use common::regex::constructors::*;
use common::regex::lang::RegexOp;
use common::regex::rules::*;
#[test]
fn rule_fires_at_root() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = star(empty(&mut f), &mut f);
let result = rewrite(RewriteProcess::Rule(Box::new(rule_star_empty())), t, &mut f);
assert_eq!(result, vec![epsilon(&mut f)]);
}
#[test]
fn rule_does_not_fire_at_root_wrong_operator() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = concat(empty(&mut f), epsilon(&mut f), &mut f);
let result = rewrite(
RewriteProcess::Rule(Box::new(rule_star_empty())),
t.clone(),
&mut f,
);
assert!(result.is_empty());
}
#[test]
fn rule_does_not_descend_into_sub_terms() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = alt(star(empty(&mut f), &mut f), epsilon(&mut f), &mut f);
let result = rewrite(RewriteProcess::Rule(Box::new(rule_star_empty())), t, &mut f);
assert!(result.is_empty());
}
#[test]
fn rule_on_leaf_term_no_match() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = atom(b'a', &mut f);
let result = rewrite(RewriteProcess::Rule(Box::new(rule_star_empty())), t, &mut f);
assert!(result.is_empty());
}
#[test]
fn rule_concat_left_epsilon_fires() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = concat(epsilon(&mut f), atom(b'a', &mut f), &mut f);
let result = rewrite(
RewriteProcess::Rule(Box::new(rule_concat_left_epsilon())),
t,
&mut f,
);
assert_eq!(result, vec![atom(b'a', &mut f)]);
}