50 lines
1.7 KiB
Rust
50 lines
1.7 KiB
Rust
#[cfg(test)]
|
|
mod tests {
|
|
use crate::vault::vault_recall_raw;
|
|
use crate::versor::normalize_to_versor_raw;
|
|
|
|
fn random_versor(seed: u64) -> [f32; 32] {
|
|
let mut state = seed ^ 0xdeadbeef_cafebabe;
|
|
let mut raw = [0f32; 32];
|
|
for x in raw.iter_mut() {
|
|
state = state.wrapping_mul(6364136223846793005).wrapping_add(1442695040888963407);
|
|
*x = ((state >> 33) as f32) / (u32::MAX as f32) * 2.0 - 1.0;
|
|
}
|
|
normalize_to_versor_raw(&raw).expect("normalize failed")
|
|
}
|
|
|
|
#[test]
|
|
fn test_recall_self() {
|
|
let versors: Vec<[f32; 32]> = (0..20).map(|i| random_versor(i as u64)).collect();
|
|
for (i, query) in versors.iter().enumerate() {
|
|
let results = vault_recall_raw(&versors, query, 1).unwrap();
|
|
assert_eq!(results[0].0, i,
|
|
"Versor {} should recall itself as top-1, got {}", i, results[0].0);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_empty_vault() {
|
|
let query = random_versor(0);
|
|
let results = vault_recall_raw(&[], &query, 5).unwrap();
|
|
assert!(results.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_top_k_count() {
|
|
let versors: Vec<[f32; 32]> = (0..10).map(|i| random_versor(i as u64)).collect();
|
|
let query = random_versor(99);
|
|
let results = vault_recall_raw(&versors, &query, 3).unwrap();
|
|
assert_eq!(results.len(), 3);
|
|
}
|
|
|
|
#[test]
|
|
fn test_scores_descending() {
|
|
let versors: Vec<[f32; 32]> = (0..10).map(|i| random_versor(i as u64)).collect();
|
|
let query = random_versor(99);
|
|
let results = vault_recall_raw(&versors, &query, 5).unwrap();
|
|
for w in results.windows(2) {
|
|
assert!(w[0].1 >= w[1].1, "Scores not descending");
|
|
}
|
|
}
|
|
}
|