#[cfg(test)]
mod tests {
use crate::config::ShardexConfig;
use crate::shardex::{Shardex, ShardexImpl};
use crate::test_utils::TestEnvironment;
use std::time::Duration;
#[tokio::test]
async fn test_enhanced_index_stats() {
let _env = TestEnvironment::new("test_enhanced_index_stats");
let config = ShardexConfig::new()
.directory_path(_env.path())
.vector_size(128)
.shard_size(100);
let shardex = ShardexImpl::new(config).unwrap();
let stats = shardex.stats().await.unwrap();
assert_eq!(stats.total_shards, 0); assert_eq!(stats.total_postings, 0);
assert_eq!(stats.vector_dimension, 128);
assert_eq!(stats.search_latency_p50, Duration::ZERO);
assert_eq!(stats.search_latency_p95, Duration::ZERO);
assert_eq!(stats.search_latency_p99, Duration::ZERO);
assert_eq!(stats.write_throughput, 0.0);
assert_eq!(stats.bloom_filter_hit_rate, 0.0);
assert_eq!(stats.search_latency_p50_ms(), 0);
assert_eq!(stats.bloom_filter_hit_rate_percent(), 0.0);
assert!(stats.is_performance_healthy());
println!("IndexStats display: {}", stats);
}
#[tokio::test]
async fn test_detailed_stats() {
let _env = TestEnvironment::new("test_detailed_stats");
let config = ShardexConfig::new()
.directory_path(_env.path())
.vector_size(256)
.shard_size(50);
let shardex = ShardexImpl::new(config).unwrap();
let detailed_stats = shardex.detailed_stats().await.unwrap();
assert_eq!(detailed_stats.total_shards, 0);
assert_eq!(detailed_stats.vector_dimension, 256);
assert_eq!(detailed_stats.search_latency_p50, Duration::ZERO);
assert_eq!(detailed_stats.write_throughput, 0.0);
assert_eq!(detailed_stats.bloom_filter_hit_rate, 0.0);
assert_eq!(detailed_stats.memory_mapped_regions, 0); assert_eq!(detailed_stats.wal_segment_count, 0);
assert!(detailed_stats.file_descriptor_count >= 10); assert_eq!(detailed_stats.active_connections, 1);
assert!(detailed_stats.uptime > Duration::ZERO);
assert_eq!(detailed_stats.total_operations, 0);
println!("DetailedIndexStats uptime: {:?}", detailed_stats.uptime);
println!("DetailedIndexStats FD count: {}", detailed_stats.file_descriptor_count);
}
#[tokio::test]
async fn test_search_performance_monitoring() {
let _env = TestEnvironment::new("test_search_performance_monitoring");
let config = ShardexConfig::new()
.directory_path(_env.path())
.vector_size(128);
let shardex = ShardexImpl::new(config).unwrap();
let query_vector = vec![0.5; 128];
let _search_result = shardex.search(&query_vector, 10, None).await;
let stats = shardex.stats().await.unwrap();
println!("Stats after search: {}", stats);
assert_eq!(stats.vector_dimension, 128);
assert_eq!(stats.total_shards, 0); }
#[tokio::test]
async fn test_index_stats_builder_pattern() {
let stats = crate::structures::IndexStats::new()
.with_total_shards(5)
.with_total_postings(1000)
.with_vector_dimension(384)
.with_search_latency_p95(Duration::from_millis(200))
.with_write_throughput(150.0)
.with_bloom_filter_hit_rate(0.92);
assert_eq!(stats.total_shards, 5);
assert_eq!(stats.total_postings, 1000);
assert_eq!(stats.vector_dimension, 384);
assert_eq!(stats.search_latency_p95, Duration::from_millis(200));
assert_eq!(stats.write_throughput, 150.0);
assert_eq!(stats.bloom_filter_hit_rate, 0.92);
assert_eq!(stats.search_latency_p95_ms(), 200);
assert_eq!(stats.write_ops_per_second(), 150.0);
assert_eq!(stats.bloom_filter_hit_rate_percent(), 92.0);
assert!(stats.is_performance_healthy());
println!("Enhanced stats display: {}", stats);
}
#[tokio::test]
async fn test_for_test_builder() {
let stats = crate::structures::IndexStats::for_test();
assert_eq!(stats.search_latency_p50, Duration::from_millis(50));
assert_eq!(stats.search_latency_p95, Duration::from_millis(150));
assert_eq!(stats.search_latency_p99, Duration::from_millis(300));
assert_eq!(stats.write_throughput, 100.0);
assert_eq!(stats.bloom_filter_hit_rate, 0.85);
let display_str = format!("{}", stats);
assert!(display_str.contains("latency:"));
assert!(display_str.contains("write_throughput:"));
assert!(display_str.contains("bloom_hit_rate:"));
println!("Test stats display: {}", display_str);
}
}