oct 0.37.1

Octonary utilities.
Documentation
// Copyright 2024-2026 Gabriel Bjørnager Jensen.
//
// SPDX: MIT OR Apache-2.0

//! Tests for [`Zeroable`].

#![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>());
	}

	// NOTE: Skip types implementing `FromOctets` as
	// its tests already cover all-zeros.

	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)>>();
}