use super::highlight::segment_highlight;
use crate::color::Color;
const BASE: Color = Color::rgb(1.0, 1.0, 1.0);
const RUN: Color = Color::rgb(1.0, 0.0, 0.0);
fn assert_covers_once(text: &str, segs: &[(usize, usize, Color)]) {
let mut pos = 0usize;
for &(s, e, _) in segs {
assert_eq!(s, pos, "segment start must abut the previous end: {segs:?}");
assert!(e > s, "segment must be non-empty: {segs:?}");
pos = e;
}
assert_eq!(
pos,
text.len(),
"segments must cover the whole line: {segs:?}"
);
}
#[test]
fn segment_highlight_fills_gaps_and_runs_once() {
let text = "let x = 1;";
let spans = [(0usize, 3usize, RUN), (8usize, 9usize, RUN)];
let segs = segment_highlight(text, &spans, BASE);
assert_covers_once(text, &segs);
assert_eq!(
segs,
vec![
(0, 3, RUN), (3, 8, BASE), (8, 9, RUN), (9, 10, BASE), ]
);
}
#[test]
fn segment_highlight_no_spans_is_single_base_run() {
let text = "plain";
let segs = segment_highlight(text, &[], BASE);
assert_eq!(segs, vec![(0, 5, BASE)]);
}
#[test]
fn segment_highlight_drops_invalid_and_resolves_overlap() {
let text = "abcdef";
let spans = [
(2usize, 2usize, RUN), (4usize, 3usize, RUN), (0usize, 10usize, RUN), (0usize, 3usize, RUN), (2usize, 5usize, BASE), ];
let segs = segment_highlight(text, &spans, BASE);
assert_covers_once(text, &segs);
assert_eq!(segs, vec![(0, 3, RUN), (3, 5, BASE), (5, 6, BASE)]);
}
#[test]
fn segment_highlight_empty_text_is_empty() {
assert!(segment_highlight("", &[(0, 0, RUN)], BASE).is_empty());
}