Skip to main content

bloop_server_framework/evaluator/
min_bloops.rs

1use crate::achievement::AchievementContext;
2use crate::evaluator::{EvalResult, Evaluator};
3use crate::player::PlayerInfo;
4use std::fmt::Debug;
5
6/// Evaluates that the player has at least a given number of total bloops.
7///
8/// This evaluator returns `true` if the total number of bloops associated with
9/// the player meets or exceeds the configured minimum count. It can be used to
10/// gate achievements based on accumulated activity.
11#[derive(Debug)]
12pub struct MinBloopsEvaluator {
13    min_count: usize,
14}
15
16impl MinBloopsEvaluator {
17    /// Creates a new [`MinBloopsEvaluator`] with a given min count.
18    ///
19    /// # Examples
20    ///
21    /// ```
22    /// use bloop_server_framework::evaluator::min_bloops::MinBloopsEvaluator;
23    ///
24    /// let evaluator = MinBloopsEvaluator::new(10_000);
25    /// ```
26    pub fn new(min_count: usize) -> Self {
27        Self { min_count }
28    }
29}
30
31impl<Player: PlayerInfo, Metadata, Trigger> Evaluator<Player, Metadata, Trigger>
32    for MinBloopsEvaluator
33{
34    fn evaluate(
35        &self,
36        ctx: &AchievementContext<Player, Metadata, Trigger>,
37    ) -> impl Into<EvalResult> {
38        ctx.current_bloop.player().total_bloops() >= self.min_count
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45    use crate::bloop::Bloop;
46    use crate::evaluator::{EvalResult, Evaluator};
47    use crate::test_utils::{MockPlayer, TestCtxBuilder, Utc};
48
49    #[test]
50    fn returns_true_when_enough_bloops() {
51        let (player, _) = MockPlayer::builder().bloops_count(5).build();
52        let bloop = Bloop::new(player.clone(), "client1", Utc::now());
53        let mut builder = TestCtxBuilder::new(bloop);
54        let ctx = builder.build();
55
56        let evaluator = MinBloopsEvaluator::new(3);
57        assert_eq!(evaluator.evaluate(&ctx).into(), EvalResult::AwardSelf);
58    }
59
60    #[test]
61    fn returns_false_when_not_enough_bloops() {
62        let (player, _) = MockPlayer::builder().bloops_count(2).build();
63        let bloop = Bloop::new(player.clone(), "client1", Utc::now());
64        let mut builder = TestCtxBuilder::new(bloop);
65        let ctx = builder.build();
66
67        let evaluator = MinBloopsEvaluator::new(3);
68        assert_eq!(evaluator.evaluate(&ctx).into(), EvalResult::NoAward);
69    }
70}