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 try_one_path_empty_list_fails() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = atom(b'a', &mut f);
let p = RewriteProcess::TryOnePath(vec![]);
assert!(rewrite(p, t, &mut f).is_empty());
}
#[test]
fn try_one_path_first_fires() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = star(empty(&mut f), &mut f);
let p = RewriteProcess::TryOnePath(vec![
rule_as_process(rule_star_empty()),
rule_as_process(rule_star_epsilon()),
]);
assert_eq!(rewrite(p, t, &mut f), vec![epsilon(&mut f)]);
}
#[test]
fn try_one_path_second_fires_when_first_fails() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = star(epsilon(&mut f), &mut f);
let p = RewriteProcess::TryOnePath(vec![
rule_as_process(rule_star_empty()),
rule_as_process(rule_star_epsilon()),
]);
assert_eq!(rewrite(p, t, &mut f), vec![epsilon(&mut f)]);
}
#[test]
fn try_one_path_all_fail() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = atom(b'a', &mut f);
let p = RewriteProcess::TryOnePath(vec![
rule_as_process(rule_star_empty()),
rule_as_process(rule_star_epsilon()),
rule_as_process(rule_double_star()),
]);
assert!(rewrite(p, t, &mut f).is_empty());
}
#[test]
fn try_one_path_earlier_wins_when_both_applicable() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = star(star(empty(&mut f), &mut f), &mut f);
let p_double_first = RewriteProcess::TryOnePath(vec![
rule_as_process(rule_double_star()),
rule_as_process(rule_star_empty()),
]);
let p_empty_first = RewriteProcess::TryOnePath(vec![
rule_as_process(rule_star_empty()),
rule_as_process(rule_double_star()),
]);
assert_eq!(
rewrite(p_double_first, t.clone(), &mut f),
vec![star(empty(&mut f), &mut f)]
);
assert_eq!(
rewrite(p_empty_first, t, &mut f),
vec![star(empty(&mut f), &mut f)]
);
}