#![forbid(unsafe_code)]
#[cfg(test)]
mod tests {
use crate::{FseMap, Rule, FseOpcode, FseScanner, Violation};
#[test]
fn test_basic_match_record() {
let rules = vec![
Rule::new("apple", FseOpcode::Record(1)),
Rule::new("banana", FseOpcode::Record(2)),
];
let map = FseMap::compile(rules).unwrap();
let mut scanner = FseScanner::new(&map).unwrap();
let input = b"I like apple and banana splits.";
let summary = scanner.scan(input).unwrap();
assert_eq!(summary.pattern_hits, 2);
assert_eq!(summary.rules_recorded, 2);
}
#[test]
fn test_fail_closed_reject() {
let rules = vec![
Rule::new("safe", FseOpcode::Record(1)),
Rule::new("DANGER", FseOpcode::Reject(99)),
];
let map = FseMap::compile(rules).unwrap();
let mut scanner = FseScanner::new(&map).unwrap();
let input = b"This is safe but DANGER resides here.";
let result = scanner.scan(input);
match result {
Err(Violation::PolicyReject { rule_id, span, .. }) => {
assert_eq!(rule_id, 99);
assert_eq!(&input[span], b"DANGER");
}
_ => panic!("Should have rejected!"),
}
}
#[test]
fn test_overlapping_matches() {
let rules = vec![
Rule::new("he", FseOpcode::Record(1)),
Rule::new("she", FseOpcode::Record(2)),
Rule::new("hers", FseOpcode::Record(3)),
];
let map = FseMap::compile(rules).unwrap();
let mut scanner = FseScanner::new(&map).unwrap();
let input = b"ushers";
let summary = scanner.scan(input).unwrap();
assert!(summary.pattern_hits >= 3);
}
}