use regast::{Backend, PtKind, Regast, Span};
#[test]
fn finds_leftmost_longest_match_with_absolute_spans() {
let tree = Regast::new("(a|ab)")
.unwrap()
.find_parse("zababa")
.unwrap()
.unwrap();
assert_eq!(tree.flatten(), "ab");
assert_eq!(tree.match_span(), Span::new(1, 3));
assert_eq!(tree.group_all(1)[0].span, Span::new(1, 3));
assert!(matches!(
tree.walk()
.find(|node| matches!(node.kind, PtKind::AltTaken { .. }))
.unwrap()
.kind,
PtKind::AltTaken { arm: 1 }
));
}
#[test]
fn anchors_use_full_input_boundaries_during_search() {
assert!(
Regast::new("^ab")
.unwrap()
.find_parse("zab")
.unwrap()
.is_none()
);
let start = Regast::new("^ab")
.unwrap()
.find_parse("abz")
.unwrap()
.unwrap();
assert_eq!(start.match_span(), Span::new(0, 2));
let end = Regast::new("ab$")
.unwrap()
.find_parse("zab")
.unwrap()
.unwrap();
assert_eq!(end.match_span(), Span::new(1, 3));
let empty_end = Regast::new("$").unwrap().find_parse("é").unwrap().unwrap();
assert_eq!(empty_end.match_span(), Span::new(2, 2));
}
#[test]
fn alternate_backends_preserve_search_and_parse_semantics() {
for backend in [Backend::Antimirov, Backend::TaggedNfa] {
let regex = Regast::builder("^a|ab+$").backend(backend).build().unwrap();
assert!(regex.is_match("a"));
assert!(!regex.is_match("zab"));
let tree = regex.find_parse("zabbb").unwrap().unwrap();
assert_eq!(tree.flatten(), "abbb");
assert_eq!(tree.match_span(), Span::new(1, 5));
let anchored = Regast::builder("^([ab]+)$")
.backend(backend)
.build()
.unwrap()
.parse("abba")
.unwrap();
assert_eq!(anchored.flatten(), "abba");
assert_eq!(anchored.group_all(1)[0].span, Span::new(0, 4));
}
}