extern crate enum_set;
extern crate pcre;
use enum_set::{EnumSet};
use pcre::{CompileOption, Pcre, StudyOption};
#[test]
#[should_panic]
fn test_compile_nul() {
drop(Pcre::compile("\0abc"));
}
#[test]
fn test_compile_bad_pattern() {
let err = Pcre::compile("[").unwrap_err();
assert_eq!(err.offset(), 1);
}
#[test]
#[should_panic]
fn test_compile_bad_pattern2() {
Pcre::compile("[").unwrap(); }
#[test]
fn test_compile_capture_count() {
let re = Pcre::compile("(?:abc)(def)").unwrap();
assert_eq!(re.capture_count(), 1);
}
#[test]
fn test_exec_basic() {
let mut re = Pcre::compile("^...$").unwrap();
assert_eq!(re.capture_count(), 0);
let m = re.exec("abc").unwrap();
assert_eq!(m.group(0), "abc");
}
#[test]
fn test_exec_no_match() {
let mut re = Pcre::compile("abc").unwrap();
assert!(re.exec("def").is_none());
}
#[test]
fn test_exec_nul_byte() {
let mut re = Pcre::compile("abc\\0def").unwrap();
let m = re.exec("abc\0def").unwrap();
assert_eq!(m.group(0), "abc\0def");
}
#[test]
fn test_exec_from_basic() {
let mut re = Pcre::compile("abc").unwrap();
let subject = "abcabc";
let m1 = re.exec_from(subject, 1).unwrap();
assert_eq!(m1.group_start(0), 3);
assert_eq!(m1.group_end(0), 6);
assert_eq!(m1.group_len(0), 3);
let m2 = re.exec(subject).unwrap();
assert_eq!(m2.group_start(0), 0);
}
#[test]
fn test_study_basic() {
let mut re = Pcre::compile("abc").unwrap();
let mut study_res = re.study();
assert!(study_res);
study_res = re.study();
assert!(study_res);
study_res = re.study();
assert!(study_res);
}
#[test]
fn test_matches_basic() {
let subject = "\0abc1111abcabc___ababc+a";
let mut re = Pcre::compile("abc").unwrap();
let mut it = re.matches(subject);
let mut opt_m = it.next();
assert!(opt_m.is_some());
let mut m = opt_m.unwrap();
assert_eq!(m.group_start(0), 1);
assert_eq!(m.group_end(0), 4);
let opt_m2 = it.next();
assert!(opt_m2.is_some());
let m2 = opt_m2.unwrap();
assert_eq!(m2.group_start(0), 8);
assert_eq!(m2.group_end(0), 11);
assert_eq!(m.group_start(0), 1);
assert_eq!(m.group_end(0), 4);
opt_m = it.next();
assert!(opt_m.is_some());
m = opt_m.unwrap();
assert_eq!(m.group_start(0), 11);
assert_eq!(m.group_end(0), 14);
opt_m = it.next();
assert!(opt_m.is_some());
m = opt_m.unwrap();
assert_eq!(m.group_start(0), 19);
assert_eq!(m.group_end(0), 22);
opt_m = it.next();
assert!(opt_m.is_none());
}
#[test]
fn test_extra_mark() {
let pattern = "X(*MARK:A)Y|X(*MARK:B)Z";
let subject1 = "XY";
let subject2 = "XZ";
let mut compile_options: EnumSet<CompileOption> = EnumSet::new();
compile_options.insert(CompileOption::Extra);
let mut re = Pcre::compile_with_options(pattern, &compile_options).unwrap();
assert_eq!(re.mark(), None);
let mut study_options: EnumSet<StudyOption> = EnumSet::new();
study_options.insert(StudyOption::StudyJitCompile);
let study = re.study_with_options(&study_options);
assert!(study);
assert_eq!(re.mark(), None);
let extra = re.enable_mark();
assert!(extra);
assert_eq!(re.mark(), None);
let opt_m1 = re.exec(subject1);
assert!(opt_m1.is_some());
let m1 = opt_m1.unwrap();
assert_eq!(m1.group(0), "XY");
let mark1 = re.mark();
assert!(mark1.is_some());
assert_eq!(mark1.unwrap(), "A");
let opt_m2 = re.exec(subject2);
assert!(opt_m2.is_some());
let m2 = opt_m2.unwrap();
assert_eq!(m2.group(0), "XZ");
assert_eq!(re.mark().unwrap(), "B");
}
#[test]
fn test_optional_capture() {
let mut re = Pcre::compile("(foo)?bar").unwrap();
let subject = "bar";
let m1 = re.exec(subject).unwrap();
assert!(m1.group_start(0) == 0 && m1.group_end(0) == 3 && m1.group_len(0) == 3); assert_eq!(m1.group_len(1), 0);
assert_eq!(m1.group_start(1), usize::max_value()); assert_eq!(m1.group_end(1), usize::max_value()); }