use super::{Layout, pool_alloc, pool_dealloc, pool_teardown_dealloc, size_class};
#[test]
fn test_size_class_computation() {
let layout1: Layout = Layout::from_size_align(64, 8).unwrap();
assert_eq!(size_class(layout1), Some(1));
let layout2: Layout = Layout::from_size_align(65, 8).unwrap();
assert_eq!(size_class(layout2), Some(2));
let layout12: Layout = Layout::from_size_align(768, 64).unwrap();
assert_eq!(size_class(layout12), Some(12));
let layout20: Layout = Layout::from_size_align(1280, 64).unwrap();
assert_eq!(size_class(layout20), Some(20));
let layout_big: Layout = Layout::from_size_align(1281, 64).unwrap();
assert_eq!(size_class(layout_big), None);
}
#[test]
fn test_alloc_dealloc_roundtrip() {
let layout: Layout = Layout::from_size_align(128, 64).unwrap();
let ptr: *mut u8 = pool_alloc(layout);
assert!(!ptr.is_null());
unsafe { ptr.write(0xAB) };
unsafe { pool_dealloc(ptr, layout) };
let ptr2: *mut u8 = pool_alloc(layout);
assert_eq!(ptr, ptr2);
unsafe { pool_dealloc(ptr2, layout) };
}
#[test]
fn test_different_layouts_same_class() {
let layout_a: Layout = Layout::from_size_align(100, 8).unwrap();
let layout_b: Layout = Layout::from_size_align(120, 8).unwrap();
assert_eq!(size_class(layout_a), size_class(layout_b));
let ptr_a: *mut u8 = pool_alloc(layout_a);
unsafe { pool_dealloc(ptr_a, layout_a) };
let ptr_b: *mut u8 = pool_alloc(layout_b);
assert_eq!(ptr_a, ptr_b);
unsafe { pool_dealloc(ptr_b, layout_b) };
}
#[test]
fn test_teardown_dealloc_bypasses_pool() {
let layout: Layout = Layout::from_size_align(128, 64).unwrap();
let ptr: *mut u8 = pool_alloc(layout);
assert!(!ptr.is_null());
unsafe { pool_teardown_dealloc(ptr, layout) };
let ptr2: *mut u8 = pool_alloc(layout);
assert_ne!(ptr, ptr2);
unsafe { pool_dealloc(ptr2, layout) };
}
#[test]
fn test_teardown_dealloc_oversized_layout() {
let layout: Layout = Layout::from_size_align(2048, 64).unwrap();
assert_eq!(size_class(layout), None);
let ptr: *mut u8 = pool_alloc(layout);
assert!(!ptr.is_null());
unsafe { pool_teardown_dealloc(ptr, layout) };
}