null_kane/calculation/
div.rs

1use crate::{Currency, CurrencyLocale};
2use std::ops::Div;
3
4impl<L: CurrencyLocale> Div<usize> for Currency<L> {
5    type Output = Self;
6
7    fn div(self, rhs: usize) -> Self::Output {
8        Self::new(self.negative, self.amount / rhs, self.locale)
9    }
10}
11
12impl<L: CurrencyLocale> Div<isize> for Currency<L> {
13    type Output = Self;
14
15    fn div(self, rhs: isize) -> Self::Output {
16        Self::new(
17            self.negative ^ rhs.is_negative(),
18            self.amount / rhs.unsigned_abs(),
19            self.locale,
20        )
21    }
22}
23
24impl<L: CurrencyLocale + Default> Div<f32> for Currency<L> {
25    type Output = Self;
26
27    fn div(self, rhs: f32) -> Self::Output {
28        Self::new(
29            self.negative ^ rhs.is_sign_negative(),
30            // multiply by 100 to prevent casting to floats
31            self.amount * 100 / (rhs * 100.0).abs() as usize,
32            self.locale,
33        )
34    }
35}
36
37impl<L: CurrencyLocale + Default> Div<f64> for Currency<L> {
38    type Output = Self;
39
40    fn div(self, rhs: f64) -> Self::Output {
41        Self::new(
42            self.negative ^ rhs.is_sign_negative(),
43            // multiply by 100 to prevent casting to floats
44            self.amount * 100 / (rhs * 100.0).abs() as usize,
45            self.locale,
46        )
47    }
48}
49
50#[cfg(test)]
51mod test {
52    use super::*;
53
54    #[derive(Clone, Copy, Default, Debug, PartialEq)]
55    enum CurrencyL {
56        #[default]
57        De,
58    }
59
60    impl CurrencyLocale for CurrencyL {
61        fn separator(&self) -> char {
62            ','
63        }
64
65        fn thousand_separator(&self) -> char {
66            '.'
67        }
68
69        fn currency_symbol(&self) -> &'static str {
70            "€"
71        }
72    }
73
74    #[test]
75    fn div_usize() {
76        let curr = Currency::new(false, 2_22, CurrencyL::De);
77
78        let expected = curr / 2usize;
79        assert_eq!(expected, Currency::new(false, 1_11, CurrencyL::De));
80    }
81
82    #[test]
83    fn div_isize() {
84        let curr = Currency::new(false, 2_22, CurrencyL::De);
85
86        let expected = curr / 2isize;
87        assert_eq!(expected, Currency::new(false, 1_11, CurrencyL::De));
88    }
89
90    #[test]
91    fn div_isize_negative() {
92        let curr = Currency::new(false, 2_22, CurrencyL::De);
93
94        let expected = curr / -2isize;
95        assert_eq!(expected, Currency::new(true, 1_11, CurrencyL::De));
96    }
97
98    #[test]
99    fn div_negative_isize_negative() {
100        let curr = Currency::new(true, 2_22, CurrencyL::De);
101
102        let expected = curr / -2isize;
103        assert_eq!(expected, Currency::new(false, 1_11, CurrencyL::De));
104    }
105
106    #[test]
107    fn div_negative_isize() {
108        let curr = Currency::new(true, 2_22, CurrencyL::De);
109
110        let expected = curr / 2isize;
111        assert_eq!(expected, Currency::new(true, 1_11, CurrencyL::De));
112    }
113
114    #[test]
115    fn div_f32() {
116        let curr = Currency::new(false, 2_22, CurrencyL::De);
117
118        let expected = curr / 2.0f32;
119        assert_eq!(expected, Currency::new(false, 1_11, CurrencyL::De));
120    }
121
122    #[test]
123    fn div_negative_f32() {
124        let curr = Currency::new(false, 2_22, CurrencyL::De);
125
126        let expected = curr / -2.0f32;
127        assert_eq!(expected, Currency::new(true, 1_11, CurrencyL::De));
128    }
129
130    #[test]
131    fn div_fraction_f32() {
132        let curr = Currency::new(false, 2_22, CurrencyL::De);
133
134        let expected = curr / 0.5f32;
135        assert_eq!(expected, Currency::new(false, 4_44, CurrencyL::De));
136    }
137
138    #[test]
139    fn div_fraction_negative_f32() {
140        let curr = Currency::new(false, 2_22, CurrencyL::De);
141
142        let expected = curr / -0.5f32;
143        assert_eq!(expected, Currency::new(true, 4_44, CurrencyL::De));
144    }
145
146    #[test]
147    fn div_f64() {
148        let curr = Currency::new(false, 2_22, CurrencyL::De);
149
150        let expected = curr / 2.0f64;
151        assert_eq!(expected, Currency::new(false, 1_11, CurrencyL::De));
152    }
153
154    #[test]
155    fn div_negative_f64() {
156        let curr = Currency::new(false, 2_22, CurrencyL::De);
157
158        let expected = curr / -2.0f64;
159        assert_eq!(expected, Currency::new(true, 1_11, CurrencyL::De));
160    }
161
162    #[test]
163    fn div_fraction_f64() {
164        let curr = Currency::new(false, 2_22, CurrencyL::De);
165
166        let expected = curr / 0.5f64;
167        assert_eq!(expected, Currency::new(false, 4_44, CurrencyL::De));
168    }
169
170    #[test]
171    fn div_fraction_negative_f64() {
172        let curr = Currency::new(false, 2_22, CurrencyL::De);
173
174        let expected = curr / -0.5f64;
175        assert_eq!(expected, Currency::new(true, 4_44, CurrencyL::De));
176    }
177}