galeon_engine/
virtual_time.rs1pub struct VirtualTime {
24 pub paused: bool,
26 pub scale: f64,
31 pub max_delta: f64,
35 pub elapsed: f64,
38}
39
40impl VirtualTime {
41 pub fn new() -> Self {
43 Self {
44 paused: false,
45 scale: 1.0,
46 max_delta: 0.25,
47 elapsed: 0.0,
48 }
49 }
50
51 pub fn effective_elapsed(&self, raw: f64) -> f64 {
56 if self.paused {
57 return 0.0;
58 }
59 let clamped = raw.min(self.max_delta).max(0.0);
60 let scale = self.scale.clamp(0.0, 8.0);
61 clamped * scale
62 }
63}
64
65impl Default for VirtualTime {
66 fn default() -> Self {
67 Self::new()
68 }
69}
70
71#[cfg(test)]
72mod tests {
73 use super::*;
74
75 #[test]
76 fn default_values() {
77 let vt = VirtualTime::new();
78 assert!(!vt.paused);
79 assert!((vt.scale - 1.0).abs() < f64::EPSILON);
80 assert!((vt.max_delta - 0.25).abs() < f64::EPSILON);
81 assert!((vt.elapsed - 0.0).abs() < f64::EPSILON);
82 }
83
84 #[test]
85 fn effective_elapsed_normal() {
86 let vt = VirtualTime::new();
87 let e = vt.effective_elapsed(0.1);
88 assert!((e - 0.1).abs() < f64::EPSILON);
89 }
90
91 #[test]
92 fn effective_elapsed_paused() {
93 let mut vt = VirtualTime::new();
94 vt.paused = true;
95 assert_eq!(vt.effective_elapsed(1.0), 0.0);
96 assert_eq!(vt.effective_elapsed(0.0), 0.0);
97 }
98
99 #[test]
100 fn effective_elapsed_scaled() {
101 let mut vt = VirtualTime::new();
102 vt.scale = 2.0;
103 let e = vt.effective_elapsed(0.1);
104 assert!((e - 0.2).abs() < f64::EPSILON);
105
106 vt.scale = 0.5;
107 let e = vt.effective_elapsed(0.1);
108 assert!((e - 0.05).abs() < f64::EPSILON);
109 }
110
111 #[test]
112 fn effective_elapsed_max_delta_clamp() {
113 let vt = VirtualTime::new(); let e = vt.effective_elapsed(2.0); assert!((e - 0.25).abs() < f64::EPSILON);
116 }
117
118 #[test]
119 fn effective_elapsed_scale_and_clamp_interact() {
120 let mut vt = VirtualTime::new(); vt.scale = 4.0;
122 let e = vt.effective_elapsed(2.0); assert!((e - 1.0).abs() < f64::EPSILON);
124 }
125
126 #[test]
127 fn scale_clamped_to_bounds() {
128 let mut vt = VirtualTime::new();
129 vt.scale = -1.0;
130 assert_eq!(vt.effective_elapsed(0.1), 0.0); vt.scale = 100.0;
133 let e = vt.effective_elapsed(0.1);
134 assert!((e - 0.8).abs() < f64::EPSILON); }
136
137 #[test]
138 fn negative_raw_clamped_to_zero() {
139 let vt = VirtualTime::new();
140 assert_eq!(vt.effective_elapsed(-0.5), 0.0);
141 }
142}