use uninum::Number;
#[test]
fn test_basic_shift_operations() {
let h = Number::from(1u64);
assert_eq!((h.clone() << 3).unwrap(), Number::from(8u64));
assert_eq!((Number::from(8u64) >> 3).unwrap(), Number::from(1u64));
}
#[test]
fn test_signed_left_shift() {
let value = Number::from(-2i64);
assert_eq!((value << 1).unwrap(), Number::from(-4i64));
}
#[test]
fn test_shift_with_references() {
let a = Number::from(0b1010u64);
assert_eq!((a.clone() << 2).unwrap(), Number::from(0b101000u64));
assert_eq!((a.clone() >> 1).unwrap(), Number::from(0b101u64));
assert_eq!(a, Number::from(0b1010u64));
}
#[test]
fn test_shift_errors_for_floats() {
let float = Number::from(3.5f64);
assert!((float.clone() << 1).is_err());
assert!((float >> 1).is_err());
}
#[test]
fn test_shift_operations_comprehensive() {
assert_eq!((Number::from(64u64) << 1).unwrap(), Number::from(128u64));
assert_eq!((Number::from(1u64) << 7).unwrap(), Number::from(128u64));
assert_eq!(
(Number::from(0x80000000u64) << 1).unwrap(),
Number::from(0x100000000u64)
);
assert_eq!((Number::from(128u64) >> 1).unwrap(), Number::from(64u64));
assert_eq!((Number::from(255u64) >> 1).unwrap(), Number::from(127u64));
assert_eq!((Number::from(1u64) >> 1).unwrap(), Number::from(0u64));
assert_eq!((Number::from(255u64) >> 7).unwrap(), Number::from(1u64));
assert_eq!((Number::from(-128i64) >> 1).unwrap(), Number::from(-64i64)); assert_eq!((Number::from(-1i64) >> 1).unwrap(), Number::from(-1i64)); assert_eq!((Number::from(127i64) >> 1).unwrap(), Number::from(63i64));
assert_eq!(
(Number::from(0xFFFFFFFFu64) >> 31).unwrap(),
Number::from(1u64)
);
assert_eq!(
(Number::from(1u64) << 31).unwrap(),
Number::from(0x80000000u64)
);
assert_eq!(
(Number::from(12345u64) << 0).unwrap(),
Number::from(12345u64)
);
assert_eq!(
(Number::from(12345u64) >> 0).unwrap(),
Number::from(12345u64)
);
assert_eq!(
(Number::from(1u64) << 63).unwrap(),
Number::from(0x8000000000000000u64)
);
}
#[test]
#[cfg(feature = "decimal")]
fn test_shift_with_decimal_fails() {
use rust_decimal::Decimal;
let dec = Number::from(Decimal::new(42, 0));
assert!((dec.clone() << 1).is_err());
assert!((dec.clone() >> 1).is_err());
}