use super::auto_ef::auto_ef_range;
#[test]
fn test_auto_ef_range_small_collection_low_dim() {
let (min_ef, max_ef) = auto_ef_range(500, 128, 10);
assert_eq!(min_ef, 20);
assert_eq!(max_ef, 80);
}
#[test]
fn test_auto_ef_range_small_collection_high_dim() {
let (min_ef, max_ef) = auto_ef_range(500, 768, 10);
assert_eq!(min_ef, 30);
assert_eq!(max_ef, 120);
}
#[test]
fn test_auto_ef_range_medium_collection_low_dim() {
let (min_ef, max_ef) = auto_ef_range(5_000, 256, 10);
assert_eq!(min_ef, 40);
assert_eq!(max_ef, 160);
}
#[test]
fn test_auto_ef_range_medium_collection_high_dim() {
let (min_ef, max_ef) = auto_ef_range(5_000, 768, 10);
assert_eq!(min_ef, 60);
assert_eq!(max_ef, 240);
}
#[test]
fn test_auto_ef_range_large_collection() {
let (min_ef, max_ef) = auto_ef_range(50_000, 768, 10);
assert_eq!(min_ef, 120);
assert_eq!(max_ef, 480);
}
#[test]
fn test_auto_ef_range_very_large_collection() {
let (min_ef, max_ef) = auto_ef_range(500_000, 768, 10);
assert_eq!(min_ef, 180);
assert_eq!(max_ef, 720);
}
#[test]
fn test_auto_ef_range_empty_collection() {
let (min_ef, max_ef) = auto_ef_range(0, 128, 10);
assert_eq!(min_ef, 20);
assert_eq!(max_ef, 80);
}
#[test]
fn test_auto_ef_range_min_ef_at_least_k() {
let (min_ef, _) = auto_ef_range(100, 128, 100);
assert!(min_ef >= 100, "min_ef must be at least k");
}
#[test]
fn test_auto_ef_range_k_larger_than_base() {
let (min_ef, max_ef) = auto_ef_range(100, 128, 500);
assert_eq!(min_ef, 1000);
assert_eq!(max_ef, 4000);
}
#[test]
fn test_auto_ef_range_dimension_boundary() {
let (min_512, _) = auto_ef_range(5_000, 512, 10);
let (min_513, _) = auto_ef_range(5_000, 513, 10);
assert!(
min_513 > min_512,
"dim > 512 should produce a higher min_ef"
);
}
#[test]
fn test_auto_ef_range_max_ef_is_four_times_min() {
for &(count, dim, k) in &[
(100, 128, 10),
(5_000, 768, 20),
(50_000, 1536, 50),
(500_000, 384, 10),
] {
let (min_ef, max_ef) = auto_ef_range(count, dim, k);
assert_eq!(
max_ef,
min_ef * 4,
"max_ef should be 4x min_ef for count={count}, dim={dim}, k={k}"
);
}
}