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::*;
fn pipe(a: RewriteProcess<RegexOp>, b: RewriteProcess<RegexOp>) -> RewriteProcess<RegexOp> {
RewriteProcess::Pipe(Box::new(a), Box::new(b))
}
#[test]
fn pipe_both_fire() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = star(star(empty(&mut f), &mut f), &mut f);
let p = pipe(
rule_as_process(rule_double_star()),
rule_as_process(rule_star_empty()),
);
assert_eq!(rewrite(p, t, &mut f), vec![epsilon(&mut f)]);
}
#[test]
fn pipe_fails_when_first_fails() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = star(atom(b'a', &mut f), &mut f);
let p = pipe(
rule_as_process(rule_double_star()),
rule_as_process(rule_star_empty()),
);
assert!(rewrite(p, t, &mut f).is_empty());
}
#[test]
fn pipe_fails_when_second_fails() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = star(star(atom(b'a', &mut f), &mut f), &mut f);
let p = pipe(
rule_as_process(rule_double_star()),
rule_as_process(rule_star_empty()),
);
assert!(rewrite(p, t, &mut f).is_empty());
}
#[test]
fn pipe_three_steps() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = star(star(epsilon(&mut f), &mut f), &mut f);
let p = pipe(
pipe(
rule_as_process(rule_double_star()),
rule_as_process(rule_star_epsilon()),
),
rule_as_process(rule_concat_left_epsilon()),
);
assert!(rewrite(p, t, &mut f).is_empty());
}
#[test]
fn pipe_three_steps_all_fire() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = concat(epsilon(&mut f), epsilon(&mut f), &mut f);
let p = pipe(
rule_as_process(rule_concat_left_epsilon()),
rule_as_process(rule_star_empty()),
);
assert!(rewrite(p, t, &mut f).is_empty());
}