Skip to main content

klirr_core/models/
quantity.rs

1use crate::prelude::*;
2
3/// The quantity of items, e.g. the number of days of consulting service.
4#[derive(
5    Clone,
6    Copy,
7    Display,
8    Debug,
9    PartialEq,
10    Eq,
11    Hash,
12    Serialize,
13    Deserialize,
14    From,
15    Deref,
16    PartialOrd,
17    derive_more::Add,
18    derive_more::AddAssign,
19    derive_more::Sub,
20    derive_more::Mul,
21)]
22#[from(forward)]
23#[deref(forward)]
24pub struct Quantity(Decimal);
25impl Quantity {
26    pub const ZERO: Self = Self(Decimal::ZERO);
27    pub const ONE: Self = Self(Decimal::ONE);
28    pub const TWO: Self = Self(Decimal::TWO);
29    pub const EIGHT: Self = Self(Decimal::EIGHT);
30}
31
32impl HasSample for Quantity {
33    fn sample() -> Self {
34        Self::ONE
35    }
36    fn sample_other() -> Self {
37        Self::from(dec!(3.5)) // Example of a different quantity
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44    use test_log::test;
45
46    type Sut = Quantity;
47
48    #[test]
49    fn equality() {
50        assert_eq!(Sut::sample(), Sut::sample());
51        assert_eq!(Sut::sample_other(), Sut::sample_other());
52    }
53
54    #[test]
55    fn inequality() {
56        assert_ne!(Sut::sample(), Sut::sample_other());
57    }
58
59    #[test]
60    fn quantity_sample() {
61        let sample = Quantity::sample();
62        assert_eq!(sample, Quantity::ONE);
63    }
64
65    #[test]
66    fn quantity_display() {
67        let quantity = Quantity::from(dec!(3.5));
68        assert_eq!(format!("{}", quantity), "3.5");
69    }
70}