// Copyright 2025 Gabriel Bjørnager Jensen.

#![cfg(test)]

use multitype::CarryingMulAdd;

#[test]
fn test_u128_carrying_mul_add() {
	assert_eq!(
		CarryingMulAdd::carrying_mul_add(
			u128::MAX,
			u128::MAX,
			0,
			0,
		),
		(
			0x0000_0000_0000_0000_0000_0000_0000_0001,
			0xFFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFE,
		)
	);

	assert_eq!(
		CarryingMulAdd::carrying_mul_add(
			u128::MAX,
			u128::MAX,
			u128::MAX,
			u128::MAX,
		),
		(
			0xFFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF,
			0xFFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF,
		)
	);
}

#[test]
fn test_i128_carrying_mul_add() {
	assert_eq!(
		CarryingMulAdd::carrying_mul_add(
			i128::MAX,
			i128::MAX,
			0,
			0,
		),
		(
			0x0000_0000_0000_0000_0000_0000_0000_0001,
			0x3FFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF,
		)
	);

	assert_eq!(
		CarryingMulAdd::carrying_mul_add(
			i128::MAX,
			i128::MAX,
			i128::MAX,
			i128::MAX,
		),
		(
			0xFFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF,
			0x3FFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF,
		)
	);
}
