use crate::{
alloc::{
boxed::Box,
sync::Arc,
vec::Vec,
},
spanners::{
SpanRef,
TextSpanner,
span_lexers::{
LexerTextSpanner,
SpanLexer,
},
},
};
pub fn common_lexer_tests(lexer: Box<dyn SpanLexer>) {
let spans: Vec<_> = lexer.find_span_iter("").collect();
assert!(spans.is_empty(), "find_span_iter(\"\") should be empty");
let spans: Vec<_> = lexer.find_span_iter("hello world").collect();
assert!(
!spans.is_empty(),
"find_span_iter(\"hello world\") should produce spans"
);
assert_eq!(spans[0].start, 0, "first span should start at byte 0");
for pair in spans.windows(2) {
assert!(
pair[0].end <= pair[1].start,
"spans should not overlap: {:?} vs {:?}",
pair[0],
pair[1]
);
}
let spanner = LexerTextSpanner::new(Arc::from(lexer), None);
let spans = spanner.split_spans("", None);
assert!(spans.is_empty(), "split_spans(\"\") should be empty");
let spans = spanner.split_spans(" ", None);
assert!(
!spans.is_empty(),
"split_spans(\" \") should produce spans for whitespace"
);
assert_eq!(
spans,
crate::alloc::vec![SpanRef::Word(0..3)],
"whitespace-only input should produce a single Word(0..3)"
);
}