use super::*;
use std::collections::HashSet;
#[test]
fn incremental_delta_posting_lists_are_sorted() {
let content_a: Arc<[u8]> = Arc::from(b"fn alpha_one() {}".as_slice());
let content_b: Arc<[u8]> = Arc::from(b"fn beta_two() {}".as_slice());
let overlay1 = OverlayView::build(
0,
vec![
(PathBuf::from("a.rs"), Arc::clone(&content_a)),
(PathBuf::from("b.rs"), Arc::clone(&content_b)),
],
)
.unwrap();
let content_a2: Arc<[u8]> = Arc::from(b"fn alpha_changed() {}".as_slice());
let newly_changed: HashSet<PathBuf> = [PathBuf::from("a.rs")].into();
let removed: HashSet<PathBuf> = HashSet::new();
let overlay2 = OverlayView::build_incremental(
0,
&overlay1,
vec![(PathBuf::from("a.rs"), content_a2)],
&newly_changed,
&removed,
)
.unwrap();
for (hash, ids) in &overlay2.gram_index {
assert!(
ids.windows(2).all(|w| w[0] < w[1]),
"gram {hash:#x} posting list is not strictly sorted: {ids:?}"
);
}
}
#[test]
fn build_incremental_no_underflow() {
let content_a: Arc<[u8]> = Arc::from(b"fn alpha() {}".as_slice());
let overlay1 =
OverlayView::build(0, vec![(PathBuf::from("a.rs"), Arc::clone(&content_a))]).unwrap();
assert_eq!(overlay1.docs.len(), 1);
let newly_changed: HashSet<PathBuf> = [PathBuf::from("a.rs"), PathBuf::from("ghost.rs")].into();
let removed: HashSet<PathBuf> = HashSet::new();
let result = OverlayView::build_incremental(
1, &overlay1,
vec![],
&newly_changed,
&removed,
);
assert!(result.is_ok(), "must not panic or error");
assert_eq!(
result.unwrap().docs.len(),
0,
"all old docs are in newly_changed with no replacements → empty overlay"
);
}