Skip to main content

bevy_reflect/impls/core/
time.rs

1use crate::{
2    std_traits::{ReflectAdd, ReflectAddAssign, ReflectDefault, ReflectSub, ReflectSubAssign},
3    type_registry::{ReflectDeserialize, ReflectSerialize},
4};
5use bevy_reflect_derive::impl_reflect_opaque;
6
7impl_reflect_opaque!(::core::time::Duration(
8    Clone,
9    Debug,
10    Hash,
11    PartialEq,
12    PartialOrd,
13    Serialize,
14    Deserialize,
15    Default,
16    Add,
17    AddAssign,
18    Sub,
19    SubAssign,
20));
21
22#[cfg(test)]
23mod tests {
24    use alloc::boxed::Box;
25    use bevy_reflect::{ReflectSerialize, TypeRegistry};
26    use core::{any::TypeId, time::Duration};
27
28    use crate::prelude::{ReflectAdd, ReflectAddAssign, ReflectSub, ReflectSubAssign};
29
30    #[test]
31    fn can_serialize_duration() {
32        let mut type_registry = TypeRegistry::default();
33        type_registry.register::<Duration>();
34
35        let reflect_serialize = type_registry
36            .get_type_data::<ReflectSerialize>(TypeId::of::<Duration>())
37            .unwrap();
38        let _serializable = reflect_serialize.get_serializable(&Duration::ZERO);
39    }
40
41    #[test]
42    fn should_math_ops_duration() {
43        let mut registry = TypeRegistry::new();
44        registry.register::<Duration>();
45
46        let reflect_add = registry
47            .get_type_data::<ReflectAdd>(TypeId::of::<Duration>())
48            .unwrap();
49        let reflect_add_assign = registry
50            .get_type_data::<ReflectAddAssign>(TypeId::of::<Duration>())
51            .unwrap();
52        let reflect_sub = registry
53            .get_type_data::<ReflectSub>(TypeId::of::<Duration>())
54            .unwrap();
55        let reflect_sub_assign = registry
56            .get_type_data::<ReflectSubAssign>(TypeId::of::<Duration>())
57            .unwrap();
58
59        let mut a = Duration::from_secs(10);
60        let b = Duration::from_secs(4);
61
62        assert_eq!(
63            reflect_add
64                .add(Box::new(a), Box::new(b))
65                .unwrap()
66                .reflect_partial_eq(&Duration::from_secs(14)),
67            Some(true)
68        );
69        assert_eq!(
70            reflect_sub
71                .sub(Box::new(a), Box::new(b))
72                .unwrap()
73                .reflect_partial_eq(&Duration::from_secs(6)),
74            Some(true)
75        );
76
77        reflect_add_assign.add_assign(&mut a, Box::new(b)).unwrap();
78        assert_eq!(a, Duration::from_secs(14));
79
80        reflect_sub_assign.sub_assign(&mut a, Box::new(b)).unwrap();
81        assert_eq!(a, Duration::from_secs(10));
82    }
83}