multitype 0.21.0

Arithmetic type traits.
Documentation
// Copyright 2025-2026 Gabriel Bjørnager Jensen.
//
// SPDX: MIT OR Apache-2.0

#![cfg(test)]

use multitype::Unsigned;

#[test]
fn test_bit_width() {
	assert_eq!(Unsigned::bit_width(00_u8), 0);
	assert_eq!(Unsigned::bit_width(01_u8), 1);
	assert_eq!(Unsigned::bit_width(02_u8), 2);
	assert_eq!(Unsigned::bit_width(03_u8), 2);
	assert_eq!(Unsigned::bit_width(04_u8), 3);
	assert_eq!(Unsigned::bit_width(05_u8), 3);
	assert_eq!(Unsigned::bit_width(06_u8), 3);
	assert_eq!(Unsigned::bit_width(07_u8), 3);
	assert_eq!(Unsigned::bit_width(08_u8), 4);
	assert_eq!(Unsigned::bit_width(09_u8), 4);
	assert_eq!(Unsigned::bit_width(10_u8), 4);
	assert_eq!(Unsigned::bit_width(11_u8), 4);
	assert_eq!(Unsigned::bit_width(12_u8), 4);
	assert_eq!(Unsigned::bit_width(13_u8), 4);
	assert_eq!(Unsigned::bit_width(14_u8), 4);
	assert_eq!(Unsigned::bit_width(15_u8), 4);
}

#[test]
fn test_unsigned() {
	let mut value0 = 0_u8;
	let mut value1 = 0_u16;
	let mut value2 = 0_u32;
	let mut value3 = 0_u64;
	let mut value4 = 0_u128;

	fn op<T: Copy + From<u8> + Unsigned>(value: &mut T) {
		*value = 1_u8.into();

		*value = value.wrapping_sub(2.into());
	}

	op(&mut value0);
	op(&mut value1);
	op(&mut value2);
	op(&mut value3);
	op(&mut value4);

	assert_eq!(value0, 0xFF);
	assert_eq!(value1, 0xFF_FF);
	assert_eq!(value2, 0xFF_FF_FF_FF);
	assert_eq!(value3, 0xFF_FF_FF_FF_FF_FF_FF_FF);
	assert_eq!(value4, 0xFF_FF_FF_FF_FF_FF_FF_FF_FF_FF_FF_FF_FF_FF_FF_FF);
}