gizmo_scripting/
api_time.rs1use mlua::prelude::*;
6
7pub fn register_time_api(lua: &Lua) -> Result<(), LuaError> {
9 crate::api_table::register_protected(lua, "time", |time_table| {
10
11 time_table.raw_set("_dt", 0.0f32)?;
12 time_table.raw_set("_elapsed", 0.0f32)?;
13 time_table.raw_set("_fps", 60.0f32)?;
14
15
16 lua.load(
18 r#"
19 function time.dt()
20 return time._dt
21 end
22
23 function time.elapsed()
24 return time._elapsed
25 end
26
27 function time.fps()
28 return time._fps
29 end
30 "#,
31 )
32 .exec()?;
33
34 Ok(())
35 })
36}
37
38pub fn update_time_api(lua: &Lua, dt: f32, elapsed: f32, fps: f32) -> Result<(), LuaError> {
40 let time_table = crate::api_table::raw(lua, "time")?;
43 time_table.raw_set("_dt", dt)?;
44 time_table.raw_set("_elapsed", elapsed)?;
45 time_table.raw_set("_fps", fps)?;
46 Ok(())
47}
48
49#[cfg(test)]
50mod tests {
51 use super::*;
52 use mlua::Lua;
53
54 fn eval_f32(lua: &Lua, expr: &str) -> f32 {
55 lua.load(format!("return {expr}")).eval().unwrap()
56 }
57
58 #[test]
60 fn defaults_after_register() {
61 let lua = Lua::new();
62 register_time_api(&lua).unwrap();
63 assert_eq!(eval_f32(&lua, "time.dt()"), 0.0);
64 assert_eq!(eval_f32(&lua, "time.elapsed()"), 0.0);
65 assert_eq!(eval_f32(&lua, "time.fps()"), 60.0);
66 }
67
68 #[test]
70 fn update_reflects_and_overwrites() {
71 let lua = Lua::new();
72 register_time_api(&lua).unwrap();
73
74 update_time_api(&lua, 0.016, 1.5, 62.5).unwrap();
75 assert!((eval_f32(&lua, "time.dt()") - 0.016).abs() < 1e-6);
76 assert!((eval_f32(&lua, "time.elapsed()") - 1.5).abs() < 1e-6);
77 assert!((eval_f32(&lua, "time.fps()") - 62.5).abs() < 1e-6);
78
79 update_time_api(&lua, 0.033, 9.0, 30.0).unwrap();
81 assert!((eval_f32(&lua, "time.dt()") - 0.033).abs() < 1e-6);
82 assert!((eval_f32(&lua, "time.elapsed()") - 9.0).abs() < 1e-6);
83 assert!((eval_f32(&lua, "time.fps()") - 30.0).abs() < 1e-6);
84 }
85}