mod common;
use hashconsing::HConsign;
use simple_term_rewriter::process::strategy::{DepthOrder, RewriteProcess, SiblingOrder};
use simple_term_rewriter::term::syntax::TermFactory;
use common::regex::constructors::*;
use common::regex::lang::RegexOp;
use common::regex::rules::*;
#[test]
fn repeat_never_fires_returns_original() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = atom(b'a', &mut f);
let p = RewriteProcess::Repeat(Box::new(RewriteProcess::Rule(Box::new(rule_double_star()))));
assert_eq!(rewrite(p, t.clone(), &mut f), vec![t]);
}
#[test]
fn repeat_single_step_to_fixpoint() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = star(empty(&mut f), &mut f);
let p = RewriteProcess::Repeat(Box::new(RewriteProcess::Rule(Box::new(rule_star_empty()))));
assert_eq!(rewrite(p, t, &mut f), vec![epsilon(&mut f)]);
}
#[test]
fn repeat_multi_step_double_star() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = star(
star(star(star(atom(b'a', &mut f), &mut f), &mut f), &mut f),
&mut f,
);
let p = RewriteProcess::Repeat(Box::new(RewriteProcess::Rule(Box::new(rule_double_star()))));
assert_eq!(
rewrite(p, t, &mut f),
vec![star(atom(b'a', &mut f), &mut f)]
);
}
#[test]
fn repeat_with_try_all_paths_explores_every_branch_to_fixpoint() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = alt(empty(&mut f), empty(&mut f), &mut f);
let p = RewriteProcess::Repeat(Box::new(RewriteProcess::TryAllPaths(vec![
rule_as_process(rule_alt_left_empty()),
rule_as_process(rule_alt_right_empty()),
])));
assert_eq!(rewrite(p, t, &mut f), vec![empty(&mut f), empty(&mut f)]);
}
#[test]
fn repeat_with_try_all_paths_reduces_each_branch_independently() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = star(empty(&mut f), &mut f);
let p = RewriteProcess::Repeat(Box::new(RewriteProcess::TryAllPaths(vec![
rule_as_process(rule_star_empty()),
rule_as_process(rule_star_empty()),
])));
assert_eq!(
rewrite(p, t, &mut f),
vec![epsilon(&mut f), epsilon(&mut f)]
);
}
#[test]
fn repeat_with_anychild_normalizes_term() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = concat(
star(star(atom(b'a', &mut f), &mut f), &mut f),
concat(
epsilon(&mut f),
star(star(atom(b'b', &mut f), &mut f), &mut f),
&mut f,
),
&mut f,
);
let one_step = RewriteProcess::AnyChild(
SiblingOrder::Leftmost,
DepthOrder::Innermost,
Box::new(RewriteProcess::Rule(Box::new(rule_double_star()))),
);
let p = RewriteProcess::Repeat(Box::new(one_step));
let expected = concat(
star(atom(b'a', &mut f), &mut f),
concat(epsilon(&mut f), star(atom(b'b', &mut f), &mut f), &mut f),
&mut f,
);
assert_eq!(rewrite(p, t, &mut f), vec![expected]);
}