frequenz_microgrid/quantity/
percentage.rs

1// License: MIT
2// Copyright © 2025 Frequenz Energy-as-a-Service GmbH
3
4//! This module defines the `Percentage` quantity and its operations.
5
6qty_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}