#[cfg(feature = "thread_local")]
use arena_b::Arena;
#[cfg(feature = "thread_local")]
#[test]
fn test_thread_local_basic_allocation() {
let arena = Arena::new();
let value1 = arena.alloc(42u8);
let value2 = arena.alloc(100u16);
let value3 = arena.alloc(999u32);
assert_eq!(*value1, 42);
assert_eq!(*value2, 100);
assert_eq!(*value3, 999);
}
#[cfg(feature = "thread_local")]
#[test]
fn test_thread_local_with_checkpoints() {
let arena = Arena::new();
let checkpoint = arena.checkpoint();
for i in 0..10 {
arena.alloc(i);
}
for i in 0..10 {
let _value = arena.alloc(i);
}
unsafe {
arena.rewind_to_checkpoint(checkpoint);
}
let new_value = arena.alloc(999u32);
assert_eq!(*new_value, 999);
}
#[cfg(feature = "thread_local")]
#[test]
fn test_thread_local_reset() {
let mut arena = Arena::new();
for i in 0..50 {
arena.alloc(i);
}
unsafe {
arena.reset();
}
let new_value = arena.alloc(42u32);
assert_eq!(*new_value, 42);
}
#[cfg(feature = "thread_local")]
#[test]
fn test_thread_local_multi_thread() {
let arena = Arena::new();
for thread_id in 0..4 {
for i in 0..10 {
let value = arena.alloc((thread_id * 10 + i) as u32);
assert_eq!(*value, (thread_id * 10 + i) as u32);
}
}
}
#[cfg(feature = "thread_local")]
#[test]
fn test_thread_local_large_allocations() {
let arena = Arena::new();
let large_data = arena.alloc([0u8; 10000]);
assert_eq!(large_data.len(), 10000);
let small_value = arena.alloc(42u32);
assert_eq!(*small_value, 42);
}
#[cfg(feature = "thread_local")]
#[test]
fn test_thread_local_mixed_sizes() {
let arena = Arena::new();
let small1 = arena.alloc(1u8);
let large = arena.alloc([0u8; 5000]);
let small2 = arena.alloc(2u16);
let small3 = arena.alloc(3u32);
assert_eq!(*small1, 1);
assert_eq!(large.len(), 5000);
assert_eq!(*small2, 2);
assert_eq!(*small3, 3);
}
#[test]
fn test_regular_arena_without_thread_local() {
let arena = arena_b::Arena::new();
let value = arena.alloc(42u32);
assert_eq!(*value, 42);
let slice = arena.alloc_slice_copy(&[1, 2, 3]);
assert_eq!(slice, &[1, 2, 3]);
}