use super::*;
use rust_decimal_macros::dec;
#[test]
fn valid_bps_accepted() {
let bps = Bps::new(dec!(50)).unwrap();
assert_eq!(bps.value(), dec!(50));
}
#[test]
fn zero_bps_accepted() {
let bps = Bps::new(Decimal::ZERO).unwrap();
assert_eq!(bps.value(), Decimal::ZERO);
}
#[test]
fn max_bps_accepted() {
let bps = Bps::new(dec!(10000)).unwrap();
assert_eq!(bps.value(), dec!(10000));
}
#[test]
fn negative_bps_rejected() {
let err = Bps::new(dec!(-1)).unwrap_err();
assert_eq!(err, BpsError::OutOfRange(dec!(-1)));
}
#[test]
fn over_10000_bps_rejected() {
let err = Bps::new(dec!(10001)).unwrap_err();
assert_eq!(err, BpsError::OutOfRange(dec!(10001)));
}
#[test]
fn as_fraction_conversion() {
let bps = Bps::from_trusted(100);
assert_eq!(bps.as_fraction(), dec!(0.01));
}
#[test]
fn as_fraction_zero() {
assert_eq!(Bps::zero().as_fraction(), Decimal::ZERO);
}
#[test]
fn as_fraction_full() {
let bps = Bps::from_trusted(10000);
assert_eq!(bps.as_fraction(), Decimal::ONE);
}
#[test]
fn to_fraction_returns_validated_type() {
let bps = Bps::from_trusted(500);
let frac = bps.to_fraction();
assert_eq!(frac.value(), dec!(0.05));
}
#[test]
fn fractional_bps_accepted() {
let bps = Bps::new(dec!(2.5)).unwrap();
assert_eq!(bps.value(), dec!(2.5));
assert_eq!(bps.as_fraction(), dec!(0.00025));
}
#[test]
fn ordering_preserves_magnitude() {
let small = Bps::from_trusted(10);
let medium = Bps::from_trusted(100);
let large = Bps::from_trusted(1000);
assert!(small < medium);
assert!(medium < large);
}
#[test]
#[should_panic(expected = "from_trusted")]
fn from_trusted_panics_on_invalid() {
let _ = Bps::from_trusted(10001);
}
#[test]
fn display_format() {
let bps = Bps::from_trusted(50);
assert_eq!(format!("{bps}"), "50bps");
}
#[test]
fn serde_roundtrip() {
let bps = Bps::from_trusted(75);
let json = serde_json::to_string(&bps).unwrap();
let deserialized: Bps = serde_json::from_str(&json).unwrap();
assert_eq!(bps, deserialized);
}
#[test]
fn cross_type_consistency_bps_500_equals_5_percent() {
use crate::Percentage;
let bps = Bps::from_trusted(500);
let pct = Percentage::from_trusted(5);
assert_eq!(bps.as_fraction(), pct.as_fraction());
}