use uninum::{Number, num};
#[test]
fn test_basic_or_operation() {
let c = Number::from(0b1010u64);
let d = Number::from(0b1100u64);
assert_eq!((c | d).unwrap(), Number::from(0b1110u64));
}
#[test]
fn test_try_bitor_method() {
let a = Number::from(0b1010u64);
let b = Number::from(0b1100u64);
assert_eq!(a.try_bitor(&b), Some(Number::from(0b1110u64)));
let float = num!(3.16);
assert_eq!(float.try_bitor(&a), None);
}
#[test]
fn test_bitor_signed_integers() {
let a = Number::from(-0b1010i64);
let b = Number::from(-0b0101i64);
assert_eq!((a | b).unwrap(), Number::from(-1i64));
}
#[test]
fn test_bitor_mismatched_types_error() {
let signed = Number::from(-2i64);
let unsigned = Number::from(3u64);
assert!((signed | unsigned).is_err());
}
#[test]
fn test_small_integer_bitor() {
let a = Number::from(0b1010u64);
let b = Number::from(0b1100u64);
assert_eq!(a.try_bitor(&b), Some(Number::from(0b1110u64)));
}
#[test]
fn test_large_integer_bitor() {
let a = Number::from(0x1234567890ABCDEFu64);
let b = Number::from(0xFEDCBA0987654321u64);
assert!(a.try_bitor(&b).is_some());
}
#[test]
fn test_bitor_with_references() {
let a = Number::from(0b1010u64);
let b = Number::from(0b1100u64);
assert_eq!((a.clone() | b.clone()).unwrap(), Number::from(0b1110u64));
assert_eq!(a, Number::from(0b1010u64));
assert_eq!(b, Number::from(0b1100u64));
}
#[test]
fn test_bitor_patterns() {
let all_ones_u32 = Number::from(0xFFFFFFFFu64);
let all_zeros_u32 = Number::from(0x00000000u64);
let alternating_u32 = Number::from(0xAAAAAAAAu64);
assert_eq!(
(alternating_u32.clone() | all_ones_u32.clone()).unwrap(),
all_ones_u32
);
assert_eq!(
(alternating_u32.clone() | all_zeros_u32.clone()).unwrap(),
alternating_u32
);
}
#[test]
fn test_demorgan_or_part() {
let a = Number::from(0xCC00CC00_u64);
let b = Number::from(0xAA00AA00_u64);
let not_a_and_b = (!(a.clone() & b.clone()).unwrap()).unwrap();
let not_a_or_not_b = ((!a.clone()).unwrap() | (!b.clone()).unwrap()).unwrap();
assert_eq!(not_a_and_b, not_a_or_not_b);
}
#[test]
#[cfg(feature = "decimal")]
fn test_bitor_with_decimal_fails() {
use rust_decimal::Decimal;
let dec = Number::from(Decimal::new(42, 0));
let int = Number::from(42_u64);
assert!((dec.clone() | int.clone()).is_err());
assert_eq!(dec.try_bitor(&int), None);
}