tuna/
float.rs

1// Author: Tom Solberg <me@sbg.dev>
2// Copyright © 2021, Tom Solberg, all rights reserved.
3// Created: 14 May 2021
4
5/*!
6
7*/
8
9use nanoserde::{DeJson, SerJson};
10
11/// The definition of a float variable
12#[derive(Copy, Clone, Debug)]
13pub struct Float32 {
14    pub(crate) category: &'static str,
15    pub(crate) name: &'static str,
16    pub(crate) default: f32,
17
18    pub(crate) min: Option<f32>,
19    pub(crate) max: Option<f32>,
20}
21
22/// The state of a float variable
23#[derive(Clone, Debug, SerJson, DeJson)]
24pub struct Float32Variable {
25    pub(crate) default: f32,
26
27    pub(crate) min: Option<f32>,
28    pub(crate) max: Option<f32>,
29    pub(crate) current: f32,
30}
31
32/// The definition of a float variable
33#[derive(Copy, Clone, Debug)]
34pub struct Float64 {
35    pub(crate) category: &'static str,
36    pub(crate) name: &'static str,
37    pub(crate) default: f64,
38
39    pub(crate) min: Option<f64>,
40    pub(crate) max: Option<f64>,
41}
42
43/// The state of a float variable
44#[derive(Clone, Debug, SerJson, DeJson)]
45pub struct Float64Variable {
46    pub(crate) default: f64,
47
48    pub(crate) min: Option<f64>,
49    pub(crate) max: Option<f64>,
50    pub(crate) current: f64,
51}
52
53#[cfg(test)]
54mod tests {
55    use super::{Float32, Float64};
56
57    use serial_test::serial;
58
59    const TEST_FLOAT32_1: Float32 = Float32::new("float", "float32_1", 0.1, Some(0.0), Some(1.0));
60    const TEST_FLOAT32_2: Float32 = Float32::new("float", "float32_2", 0.2, None, Some(1.0));
61    const TEST_FLOAT32_3: Float32 = Float32::new("float", "float32_3", 0.3, Some(0.0), None);
62    const TEST_FLOAT32_4: Float32 = Float32::new("float", "float32_4", 0.4, None, None);
63
64    #[test]
65    #[serial]
66    fn default_32() {
67        TEST_FLOAT32_1.register();
68        TEST_FLOAT32_2.register();
69        TEST_FLOAT32_3.register();
70        TEST_FLOAT32_4.register();
71    }
72
73    #[test]
74    #[serial]
75    fn get_32() {
76        TEST_FLOAT32_1.reset();
77        TEST_FLOAT32_2.reset();
78        TEST_FLOAT32_3.reset();
79        TEST_FLOAT32_4.reset();
80        assert_eq!(TEST_FLOAT32_1.read(), 0.1);
81        assert_eq!(TEST_FLOAT32_2.read(), 0.2);
82        assert_eq!(TEST_FLOAT32_3.read(), 0.3);
83        assert_eq!(TEST_FLOAT32_4.read(), 0.4);
84    }
85
86    #[test]
87    #[serial]
88    fn set_high_32() {
89        TEST_FLOAT32_1.write(2.0);
90        TEST_FLOAT32_2.write(2.0);
91        TEST_FLOAT32_3.write(2.0);
92        TEST_FLOAT32_4.write(2.0);
93
94        assert_eq!(TEST_FLOAT32_1.read(), 1.0);
95        assert_eq!(TEST_FLOAT32_2.read(), 1.0);
96        assert_eq!(TEST_FLOAT32_3.read(), 2.0);
97        assert_eq!(TEST_FLOAT32_4.read(), 2.0);
98    }
99
100    #[test]
101    #[serial]
102    fn set_low_32() {
103        TEST_FLOAT32_1.write(-2.0);
104        TEST_FLOAT32_2.write(-2.0);
105        TEST_FLOAT32_3.write(-2.0);
106        TEST_FLOAT32_4.write(-2.0);
107
108        assert_eq!(TEST_FLOAT32_1.read(), 0.0);
109        assert_eq!(TEST_FLOAT32_2.read(), -2.0);
110        assert_eq!(TEST_FLOAT32_3.read(), 0.0);
111        assert_eq!(TEST_FLOAT32_4.read(), -2.0);
112    }
113
114    #[test]
115    #[serial]
116    fn reset_32() {
117        TEST_FLOAT32_1.reset();
118        TEST_FLOAT32_2.reset();
119        TEST_FLOAT32_3.reset();
120        TEST_FLOAT32_4.reset();
121
122        assert_eq!(TEST_FLOAT32_1.read(), 0.1);
123        assert_eq!(TEST_FLOAT32_2.read(), 0.2);
124        assert_eq!(TEST_FLOAT32_3.read(), 0.3);
125        assert_eq!(TEST_FLOAT32_4.read(), 0.4);
126    }
127
128    const TEST_FLOAT64_1: Float64 = Float64::new("float", "float64_1", 0.1, Some(0.0), Some(1.0));
129    const TEST_FLOAT64_2: Float64 = Float64::new("float", "float64_2", 0.2, None, Some(1.0));
130    const TEST_FLOAT64_3: Float64 = Float64::new("float", "float64_3", 0.3, Some(0.0), None);
131    const TEST_FLOAT64_4: Float64 = Float64::new("float", "float64_4", 0.4, None, None);
132
133    #[test]
134    #[serial]
135    fn default_64() {
136        TEST_FLOAT64_1.register();
137        TEST_FLOAT64_2.register();
138        TEST_FLOAT64_3.register();
139        TEST_FLOAT64_4.register();
140    }
141
142    #[test]
143    #[serial]
144    fn get_64() {
145        TEST_FLOAT64_1.reset();
146        TEST_FLOAT64_2.reset();
147        TEST_FLOAT64_3.reset();
148        TEST_FLOAT64_4.reset();
149        assert_eq!(TEST_FLOAT64_1.read(), 0.1);
150        assert_eq!(TEST_FLOAT64_2.read(), 0.2);
151        assert_eq!(TEST_FLOAT64_3.read(), 0.3);
152        assert_eq!(TEST_FLOAT64_4.read(), 0.4);
153    }
154
155    #[test]
156    #[serial]
157    fn set_high_64() {
158        TEST_FLOAT64_1.write(2.0);
159        TEST_FLOAT64_2.write(2.0);
160        TEST_FLOAT64_3.write(2.0);
161        TEST_FLOAT64_4.write(2.0);
162
163        assert_eq!(TEST_FLOAT64_1.read(), 1.0);
164        assert_eq!(TEST_FLOAT64_2.read(), 1.0);
165        assert_eq!(TEST_FLOAT64_3.read(), 2.0);
166        assert_eq!(TEST_FLOAT64_4.read(), 2.0);
167    }
168
169    #[test]
170    #[serial]
171    fn set_low_64() {
172        TEST_FLOAT64_1.write(-2.0);
173        TEST_FLOAT64_2.write(-2.0);
174        TEST_FLOAT64_3.write(-2.0);
175        TEST_FLOAT64_4.write(-2.0);
176
177        assert_eq!(TEST_FLOAT64_1.read(), 0.0);
178        assert_eq!(TEST_FLOAT64_2.read(), -2.0);
179        assert_eq!(TEST_FLOAT64_3.read(), 0.0);
180        assert_eq!(TEST_FLOAT64_4.read(), -2.0);
181    }
182
183    #[test]
184    #[serial]
185    fn reset_64() {
186        TEST_FLOAT64_1.reset();
187        TEST_FLOAT64_2.reset();
188        TEST_FLOAT64_3.reset();
189        TEST_FLOAT64_4.reset();
190
191        assert_eq!(TEST_FLOAT64_1.read(), 0.1);
192        assert_eq!(TEST_FLOAT64_2.read(), 0.2);
193        assert_eq!(TEST_FLOAT64_3.read(), 0.3);
194        assert_eq!(TEST_FLOAT64_4.read(), 0.4);
195    }
196}