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_all_paths_empty_list_fails() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = atom(b'a', &mut f);
let p = RewriteProcess::TryAllPaths(vec![]);
assert!(rewrite(p, t, &mut f).is_empty());
}
#[test]
fn try_all_paths_all_fail() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = atom(b'a', &mut f);
let p = RewriteProcess::TryAllPaths(vec![
rule_as_process(rule_star_empty()),
rule_as_process(rule_star_epsilon()),
]);
assert!(rewrite(p, t, &mut f).is_empty());
}
#[test]
fn try_all_paths_one_fires() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = star(empty(&mut f), &mut f);
let p = RewriteProcess::TryAllPaths(vec![
rule_as_process(rule_star_empty()),
rule_as_process(rule_double_star()),
]);
assert_eq!(rewrite(p, t, &mut f), vec![epsilon(&mut f)]);
}
#[test]
fn try_all_paths_two_fire_distinct_results() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = alt(empty(&mut f), empty(&mut f), &mut f);
let p = RewriteProcess::TryAllPaths(vec![
rule_as_process(rule_alt_left_empty()),
rule_as_process(rule_alt_right_empty()),
]);
let result = rewrite(p, t, &mut f);
let e = empty(&mut f);
assert_eq!(result.len(), 2);
assert!(result.iter().all(|r| *r == e));
}
#[test]
fn try_all_paths_duplicates_not_removed() {
let mut f: TermFactory<RegexOp> = HConsign::empty();
let t = star(empty(&mut f), &mut f);
let p = RewriteProcess::TryAllPaths(vec![
rule_as_process(rule_star_empty()),
rule_as_process(rule_star_empty()),
]);
let result = rewrite(p, t, &mut f);
let e = epsilon(&mut f);
assert_eq!(result, vec![e.clone(), e]);
}