use super::{define_non_negative_value_type, Error, ParamKind, Price, Volume};
define_non_negative_value_type!(
Quantity,
ParamKind::Quantity
);
impl Quantity {
pub fn calculate_volume(self, price: Price) -> Result<Volume, Error> {
price.calculate_volume(self)
}
}
#[cfg(test)]
mod tests {
use super::Quantity;
use crate::param::{Error, ParamKind, Price};
use rust_decimal::Decimal;
fn d(value: &str) -> Decimal {
value
.parse()
.expect("decimal literal in tests must be valid")
}
fn q(value: &str) -> Quantity {
Quantity::from_str(value).expect("quantity literal in tests must be valid")
}
#[test]
fn calculate_volume_is_commutative_with_price() {
let quantity = q("0.15");
let price = Price::new(d("42350.75"));
assert_eq!(
quantity
.calculate_volume(price)
.expect("volume must be calculable")
.to_decimal(),
d("6352.6125")
);
}
#[test]
fn calculate_volume_propagates_price_overflow() {
let quantity = q("2");
let price = Price::new(Decimal::MAX);
assert_eq!(
quantity.calculate_volume(price),
Err(Error::Overflow {
param: ParamKind::Price
})
);
}
}