#[cfg(test)]
mod tests {
use crate::search::{SearchParams, get_ultra_memory_stats, initialize_search, perform_search};
#[test]
fn test_memory_efficiency_estimate() {
let entries_per_10m = 10_000_000;
let bytes_per_entry = 11; let entries_size = entries_per_10m * bytes_per_entry;
let avg_unique_filename_length = 8;
let deduplication_factor = 0.3; let string_pool_size = (entries_per_10m as f64
* deduplication_factor
* avg_unique_filename_length as f64) as usize;
let radix_entries_per_bucket = entries_per_10m / 256;
let radix_size = 256 * radix_entries_per_bucket * 4;
let total_estimated = entries_size + string_pool_size + radix_size;
let total_mb = total_estimated as f64 / 1_048_576.0;
println!("\\nTheoretical memory usage for 10M entries:");
println!(
" Ultra-compact entries: {:.1} MB ({} bytes each)",
entries_size as f64 / 1_048_576.0,
bytes_per_entry
);
println!(
" String pool: {:.1} MB",
string_pool_size as f64 / 1_048_576.0
);
println!(" Radix index: {:.1} MB", radix_size as f64 / 1_048_576.0);
println!(" Total estimated: {total_mb:.1} MB");
println!(" Target: <100 MB ({total_mb:.1}% of target)");
assert!(
total_mb < 200.0,
"Should be under 200MB for 10M entries (major improvement)"
);
let original_bytes_per_entry = 350u64; let original_memory_mb = (10_000_000u64 * original_bytes_per_entry) as f64 / 1_048_576.0;
let improvement_factor = original_memory_mb / total_mb;
println!(
" Original design (~{original_bytes_per_entry} bytes/entry): {original_memory_mb:.1} MB"
);
println!(" Memory improvement: {improvement_factor:.1}x better");
assert!(
improvement_factor > 15.0,
"Should be at least 15x better than original"
);
println!(
"✓ Ultra-low memory target is achievable with {improvement_factor:.1}x improvement"
);
}
#[test]
fn test_search_integration() {
let temp_dir = std::env::temp_dir().join("ultra_memory_integration_test");
let _ = std::fs::remove_dir_all(&temp_dir);
std::fs::create_dir_all(&temp_dir).unwrap();
std::fs::write(temp_dir.join("document.pdf"), "pdf content").unwrap();
std::fs::write(temp_dir.join("image.jpg"), "jpg content").unwrap();
std::fs::write(temp_dir.join("data.csv"), "csv content").unwrap();
let subdir = temp_dir.join("subdirectory");
std::fs::create_dir_all(&subdir).unwrap();
std::fs::write(subdir.join("nested_file.txt"), "nested content").unwrap();
std::fs::write(subdir.join("another_document.pdf"), "another pdf").unwrap();
initialize_search(temp_dir.clone());
std::thread::sleep(std::time::Duration::from_millis(100));
let search_params = SearchParams {
query: "document".to_string(),
path: "/".to_string(),
limit: 10,
offset: 0,
case_sensitive: false,
};
let results = perform_search(&temp_dir, &search_params).unwrap();
assert!(!results.is_empty(), "Should find documents");
let document_results: Vec<_> = results
.iter()
.filter(|r| r.name.contains("document"))
.collect();
assert!(
!document_results.is_empty(),
"Should find documents with 'document' in name"
);
let nested_search_params = SearchParams {
query: "nested".to_string(),
path: "/".to_string(),
limit: 10,
offset: 0,
case_sensitive: false,
};
let nested_results = perform_search(&temp_dir, &nested_search_params).unwrap();
assert!(!nested_results.is_empty(), "Should find nested file");
let stats = get_ultra_memory_stats();
assert!(!stats.is_empty(), "Should get memory statistics");
println!("\\nMemory Statistics:");
println!("{stats}");
std::fs::remove_dir_all(&temp_dir).unwrap();
println!("✓ Ultra-low memory search integration working correctly");
}
#[test]
fn test_performance_characteristics() {
let temp_dir = std::env::temp_dir().join("ultra_memory_performance_test");
let _ = std::fs::remove_dir_all(&temp_dir);
std::fs::create_dir_all(&temp_dir).unwrap();
for i in 0..1000 {
std::fs::write(
temp_dir.join(format!("file_{i:04}.txt")),
format!("content for file {i}"),
)
.unwrap();
}
for i in 0..10 {
let subdir = temp_dir.join(format!("dir_{i:02}"));
std::fs::create_dir_all(&subdir).unwrap();
for j in 0..50 {
std::fs::write(
subdir.join(format!("nested_file_{i:02}_{j:02}.txt")),
format!("nested content {i} {j}"),
)
.unwrap();
}
}
println!("\\nCreated test directory with 1500 files");
initialize_search(temp_dir.clone());
std::thread::sleep(std::time::Duration::from_millis(500));
let start_time = std::time::Instant::now();
let search_params = SearchParams {
query: "file".to_string(),
path: "/".to_string(),
limit: 100,
offset: 0,
case_sensitive: false,
};
let results = perform_search(&temp_dir, &search_params).unwrap();
let search_duration = start_time.elapsed();
println!("Search performance:");
println!(
" Found {} results in {:.2}ms",
results.len(),
search_duration.as_millis()
);
println!(
" Search rate: {:.0} results/ms",
results.len() as f64 / search_duration.as_millis() as f64
);
assert!(
search_duration.as_millis() < 100,
"Search should complete in under 100ms, took {}ms",
search_duration.as_millis()
);
let patterns = vec!["nested", "file_0", "dir_05", "txt"];
for pattern in patterns {
let start = std::time::Instant::now();
let params = SearchParams {
query: pattern.to_string(),
path: "/".to_string(),
limit: 50,
offset: 0,
case_sensitive: false,
};
let pattern_results = perform_search(&temp_dir, ¶ms).unwrap();
let duration = start.elapsed();
println!(
" Pattern '{}': {} results in {:.2}ms",
pattern,
pattern_results.len(),
duration.as_millis()
);
assert!(
duration.as_millis() < 50,
"Pattern search should be fast, took {}ms",
duration.as_millis()
);
}
std::fs::remove_dir_all(&temp_dir).unwrap();
println!("✓ Ultra-fast search performance verified (all searches <100ms)");
}
}