tests/mimir_fusion.rs
//! Integration proof for the Mimir RRF hybrid-fusion (optimize cycle 1).
//!
//! Mirrors the red-when-broken unit tests in `src/knowledge/fusion.rs` against the
//! PUBLIC API, so the guard runs even in a worktree whose inline `#[cfg(test)]`
//! build is blocked by an unrelated sibling-crate churn. The properties proven:
//! consensus beats a single-list #1, and hybrid recall dominates either engine —
//! exactly the behaviour the `nornir.mimir.search.hybrid_rrf_*` bench measures
//! (recall dense 50% → hybrid 100%).
use nornir::knowledge::fusion::{DEFAULT_RRF_K, fuse_bm25_dense, recall_at_k};
fn keys(v: &[&str]) -> Vec<String> {
v.iter().map(|s| s.to_string()).collect()
}
#[test]
fn consensus_beats_single_list_number_one() {
let bm25 = keys(&["A", "consensus"]);
let dense = keys(&["X", "consensus"]);
let fused = fuse_bm25_dense(&bm25, &dense, 1.0, 1.0, DEFAULT_RRF_K, 0);
assert_eq!(
fused[0], "consensus",
"decent-in-both tops single-list #1s: {fused:?}"
);
}
#[test]
fn hybrid_recall_dominates_each_single_engine() {
// r1 buried by dense, r3 buried by bm25 — neither top-3 covers all; RRF does.
let relevant = keys(&["r1", "r2", "r3"]);
let bm25 = keys(&["r1", "r2", "n1", "n2", "r3"]);
let dense = keys(&["r3", "r2", "n3", "n4", "r1"]);
let k = 3;
let r_bm25 = recall_at_k(&bm25, &relevant, k);
let r_dense = recall_at_k(&dense, &relevant, k);
let fused = fuse_bm25_dense(&bm25, &dense, 1.0, 1.0, DEFAULT_RRF_K, 0);
let r_fused = recall_at_k(&fused, &relevant, k);
assert!(
r_fused >= r_bm25 && r_fused >= r_dense && (r_fused > r_bm25 || r_fused > r_dense),
"hybrid recall {r_fused} must dominate bm25 {r_bm25}/dense {r_dense}; fused={fused:?}"
);
}