bloop_server_framework/evaluator/
min_bloops.rs1use crate::achievement::AchievementContext;
2use crate::evaluator::{EvalResult, Evaluator};
3use crate::player::PlayerInfo;
4use std::fmt::Debug;
5
6#[derive(Debug)]
12pub struct MinBloopsEvaluator {
13 min_count: usize,
14}
15
16impl MinBloopsEvaluator {
17 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}