frequenz_microgrid/quantity/
frequency.rs

1// License: MIT
2// Copyright © 2025 Frequenz Energy-as-a-Service GmbH
3
4//! This module defines the `Frequency` quantity and its operations.
5
6qty_ctor! {
7    #[doc = "A physical quantity representing frequency."]
8    Frequency => {
9        (from_hertz, as_hertz, "Hz", 1.0),
10        (from_kilohertz, as_kilohertz, "kHz", 1e3),
11        (from_megahertz, as_megahertz, "MHz", 1e6),
12        (from_gigahertz, as_gigahertz, "GHz", 1e9),
13    }
14}
15
16#[cfg(test)]
17mod tests {
18    use super::Frequency;
19    use crate::quantity::{Percentage, Quantity as _, test_utils::assert_f32_eq};
20
21    #[test]
22    fn test_frequency() {
23        let freq_1 = Frequency::from_hertz(1000.0);
24
25        assert_f32_eq(freq_1.as_hertz(), 1000.0);
26        assert_f32_eq(freq_1.as_kilohertz(), 1.0);
27        assert_f32_eq(freq_1.as_megahertz(), 0.001);
28        assert_f32_eq(freq_1.as_gigahertz(), 0.000_001);
29
30        let freq_2 = Frequency::from_kilohertz(1.2);
31        assert_f32_eq(freq_2.as_hertz(), 1200.0);
32
33        let freq_2 = Frequency::from_megahertz(0.0012);
34        assert_f32_eq(freq_2.as_hertz(), 1200.0);
35
36        let freq_2 = Frequency::from_gigahertz(0.000_0012);
37        assert_f32_eq(freq_2.as_hertz(), 1200.0);
38
39        assert!(freq_1 < freq_2);
40        assert!(freq_2 > freq_1);
41
42        assert_f32_eq((freq_1 + freq_2).as_hertz(), 2200.0);
43        assert_f32_eq((freq_2 - freq_1).as_hertz(), 200.0);
44        assert_f32_eq((freq_1 * 2.0).as_hertz(), 2000.0);
45        assert_f32_eq((freq_2 / 2.0).as_hertz(), 600.0);
46        assert_f32_eq(
47            (freq_2 * Percentage::from_percentage(50.0)).as_hertz(),
48            600.0,
49        );
50        assert_f32_eq(freq_2 / freq_1, 1.2);
51
52        assert_f32_eq(Frequency::zero().as_hertz(), 0.0);
53    }
54
55    #[test]
56    fn test_frequency_formatting() {
57        let s = |value| Frequency::from_hertz(value).to_string();
58        let p = |value, prec| format!("{:.prec$}", Frequency::from_hertz(value), prec = prec);
59        assert_eq!(s(0.0), "0 Hz");
60
61        assert_eq!(s(1.558), "1.558 Hz");
62        assert_eq!(p(1.558, 1), "1.6 Hz");
63
64        assert_eq!(s(1.5508), "1.551 Hz");
65        assert_eq!(p(1.5508, 5), "1.5508 Hz");
66
67        assert_eq!(s(2030.0), "2.03 kHz");
68
69        assert_eq!(s(2_030_022.0), "2.03 MHz");
70        assert_eq!(s(2_030_022_123.0), "2.03 GHz");
71        assert_eq!(p(2_030_022_123.0, 6), "2.030022 GHz");
72
73        assert_eq!(s(-1.558), "-1.558 Hz");
74        assert_eq!(p(-1.558, 1), "-1.6 Hz");
75
76        assert_eq!(s(-2030.0), "-2.03 kHz");
77        assert_eq!(p(-2030.0, 1), "-2 kHz");
78
79        assert_eq!(s(-2_030_022.0), "-2.03 MHz");
80        assert_eq!(s(-2_030_022_123.0), "-2.03 GHz");
81        assert_eq!(p(-2_030_022_123.0, 6), "-2.030022 GHz");
82    }
83}