use rust_decimal::Decimal;
use rust_decimal_macros::dec;
use super::{Percentage, PercentageError};
#[test]
fn new_valid() {
let pct = Percentage::new(dec!(50)).expect("should be valid");
assert_eq!(pct.value(), dec!(50));
}
#[test]
fn new_zero_boundary() {
let pct = Percentage::new(Decimal::ZERO).expect("zero should be valid");
assert_eq!(pct.value(), Decimal::ZERO);
}
#[test]
fn new_hundred_boundary() {
let pct = Percentage::new(dec!(100)).expect("100 should be valid");
assert_eq!(pct.value(), dec!(100));
}
#[test]
fn new_negative_rejected() {
let err = Percentage::new(dec!(-1)).expect_err("should reject -1");
assert_eq!(err, PercentageError::OutOfRange(dec!(-1)));
}
#[test]
fn new_over_hundred_rejected() {
let err = Percentage::new(dec!(101)).expect_err("should reject 101");
assert_eq!(err, PercentageError::OutOfRange(dec!(101)));
}
#[test]
fn as_fraction_fifty() {
let pct = Percentage::from_trusted(50);
assert_eq!(pct.as_fraction(), dec!(0.5));
}
#[test]
fn as_fraction_zero() {
assert_eq!(Percentage::zero().as_fraction(), Decimal::ZERO);
}
#[test]
fn as_fraction_hundred() {
assert_eq!(Percentage::hundred().as_fraction(), Decimal::ONE);
}
#[test]
fn display_fifty() {
assert_eq!(format!("{}", Percentage::from_trusted(50)), "50%");
}
#[test]
fn display_zero() {
assert_eq!(format!("{}", Percentage::zero()), "0%");
}
#[test]
fn from_trusted_valid() {
let pct = Percentage::from_trusted(42);
assert_eq!(pct.value(), dec!(42));
}
#[test]
#[should_panic(expected = "from_trusted: 101 > 100")]
fn from_trusted_panics_over_hundred() {
let _ = Percentage::from_trusted(101);
}
#[test]
fn serde_roundtrip() {
let pct = Percentage::from_trusted(42);
let json = serde_json::to_string(&pct).expect("serialize");
let back: Percentage = serde_json::from_str(&json).expect("deserialize");
assert_eq!(pct, back);
}
#[test]
fn ordering() {
let low = Percentage::from_trusted(10);
let high = Percentage::from_trusted(90);
assert!(low < high);
}
#[test]
fn fractional_percentage() {
let pct = Percentage::new(dec!(33.33)).expect("should be valid");
assert_eq!(pct.value(), dec!(33.33));
assert_eq!(pct.as_fraction(), dec!(0.3333));
}