use super::params::*;
use crate::quantization::StorageMode;
#[test]
fn test_hnsw_params_default() {
let params = HnswParams::default();
assert_eq!(params.max_connections, 32); assert_eq!(params.ef_construction, 400);
}
#[test]
fn test_hnsw_params_auto_small_dimension() {
let params = HnswParams::auto(128);
assert_eq!(params.max_connections, 24); assert_eq!(params.ef_construction, 300);
}
#[test]
fn test_hnsw_params_auto_large_dimension() {
let params = HnswParams::auto(1024);
assert_eq!(params.max_connections, 32); assert_eq!(params.ef_construction, 400);
}
#[test]
fn test_hnsw_params_fast() {
let params = HnswParams::fast();
assert_eq!(params.max_connections, 16);
assert_eq!(params.ef_construction, 150);
assert_eq!(params.max_elements, 100_000);
}
#[test]
fn test_hnsw_params_high_recall() {
let params = HnswParams::high_recall(768);
assert_eq!(params.max_connections, 40); assert_eq!(params.ef_construction, 600); }
#[test]
fn test_hnsw_params_large_dataset() {
let params = HnswParams::large_dataset(768);
assert_eq!(params.max_connections, 128);
assert_eq!(params.ef_construction, 2000);
assert_eq!(params.max_elements, 750_000);
}
#[test]
fn test_hnsw_params_for_dataset_size_small() {
let params = HnswParams::for_dataset_size(768, 5_000);
assert_eq!(params.max_connections, 32);
assert_eq!(params.ef_construction, 400);
assert_eq!(params.max_elements, 20_000);
}
#[test]
fn test_hnsw_params_for_dataset_size_medium() {
let params = HnswParams::for_dataset_size(768, 50_000);
assert_eq!(params.max_connections, 128);
assert_eq!(params.ef_construction, 1600);
assert_eq!(params.max_elements, 150_000);
}
#[test]
fn test_hnsw_params_for_dataset_size_large() {
let params = HnswParams::for_dataset_size(768, 300_000);
assert_eq!(params.max_connections, 128);
assert_eq!(params.ef_construction, 2000);
assert_eq!(params.max_elements, 750_000);
}
#[test]
fn test_hnsw_params_million_scale() {
let params = HnswParams::million_scale(768);
assert_eq!(params.max_connections, 128);
assert_eq!(params.ef_construction, 1600);
assert_eq!(params.max_elements, 1_500_000);
}
#[test]
fn test_hnsw_params_max_recall_small() {
let params = HnswParams::max_recall(128);
assert_eq!(params.max_connections, 32);
assert_eq!(params.ef_construction, 500);
}
#[test]
fn test_hnsw_params_max_recall_medium() {
let params = HnswParams::max_recall(512);
assert_eq!(params.max_connections, 48);
assert_eq!(params.ef_construction, 800);
}
#[test]
fn test_hnsw_params_max_recall_large() {
let params = HnswParams::max_recall(1024);
assert_eq!(params.max_connections, 64);
assert_eq!(params.ef_construction, 1000);
}
#[test]
fn test_hnsw_params_fast_indexing() {
let params = HnswParams::fast_indexing(768);
assert_eq!(params.max_connections, 16); assert_eq!(params.ef_construction, 200); }
#[test]
fn test_hnsw_params_custom() {
let params = HnswParams::custom(32, 400, 50_000);
assert_eq!(params.max_connections, 32);
assert_eq!(params.ef_construction, 400);
assert_eq!(params.max_elements, 50_000);
assert_eq!(params.storage_mode, StorageMode::Full);
}
#[test]
fn test_hnsw_params_with_sq8() {
let params = HnswParams::with_sq8(768);
assert_eq!(params.storage_mode, StorageMode::SQ8);
assert_eq!(params.max_connections, 32); assert_eq!(params.ef_construction, 400);
}
#[test]
fn test_hnsw_params_with_binary() {
let params = HnswParams::with_binary(768);
assert_eq!(params.storage_mode, StorageMode::Binary);
assert_eq!(params.max_connections, 32);
}
#[test]
fn test_hnsw_params_storage_mode_default() {
let params = HnswParams::default();
assert_eq!(params.storage_mode, StorageMode::Full);
}
#[test]
fn test_search_quality_ef_search() {
assert_eq!(SearchQuality::Fast.ef_search(10), 64);
assert_eq!(SearchQuality::Balanced.ef_search(10), 128);
assert_eq!(SearchQuality::Accurate.ef_search(10), 512);
assert_eq!(SearchQuality::Custom(50).ef_search(10), 50);
}
#[test]
fn test_search_quality_perfect_ef_search() {
assert_eq!(SearchQuality::Perfect.ef_search(10), 4096); assert_eq!(SearchQuality::Perfect.ef_search(50), 5000); assert_eq!(SearchQuality::Perfect.ef_search(100), 10000); }
#[test]
fn test_search_quality_ef_search_high_k() {
assert_eq!(SearchQuality::Fast.ef_search(100), 200); assert_eq!(SearchQuality::Balanced.ef_search(50), 200); assert_eq!(SearchQuality::Accurate.ef_search(40), 640); assert_eq!(SearchQuality::Perfect.ef_search(50), 5000); }
#[test]
fn test_search_quality_perfect_serialize_deserialize() {
let quality = SearchQuality::Perfect;
let json = serde_json::to_string(&quality).unwrap();
let deserialized: SearchQuality = serde_json::from_str(&json).unwrap();
assert_eq!(quality, deserialized);
}
#[test]
fn test_search_quality_default() {
let quality = SearchQuality::default();
assert_eq!(quality, SearchQuality::Balanced);
}
#[test]
fn test_hnsw_params_turbo() {
let params = HnswParams::turbo();
assert_eq!(params.max_connections, 12);
assert_eq!(params.ef_construction, 100);
assert_eq!(params.max_elements, 100_000);
assert_eq!(params.storage_mode, StorageMode::Full);
}
#[test]
fn test_hnsw_params_serialize_deserialize() {
let params = HnswParams::custom(32, 400, 50_000);
let json = serde_json::to_string(¶ms).unwrap();
let deserialized: HnswParams = serde_json::from_str(&json).unwrap();
assert_eq!(params, deserialized);
}
#[test]
fn test_search_quality_serialize_deserialize() {
let quality = SearchQuality::Custom(100);
let json = serde_json::to_string(&quality).unwrap();
let deserialized: SearchQuality = serde_json::from_str(&json).unwrap();
assert_eq!(quality, deserialized);
}
#[test]
fn test_hnsw_params_for_dataset_size_100k_768d() {
let params = HnswParams::for_dataset_size(768, 100_000);
assert_eq!(params.max_connections, 128);
assert_eq!(params.ef_construction, 1600);
}
#[test]
fn test_hnsw_params_for_dataset_size_500k_768d() {
let params = HnswParams::for_dataset_size(768, 500_000);
assert_eq!(params.max_connections, 128);
assert_eq!(params.ef_construction, 2000);
}