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::Integral;

#[test]
fn test_highest_one() {
	assert_eq!(Integral::highest_one(0_u8), None);
	assert_eq!(Integral::highest_one(1_u8), Some(0));
	assert_eq!(Integral::highest_one(2_u8), Some(1));
	assert_eq!(Integral::highest_one(3_u8), Some(1));
	assert_eq!(Integral::highest_one(4_u8), Some(2));
	assert_eq!(Integral::highest_one(5_u8), Some(2));
	assert_eq!(Integral::highest_one(6_u8), Some(2));
	assert_eq!(Integral::highest_one(7_u8), Some(2));

	assert_eq!(Integral::highest_one(-0_i8), None);
	assert_eq!(Integral::highest_one(-1_i8), Some(7));
	assert_eq!(Integral::highest_one(-2_i8), Some(7));
	assert_eq!(Integral::highest_one(-3_i8), Some(7));
	assert_eq!(Integral::highest_one(-4_i8), Some(7));
	assert_eq!(Integral::highest_one(-5_i8), Some(7));
	assert_eq!(Integral::highest_one(-6_i8), Some(7));
	assert_eq!(Integral::highest_one(-7_i8), Some(7));
}

#[test]
fn test_isolate_highest_one() {
	assert_eq!(Integral::isolate_highest_one(0_u8), 0);
	assert_eq!(Integral::isolate_highest_one(1_u8), 1);
	assert_eq!(Integral::isolate_highest_one(2_u8), 2);
	assert_eq!(Integral::isolate_highest_one(3_u8), 2);
	assert_eq!(Integral::isolate_highest_one(4_u8), 4);
	assert_eq!(Integral::isolate_highest_one(5_u8), 4);
	assert_eq!(Integral::isolate_highest_one(6_u8), 4);
	assert_eq!(Integral::isolate_highest_one(7_u8), 4);

	assert_eq!(Integral::isolate_highest_one(-0_i8),    0);
	assert_eq!(Integral::isolate_highest_one(-1_i8), -128);
	assert_eq!(Integral::isolate_highest_one(-2_i8), -128);
	assert_eq!(Integral::isolate_highest_one(-3_i8), -128);
	assert_eq!(Integral::isolate_highest_one(-4_i8), -128);
	assert_eq!(Integral::isolate_highest_one(-5_i8), -128);
	assert_eq!(Integral::isolate_highest_one(-6_i8), -128);
	assert_eq!(Integral::isolate_highest_one(-7_i8), -128);
}

#[test]
fn test_isolate_lowest_one() {
	assert_eq!(Integral::isolate_lowest_one(0_u8), 0);
	assert_eq!(Integral::isolate_lowest_one(1_u8), 1);
	assert_eq!(Integral::isolate_lowest_one(2_u8), 2);
	assert_eq!(Integral::isolate_lowest_one(3_u8), 1);
	assert_eq!(Integral::isolate_lowest_one(4_u8), 4);
	assert_eq!(Integral::isolate_lowest_one(5_u8), 1);
	assert_eq!(Integral::isolate_lowest_one(6_u8), 2);
	assert_eq!(Integral::isolate_lowest_one(7_u8), 1);

	assert_eq!(Integral::isolate_lowest_one(-0_i8), 0);
	assert_eq!(Integral::isolate_lowest_one(-1_i8), 1);
	assert_eq!(Integral::isolate_lowest_one(-2_i8), 2);
	assert_eq!(Integral::isolate_lowest_one(-3_i8), 1);
	assert_eq!(Integral::isolate_lowest_one(-4_i8), 4);
	assert_eq!(Integral::isolate_lowest_one(-5_i8), 1);
	assert_eq!(Integral::isolate_lowest_one(-6_i8), 2);
	assert_eq!(Integral::isolate_lowest_one(-7_i8), 1);
}

#[test]
fn test_lowest_one() {
	assert_eq!(Integral::lowest_one(0_u8), None);
	assert_eq!(Integral::lowest_one(1_u8), Some(0));
	assert_eq!(Integral::lowest_one(2_u8), Some(1));
	assert_eq!(Integral::lowest_one(3_u8), Some(0));
	assert_eq!(Integral::lowest_one(4_u8), Some(2));
	assert_eq!(Integral::lowest_one(5_u8), Some(0));
	assert_eq!(Integral::lowest_one(6_u8), Some(1));
	assert_eq!(Integral::lowest_one(7_u8), Some(0));

	assert_eq!(Integral::lowest_one(-0_i8), None);
	assert_eq!(Integral::lowest_one(-1_i8), Some(0));
	assert_eq!(Integral::lowest_one(-2_i8), Some(1));
	assert_eq!(Integral::lowest_one(-3_i8), Some(0));
	assert_eq!(Integral::lowest_one(-4_i8), Some(2));
	assert_eq!(Integral::lowest_one(-5_i8), Some(0));
	assert_eq!(Integral::lowest_one(-6_i8), Some(1));
	assert_eq!(Integral::lowest_one(-7_i8), Some(0));
}

#[test]
fn test_midpoint() {
	assert_eq!(Integral::midpoint(0_u128,        0_u128),    0_u128);
	assert_eq!(Integral::midpoint(0_u128,        u128::MAX), u128::MAX / 2);
	assert_eq!(Integral::midpoint(u128::MAX,     u128::MAX), u128::MAX);
	assert_eq!(Integral::midpoint(u128::MAX - 2, u128::MAX), u128::MAX - 1);
	assert_eq!(Integral::midpoint(i128::MIN,     i128::MAX), 0);
}