Skip to main content

subtr_actor/stats/export/
movement.rs

1use crate::*;
2
3use super::*;
4
5impl StatFieldProvider for MovementStats {
6    fn visit_stat_fields(&self, visitor: &mut dyn FnMut(ExportedStat)) {
7        visitor(ExportedStat::float(
8            "movement",
9            "tracked_time",
10            StatUnit::Seconds,
11            self.tracked_time,
12        ));
13        for entry in self.complete_labeled_tracked_time().entries {
14            visitor(ExportedStat::float_labeled(
15                "movement",
16                "tracked_time",
17                StatUnit::Seconds,
18                entry.labels,
19                entry.value,
20            ));
21        }
22        visitor(ExportedStat::float(
23            "movement",
24            "total_distance",
25            StatUnit::UnrealUnits,
26            self.total_distance,
27        ));
28        visitor(ExportedStat::float(
29            "movement",
30            "avg_speed",
31            StatUnit::UnrealUnitsPerSecond,
32            self.average_speed(),
33        ));
34        visitor(ExportedStat::float(
35            "movement",
36            "time_supersonic_speed",
37            StatUnit::Seconds,
38            self.time_supersonic_speed,
39        ));
40        visitor(ExportedStat::float(
41            "movement",
42            "time_boost_speed",
43            StatUnit::Seconds,
44            self.time_boost_speed,
45        ));
46        visitor(ExportedStat::float(
47            "movement",
48            "time_slow_speed",
49            StatUnit::Seconds,
50            self.time_slow_speed,
51        ));
52        visitor(ExportedStat::float(
53            "movement",
54            "time_ground",
55            StatUnit::Seconds,
56            self.time_on_ground,
57        ));
58        visitor(ExportedStat::float(
59            "movement",
60            "time_low_air",
61            StatUnit::Seconds,
62            self.time_low_air,
63        ));
64        visitor(ExportedStat::float(
65            "movement",
66            "time_high_air",
67            StatUnit::Seconds,
68            self.time_high_air,
69        ));
70        visitor(ExportedStat::float(
71            "movement",
72            "avg_speed_percentage",
73            StatUnit::Percent,
74            self.average_speed_pct(),
75        ));
76        visitor(ExportedStat::float(
77            "movement",
78            "percent_slow_speed",
79            StatUnit::Percent,
80            self.slow_speed_pct(),
81        ));
82        visitor(ExportedStat::float(
83            "movement",
84            "percent_boost_speed",
85            StatUnit::Percent,
86            self.boost_speed_pct(),
87        ));
88        visitor(ExportedStat::float(
89            "movement",
90            "percent_supersonic_speed",
91            StatUnit::Percent,
92            self.supersonic_speed_pct(),
93        ));
94        visitor(ExportedStat::float(
95            "movement",
96            "percent_ground",
97            StatUnit::Percent,
98            self.on_ground_pct(),
99        ));
100        visitor(ExportedStat::float(
101            "movement",
102            "percent_low_air",
103            StatUnit::Percent,
104            self.low_air_pct(),
105        ));
106        visitor(ExportedStat::float(
107            "movement",
108            "percent_high_air",
109            StatUnit::Percent,
110            self.high_air_pct(),
111        ));
112    }
113}
114
115#[cfg(test)]
116mod tests {
117    use super::*;
118
119    #[test]
120    fn movement_export_includes_labeled_tracked_time_stats() {
121        let mut stats = MovementStats {
122            tracked_time: 3.0,
123            ..Default::default()
124        };
125        stats.labeled_tracked_time.add(
126            [
127                StatLabel::new("speed_band", "boost"),
128                StatLabel::new("height_band", "low_air"),
129            ],
130            1.25,
131        );
132
133        let labeled_stats: Vec<_> = stats
134            .stat_fields()
135            .into_iter()
136            .filter(|stat| {
137                stat.descriptor.domain == "movement"
138                    && stat.descriptor.name == "tracked_time"
139                    && stat.descriptor.variant == LABELED_STAT_VARIANT
140            })
141            .collect();
142
143        assert_eq!(labeled_stats.len(), 9);
144        assert_eq!(
145            labeled_stats
146                .iter()
147                .find(|stat| {
148                    stat.descriptor.labels
149                        == vec![
150                            StatLabel::new("height_band", "low_air"),
151                            StatLabel::new("speed_band", "boost"),
152                        ]
153                })
154                .unwrap()
155                .descriptor
156                .labels,
157            vec![
158                StatLabel::new("height_band", "low_air"),
159                StatLabel::new("speed_band", "boost"),
160            ]
161        );
162        assert_eq!(
163            labeled_stats
164                .iter()
165                .find(|stat| {
166                    stat.descriptor.labels
167                        == vec![
168                            StatLabel::new("height_band", "low_air"),
169                            StatLabel::new("speed_band", "boost"),
170                        ]
171                })
172                .unwrap()
173                .value,
174            StatValue::Float(1.25)
175        );
176        assert_eq!(
177            labeled_stats
178                .iter()
179                .find(|stat| {
180                    stat.descriptor.labels
181                        == vec![
182                            StatLabel::new("height_band", "ground"),
183                            StatLabel::new("speed_band", "slow"),
184                        ]
185                })
186                .unwrap()
187                .value,
188            StatValue::Float(0.0)
189        );
190    }
191}