frequenz_microgrid/quantity/
percentage.rs1qty_ctor! {
7 #[doc = "A quantity representing a percentage (typically 0% to 100%)."]
8 Percentage => {
9 (from_percentage, as_percentage, "%", 1.0),
10 (from_fraction, as_fraction, None, 100.0),
11 }
12}
13
14#[cfg(test)]
15mod tests {
16 use super::Percentage;
17 use crate::quantity::{Quantity as _, test_utils::assert_f32_eq};
18
19 #[test]
20 fn test_percentage() {
21 let perc_1 = Percentage::from_percentage(50.0);
22
23 assert_f32_eq(perc_1.as_percentage(), 50.0);
24 assert_f32_eq(perc_1.as_fraction(), 0.5);
25
26 let perc_2 = Percentage::from_fraction(0.8);
27 assert_f32_eq(perc_2.as_percentage(), 80.0);
28 assert_f32_eq(perc_2.as_fraction(), 0.8);
29
30 assert!(perc_1 < perc_2);
31 assert!(perc_2 > perc_1);
32
33 assert_f32_eq((perc_1 + perc_2).as_percentage(), 130.0);
34 assert_f32_eq((perc_2 - perc_1).as_percentage(), 30.0);
35 assert_f32_eq((perc_1 * 2.0).as_percentage(), 100.0);
36 assert_f32_eq((perc_2 / 2.0).as_percentage(), 40.0);
37 assert_f32_eq((perc_1 * perc_2).as_percentage(), 40.0);
38 assert_f32_eq(perc_2 / perc_1, 1.6);
39
40 assert_f32_eq(Percentage::zero().as_percentage(), 0.0);
41
42 let perc_3 = Percentage::from_percentage(150.0);
43 assert_f32_eq(perc_3.as_fraction(), 1.5);
44 let perc_4 = Percentage::from_fraction(-0.1);
45 assert_f32_eq(perc_4.as_percentage(), -10.0);
46
47 assert!(perc_3 > Percentage::from_percentage(100.0));
48 assert!(perc_4 < Percentage::from_percentage(0.0));
49 assert!(perc_4 > Percentage::from_percentage(-20.0));
50 }
51
52 #[test]
53 fn test_percentage_formatting() {
54 let s = |value| Percentage::from_percentage(value).to_string();
55 let p = |value, prec| format!("{:.prec$}", Percentage::from_percentage(value), prec = prec);
56 assert_eq!(s(0.0), "0 %");
57 assert_eq!(s(12.3456), "12.346 %");
58 assert_eq!(p(12.3456, 2), "12.35 %");
59 assert_eq!(p(12.3456, 4), "12.3456 %");
60 assert_eq!(p(12.3456, 5), "12.3456 %");
61 assert_eq!(s(100.0), "100 %");
62 assert_eq!(s(-5.5), "-5.5 %");
63 assert_eq!(s(1234.5678), "1234.568 %");
64 assert_eq!(p(-1234.5678, 1), "-1234.6 %");
65 }
66}