#![cfg(test)]
use core::hint::black_box;
use oct::{Zeroable, zeroed};
#[cfg(feature = "alloc")]
use oct::zeroed_boxed_with_metadata;
#[cfg(feature = "proc_macro")]
use core::num::NonZero;
#[cfg(feature = "proc_macro")]
#[test]
fn test_derive_zeroable() {
#[derive(Zeroable)]
struct _Type0;
#[expect(clippy::empty_structs_with_brackets)]
#[derive(Zeroable)]
struct _Type1 {}
#[derive(Zeroable)]
struct _Type2(i32);
#[derive(Zeroable)]
struct _Type3 {
_field0: i32,
}
#[repr(C)]
#[derive(Zeroable)]
enum _Type4 {
_Variant0,
}
#[repr(i64)]
#[derive(Zeroable)]
enum _Type5 {
_Variant0 = -1,
_Variant1,
}
#[repr(i8)]
#[derive(Zeroable)]
enum _Type6 {
_Variant0 = -2,
_Variant1(NonZero<u8>),
_Variant2(u8),
}
#[derive(Zeroable)]
union _Type7 {
_field0: Option<NonZero<i32>>,
_field1: i32,
}
}
#[cfg(feature = "alloc")]
#[test]
fn test_new_zeroed_boxed() {
let array = zeroed_boxed_with_metadata::<[i128; 4]>(());
let slice = zeroed_boxed_with_metadata::<[i128]>(4);
assert_eq!(array.as_slice(), &[0; 4]);
assert_eq!(&*slice, &[0; 4]);
}
#[cfg(feature = "alloc")]
#[test]
fn test_new_zeroed_boxed_zst() {
assert_eq!(
*zeroed_boxed_with_metadata::<()>(()),
(),
);
assert_eq!(
*zeroed_boxed_with_metadata::<[i32]>(0),
[],
);
assert_eq!(
&*zeroed_boxed_with_metadata::<str>(0),
"",
);
assert_eq!(
&*zeroed_boxed_with_metadata::<str>(5),
"\0\0\0\0\0",
);
}
#[test]
fn test_zeroed() {
#[track_caller]
fn test<T: Zeroable>() {
black_box(zeroed::<T>());
}
test::<Option<fn()>>();
test::<Option<fn(usize)>>();
test::<Option<fn(usize, usize)>>();
test::<Option<fn(usize, usize, usize)>>();
test::<Option<fn(usize, usize, usize, usize)>>();
test::<Option<fn(usize, usize, usize, usize, usize)>>();
test::<Option<fn(usize, usize, usize, usize, usize, usize)>>();
test::<Option<fn(usize, usize, usize, usize, usize, usize, usize)>>();
test::<Option<fn(usize, usize, usize, usize, usize, usize, usize, usize)>>();
test::<Option<fn(usize, usize, usize, usize, usize, usize, usize, usize, usize)>>();
test::<Option<fn(usize, usize, usize, usize, usize, usize, usize, usize, usize, usize)>>();
test::<Option<fn(usize, usize, usize, usize, usize, usize, usize, usize, usize, usize, usize)>>();
test::<Option<fn(usize, usize, usize, usize, usize, usize, usize, usize, usize, usize, usize, usize)>>();
}