Skip to main content

subtr_actor/stats/export/
possession.rs

1use crate::*;
2
3use super::*;
4
5impl StatFieldProvider for PossessionStats {
6    fn visit_stat_fields(&self, visitor: &mut dyn FnMut(ExportedStat)) {
7        visitor(ExportedStat::float(
8            "possession",
9            "time",
10            StatUnit::Seconds,
11            self.tracked_time,
12        ));
13        for entry in &self.labeled_time.entries {
14            visitor(ExportedStat::float_labeled(
15                "possession",
16                "time",
17                StatUnit::Seconds,
18                entry.labels.clone(),
19                entry.value,
20            ));
21        }
22        visitor(ExportedStat::float(
23            "possession",
24            "team_zero_time",
25            StatUnit::Seconds,
26            self.team_zero_time,
27        ));
28        visitor(ExportedStat::float(
29            "possession",
30            "team_one_time",
31            StatUnit::Seconds,
32            self.team_one_time,
33        ));
34        visitor(ExportedStat::float(
35            "possession",
36            "neutral_time",
37            StatUnit::Seconds,
38            self.neutral_time,
39        ));
40        visitor(ExportedStat::float(
41            "possession",
42            "team_zero_pct",
43            StatUnit::Percent,
44            self.team_zero_pct(),
45        ));
46        visitor(ExportedStat::float(
47            "possession",
48            "team_one_pct",
49            StatUnit::Percent,
50            self.team_one_pct(),
51        ));
52        visitor(ExportedStat::float(
53            "possession",
54            "neutral_pct",
55            StatUnit::Percent,
56            self.neutral_pct(),
57        ));
58    }
59}
60
61#[cfg(test)]
62mod tests {
63    use super::*;
64
65    #[test]
66    fn possession_export_includes_labeled_time_stats() {
67        let mut stats = PossessionStats {
68            tracked_time: 5.0,
69            ..Default::default()
70        };
71        stats
72            .labeled_time
73            .add([StatLabel::new("possession_state", "team_zero")], 2.5);
74
75        let labeled_stats: Vec<_> = stats
76            .stat_fields()
77            .into_iter()
78            .filter(|stat| {
79                stat.descriptor.domain == "possession"
80                    && stat.descriptor.name == "time"
81                    && stat.descriptor.variant == LABELED_STAT_VARIANT
82            })
83            .collect();
84
85        assert_eq!(labeled_stats.len(), 1);
86        assert_eq!(
87            labeled_stats[0].descriptor.labels,
88            vec![StatLabel::new("possession_state", "team_zero")]
89        );
90        assert_eq!(labeled_stats[0].value, StatValue::Float(2.5));
91    }
92}