use std::sync::Arc;
use vecpool::get;
#[test]
fn buffer_reuse() {
let mut v = get::<u32>();
v.push(1);
v.push(2);
v.push(3);
drop(v);
let v2 = get::<u32>();
assert!(v2.capacity() > 0);
}
#[test]
fn cross_type_reuse() {
let mut v = get::<i32>();
v.push(1);
v.push(2);
drop(v);
let v2 = get::<u32>();
assert!(v2.capacity() > 0);
}
#[test]
fn no_cross_layout_reuse() {
let mut v = get::<u8>();
v.push(1);
v.push(2);
drop(v);
let v2 = get::<u32>();
assert_eq!(v2.capacity(), 0);
}
#[test]
fn zst_handling() {
let mut v = get::<()>();
v.push(());
v.push(());
drop(v);
let mut v2 = get::<()>();
v2.push(());
}
#[test]
fn deref_deref_mut() {
let mut v = get::<u32>();
v.push(10);
v.push(20);
assert_eq!(v.len(), 2);
assert_eq!(v[0], 10);
assert_eq!(v[1], 20);
}
#[test]
fn debug_impl() {
let mut v = get::<u32>();
v.push(1);
v.push(2);
let s = format!("{:?}", v);
assert_eq!(s, "[1, 2]");
}
#[test]
fn drop_clears_elements() {
let arc = Arc::new(42);
{
let mut v = get::<Arc<i32>>();
v.push(arc.clone());
v.push(arc.clone());
}
assert_eq!(Arc::strong_count(&arc), 1);
}
#[test]
fn with_capacity_reuses_large_enough_buffer() {
let mut v = vecpool::get::<u32>();
for i in 0..200 {
v.push(i);
}
let cap = v.capacity();
drop(v);
let v2 = vecpool::with_capacity::<u32>(100);
assert!(v2.capacity() >= 100);
assert_eq!(v2.capacity(), cap);
}
#[test]
fn with_capacity_allocates_fresh_if_pool_too_small() {
let mut v = vecpool::get::<u32>();
v.push(1);
drop(v);
let v2 = vecpool::with_capacity::<u32>(1000);
assert!(v2.capacity() >= 1000);
}
#[test]
fn pool_vec_new() {
let mut v = vecpool::PoolVec::<u32>::new();
v.push(42);
assert_eq!(v[0], 42);
}
#[test]
fn into_iterator() {
let mut v = vecpool::get::<u32>();
v.push(1);
v.push(2);
v.push(3);
let collected: Vec<u32> = v.into_iter().collect();
assert_eq!(collected, vec![1, 2, 3]);
}
#[test]
fn from_vec() {
let original = vec![10u32, 20, 30];
let pooled = vecpool::PoolVec::from(original);
assert_eq!(pooled.len(), 3);
assert_eq!(pooled[0], 10);
let cap = pooled.capacity();
drop(pooled);
let reused = vecpool::get::<u32>();
assert_eq!(reused.capacity(), cap);
}
#[test]
fn clear_pool_frees_buffers() {
let mut v = vecpool::get::<u32>();
v.push(1);
drop(v);
vecpool::clear_pool();
let v2 = vecpool::get::<u32>();
assert_eq!(v2.capacity(), 0);
}
#[test]
fn from_iterator() {
let pooled: vecpool::PoolVec<u32> = (0..100).collect();
assert_eq!(pooled.len(), 100);
assert_eq!(pooled[0], 0);
assert_eq!(pooled[99], 99);
}