use super::regex_table::{RegexTableBuilder, deserialize_dfa};
use plotnik_bytecode::StringId;
use regex_automata::Input;
use regex_automata::dfa::Automaton;
#[test]
fn intern_and_lookup() {
let mut builder = RegexTableBuilder::new();
let str1 = StringId::new(1);
let str2 = StringId::new(2);
let id1 = builder.intern("foo", str1).unwrap();
let id2 = builder.intern("bar", str2).unwrap();
let id3 = builder.intern("foo", str1).unwrap();
assert_eq!(id1, 1); assert_eq!(id2, 2);
assert_eq!(id3, id1);
assert_eq!(builder.get(str1), Some(1));
assert_eq!(builder.get(str2), Some(2));
assert_eq!(builder.get(StringId::new(99)), None);
}
#[test]
fn emit_and_deserialize() {
let mut builder = RegexTableBuilder::new();
builder.intern("hello", StringId::new(1)).unwrap();
builder.intern("world", StringId::new(2)).unwrap();
let (blob, table) = builder.emit();
assert_eq!(table.len(), 4 * 8);
let string_id1 = u16::from_le_bytes([table[8], table[9]]);
let offset1 = u32::from_le_bytes([table[12], table[13], table[14], table[15]]) as usize;
let offset2 = u32::from_le_bytes([table[20], table[21], table[22], table[23]]) as usize;
assert_eq!(string_id1, 1);
let dfa1 = deserialize_dfa(&blob[offset1..offset2]).unwrap();
assert!(
dfa1.try_search_fwd(&Input::new("hello"))
.ok()
.flatten()
.is_some()
);
assert!(
dfa1.try_search_fwd(&Input::new("world"))
.ok()
.flatten()
.is_none()
);
}
#[test]
fn escaped_slash_pattern() {
let mut builder = RegexTableBuilder::new();
let id = builder.intern(r"a\/b", StringId::new(1)).unwrap();
assert_eq!(id, 1);
let (blob, table) = builder.emit();
let offset1 = u32::from_le_bytes([table[12], table[13], table[14], table[15]]) as usize;
let offset2 = u32::from_le_bytes([table[20], table[21], table[22], table[23]]) as usize;
let dfa = deserialize_dfa(&blob[offset1..offset2]).unwrap();
assert!(
dfa.try_search_fwd(&Input::new("a/b"))
.ok()
.flatten()
.is_some()
);
assert!(
dfa.try_search_fwd(&Input::new("ab"))
.ok()
.flatten()
.is_none()
);
}
#[test]
fn empty_builder() {
let builder = RegexTableBuilder::new();
assert!(builder.is_empty());
assert_eq!(builder.len(), 1); }