#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod tests {
use super::*;
use std::thread;
use std::time::Duration;
#[test]
fn test_memory_manager_creation() -> Result<()> {
let manager = MemoryManager::new()?;
let stats = manager.stats();
assert_eq!(stats.total_allocated, 0);
assert_eq!(stats.peak_usage, 0);
Ok(())
}
#[test]
fn test_buffer_allocation() -> Result<()> {
let manager = MemoryManager::new()?;
let buffer = manager.allocate_buffer(PoolType::AstParsing, 1024)?;
assert_eq!(buffer.as_slice().len(), 1024);
assert!(buffer.capacity() >= 1024);
Ok(())
}
#[test]
fn test_string_interning() -> Result<()> {
let manager = MemoryManager::new()?;
let str1 = manager.intern_string("test")?;
let str2 = manager.intern_string("test")?;
assert!(Arc::ptr_eq(&str1, &str2));
assert_eq!(str1.as_ref(), "test");
Ok(())
}
#[test]
fn test_memory_cleanup() -> Result<()> {
let manager = MemoryManager::new()?;
let _buffer1 = manager.allocate_buffer(PoolType::AstParsing, 1024)?;
let _buffer2 = manager.allocate_buffer(PoolType::FileContent, 2048)?;
let _interned = manager.intern_string("test_string")?;
let stats_before = manager.stats();
assert!(stats_before.total_allocated > 0);
let _cleaned = manager.cleanup()?;
Ok(())
}
#[test]
fn test_pool_buffer_reuse() -> Result<()> {
let manager = MemoryManager::new()?;
{
let _buffer = manager.allocate_buffer(PoolType::AstParsing, 1024)?;
}
let buffer2 = manager.allocate_buffer(PoolType::AstParsing, 1024)?;
assert_eq!(buffer2.as_slice().len(), 1024);
Ok(())
}
#[test]
fn test_allocation_strategy() -> Result<()> {
let manager = MemoryManager::new()?;
assert_eq!(manager.determine_strategy(1024), AllocationStrategy::Pooled);
assert_eq!(
manager.determine_strategy(2 * 1024 * 1024),
AllocationStrategy::MemoryMapped
);
assert_eq!(
manager.determine_strategy(512 * 1024),
AllocationStrategy::Direct
);
Ok(())
}
#[test]
fn test_concurrent_access() -> Result<()> {
let manager = MemoryManager::new()?;
let manager = Arc::clone(&manager);
let handles: Vec<_> = (0..4)
.map(|i| {
let manager = Arc::clone(&manager);
thread::spawn(move || -> Result<()> {
for j in 0..10 {
let _buffer =
manager.allocate_buffer(PoolType::AstParsing, 1024 + j * 100)?;
let _interned =
manager.intern_string(&format!("thread_{}_iter_{}", i, j))?;
thread::sleep(Duration::from_millis(1));
}
Ok(())
})
})
.collect();
for handle in handles {
handle.join().unwrap()?;
}
let stats = manager.stats();
assert!(
stats.peak_usage > 0,
"Expected peak_usage > 0, got {}",
stats.peak_usage
);
Ok(())
}
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod property_tests {
use proptest::prelude::*;
proptest! {
#[test]
fn basic_property_stability(_input in ".*") {
prop_assert!(true);
}
#[test]
fn module_consistency_check(_x in 0u32..1000) {
prop_assert!(_x < 1001);
}
}
}