use rules::unicode::regex::PERLS;
use rules::parse::Ast::*;
use rules::parse::Membership::*;
use rules::parse::Op::*;
use rules::range_set;
use super::parse;
use super::new_deque;
#[test]
fn chars() {
let set = vec![Char('a'), Char('b'), Char('c')].into();
let deque = new_deque(vec![Set(set, Inclusive)]);
assert_eq!(vec![Class(deque)], parse(r"< [ abc ] >"));
}
#[test]
fn with_ops() {
let set_a = vec![Char('a')].into();
let set_b = vec![Char('b')].into();
let deque = new_deque(vec![Set(set_a, Inclusive),
Op(Union),
Set(set_b, Inclusive)]);
assert_eq!(vec![Class(deque)], parse(r"< [ a ] + [ b ] >"));
}
#[test]
fn pre_op() {
let set = vec![Char('a')].into();
let deque = new_deque(vec![Empty,
Op(Difference),
Set(set, Inclusive)]);
assert_eq!(vec![Class(deque)], parse(r"< - [ a ] >"));
}
#[test]
fn post_op() {
let set = vec![Char('a')].into();
let deque = new_deque(vec![Set(set, Inclusive),
Op(Union),
Empty]);
assert_eq!(vec![Class(deque)], parse(r"< [ a ] + >"));
}
#[test]
fn ellipsis() {
let set = vec![Range(range_set::Range('a','d'))].into();
let deque = new_deque(vec![Set(set, Inclusive)]);
assert_eq!(vec![Class(deque)], parse(r"< [ a .. d ] >"));
}
#[test]
fn escape_chars() {
let deque1 = new_deque(vec![Set(PERLS.into(), Inclusive)]);
assert_eq!(vec![Class(deque1)], parse(r"< [ \s ] >"));
let deque2 = new_deque(vec![Set(range_set::Set::new(), Exclusive)]);
assert_eq!(vec![Class(deque2)], parse(r"< [ \s \S ] >"));
}
#[test]
fn unicode() {
let set = vec![Char('a'), Char('こ')].into();
let deque = new_deque(vec![Set(set, Inclusive)]);
assert_eq!(vec![Class(deque)], parse(r"< [ a こ ] >"));
}
#[test]
fn multiple_char_classes() {
let set_a = vec![Char('a')].into();
let set_c = vec![Char('c')].into();
let deque_a = new_deque(vec![Set(set_a, Inclusive)]);
let deque_c = new_deque(vec![Set(set_c, Inclusive)]);
assert_eq!(vec![Class(deque_a),
Char('b'),
Class(deque_c)], parse(r"<[ a ]> b <[ c ]>"));
}