#![allow(clippy::cmp_owned)]
use core::cmp::Ordering;
use dashu_base::{AbsOrd, Sign};
use dashu_int::{IBig, UBig};
mod helper_macros;
#[test]
fn test_eq_and_cmp() {
assert_eq!(ubig!(0), UBig::from_words(&[]));
assert_eq!(ubig!(0), UBig::from_words(&[0]));
assert_eq!(ibig!(0), IBig::from_parts(Sign::Positive, UBig::from_words(&[])));
assert_eq!(ibig!(0), IBig::from_parts(Sign::Positive, UBig::from_words(&[0])));
assert_eq!(ubig!(500), UBig::from_words(&[500]));
assert_eq!(ibig!(500), IBig::from_parts(Sign::Positive, UBig::from_words(&[500])));
assert_eq!(ibig!(-500), IBig::from_parts(Sign::Negative, UBig::from_words(&[500])));
assert_eq!(ubig!(500).cmp(&ubig!(500)), Ordering::Equal);
assert!(ubig!(100) < ubig!(500));
assert!(ubig!(500) > ubig!(100));
assert!(ubig!(0x10000000000000000) > ubig!(100));
assert!(ubig!(100) < ubig!(0x100000000000000000000000000000000));
assert!(
ubig!(0x100000000000000020000000000000003) < ubig!(0x100000000000000030000000000000002)
);
assert!(
ubig!(0x100000000000000030000000000000002) > ubig!(0x100000000000000020000000000000003)
);
assert_eq!(
ubig!(0x100000000000000030000000000000002).cmp(&ubig!(0x100000000000000030000000000000002)),
Ordering::Equal
);
assert_eq!(ibig!(500).cmp(&ibig!(500)), Ordering::Equal);
assert_eq!(ibig!(-500).cmp(&ibig!(-500)), Ordering::Equal);
assert!(ibig!(5) < ibig!(10));
assert!(ibig!(10) > ibig!(5));
assert!(ibig!(-5) < ibig!(10));
assert!(ibig!(-15) < ibig!(10));
assert!(ibig!(10) > ibig!(-5));
assert!(ibig!(10) > ibig!(-15));
assert!(ibig!(-10) < ibig!(-5));
assert!(ibig!(-5) > ibig!(-10));
}
#[test]
fn test_abs_ord() {
assert!(ubig!(12).abs_cmp(&ubig!(12)).is_eq());
assert!(ubig!(12).abs_cmp(&ibig!(-12)).is_eq());
assert!(ibig!(-12).abs_cmp(&ubig!(12)).is_eq());
assert!(ibig!(12).abs_cmp(&ibig!(-12)).is_eq());
assert!(ibig!(-12).abs_cmp(&ubig!(10)).is_ge());
assert!(ibig!(-12).abs_cmp(&ubig!(12)).is_eq());
assert!(ibig!(-12).abs_cmp(&ubig!(14)).is_le());
assert!(ubig!(12).abs_cmp(&ibig!(-10)).is_ge());
assert!(ubig!(12).abs_cmp(&ibig!(-12)).is_eq());
assert!(ubig!(12).abs_cmp(&ibig!(-14)).is_le());
}
#[test]
fn test_eq_across_representations() {
assert_eq!(ubig!(5), ubig!(5));
assert_ne!(ubig!(5), ubig!(7));
assert_eq!(ubig!(0x10000000000000000), ubig!(0x10000000000000000)); assert_ne!(ubig!(0x10000000000000000), ubig!(0x10000000000000001));
assert_ne!(ubig!(5), ubig!(1) << 200);
assert_ne!(ubig!(1) << 200, ubig!(5));
assert_eq!(ubig!(1) << 200, ubig!(1) << 200);
assert_ne!((ubig!(1) << 200) + ubig!(1), (ubig!(1) << 200) + ubig!(2));
assert_ne!(ubig!(1) << 200, ubig!(1) << 201);
assert_eq!(UBig::ones(128), UBig::from(u128::MAX));
assert_eq!(UBig::ones(256), (ubig!(1) << 256) - ubig!(1));
assert_eq!(ibig!(-5), ibig!(-5));
assert_ne!(ibig!(5), ibig!(-5));
assert_eq!(ibig!(0), ibig!(0));
assert_ne!(ibig!(0), ibig!(1));
assert_eq!(-(ibig!(1) << 200), -(ibig!(1) << 200));
assert_ne!(-(ibig!(1) << 200), ibig!(1) << 200);
}
#[test]
fn test_cmp_across_representations() {
use core::cmp::Ordering::*;
let ubig_cases = [
(ubig!(5), ubig!(7), Less),
(ubig!(5), ubig!(5), Equal),
(ubig!(0x10000000000000000), ubig!(0x10000000000000001), Less),
(ubig!(0x1000000000000000000000000), ubig!(0x10000000000000000), Greater),
(ubig!(0xffffffffffffffff), ubig!(0x10000000000000000), Less),
((ubig!(1) << 130) + ubig!(1), (ubig!(1) << 130) + ubig!(2), Less),
(ubig!(1) << 200, ubig!(1) << 130, Greater),
((ubig!(1) << 128) - ubig!(1), ubig!(1) << 128, Less),
(UBig::ones(128), UBig::from(u128::MAX), Equal),
(UBig::ones(256), (ubig!(1) << 256) - ubig!(1), Equal),
];
for (a, b, want) in &ubig_cases {
assert_eq!(a.cmp(b), *want, "{a} cmp {b}");
assert_eq!(b.cmp(a), want.reverse(), "{b} cmp {a}");
assert_eq!(a.partial_cmp(b), Some(*want));
}
let ibig_cases = [
(ibig!(-5), ibig!(3), Less), (ibig!(-5), ibig!(-3), Less), (ibig!(0), ibig!(-1), Greater),
(ibig!(0), ibig!(1), Less),
(ibig!(-5), ibig!(-5), Equal),
(-(ibig!(1) << 200), -(ibig!(1) << 130), Less),
(-((ibig!(1) << 128) - ibig!(1)), -(ibig!(1) << 128), Greater),
];
for (a, b, want) in &ibig_cases {
assert_eq!(a.cmp(b), *want, "{a} cmp {b}");
assert_eq!(b.cmp(a), want.reverse(), "{b} cmp {a}");
assert_eq!(a.partial_cmp(b), Some(*want));
}
}