Skip to main content

lean_ctx/core/buddy/
mod.rs

1pub mod achievements;
2mod ascension;
3pub mod evolution;
4mod format;
5mod mascot_art;
6mod rpg;
7mod sprite;
8mod types;
9
10pub use evolution::EvolutionStage;
11pub use format::{format_buddy_block, format_buddy_block_at, format_buddy_full};
12pub use types::{BuddyState, Mood, Rarity, Species};
13
14#[cfg(test)]
15mod tests {
16    use super::*;
17    use std::collections::HashMap;
18
19    #[test]
20    fn species_from_cargo_commands() {
21        let mut cmds = HashMap::new();
22        cmds.insert(
23            "cargo build".to_string(),
24            super::super::stats::CommandStats {
25                count: 50,
26                input_tokens: 1000,
27                output_tokens: 500,
28            },
29        );
30        assert_eq!(Species::from_commands(&cmds), Species::Crab);
31    }
32
33    #[test]
34    fn species_mixed_is_dragon() {
35        let mut cmds = HashMap::new();
36        cmds.insert(
37            "cargo build".to_string(),
38            super::super::stats::CommandStats {
39                count: 10,
40                input_tokens: 0,
41                output_tokens: 0,
42            },
43        );
44        cmds.insert(
45            "npm install".to_string(),
46            super::super::stats::CommandStats {
47                count: 10,
48                input_tokens: 0,
49                output_tokens: 0,
50            },
51        );
52        cmds.insert(
53            "python app.py".to_string(),
54            super::super::stats::CommandStats {
55                count: 10,
56                input_tokens: 0,
57                output_tokens: 0,
58            },
59        );
60        assert_eq!(Species::from_commands(&cmds), Species::Dragon);
61    }
62
63    #[test]
64    fn species_empty_is_egg() {
65        let cmds = HashMap::new();
66        assert_eq!(Species::from_commands(&cmds), Species::Egg);
67    }
68
69    #[test]
70    fn rarity_levels() {
71        assert_eq!(Rarity::from_tokens_saved(0), Rarity::Egg);
72        assert_eq!(Rarity::from_tokens_saved(5_000), Rarity::Egg);
73        assert_eq!(Rarity::from_tokens_saved(50_000), Rarity::Common);
74        assert_eq!(Rarity::from_tokens_saved(500_000), Rarity::Uncommon);
75        assert_eq!(Rarity::from_tokens_saved(5_000_000), Rarity::Rare);
76        assert_eq!(Rarity::from_tokens_saved(50_000_000), Rarity::Epic);
77        assert_eq!(Rarity::from_tokens_saved(500_000_000), Rarity::Legendary);
78    }
79
80    #[test]
81    fn name_is_deterministic() {
82        let s = types::user_seed();
83        let n1 = rpg::generate_name(s);
84        let n2 = rpg::generate_name(s);
85        assert_eq!(n1, n2);
86    }
87
88    #[test]
89    fn format_compact_values() {
90        assert_eq!(rpg::format_compact(500), "500");
91        assert_eq!(rpg::format_compact(1_500), "1.5K");
92        assert_eq!(rpg::format_compact(2_500_000), "2.5M");
93        assert_eq!(rpg::format_compact(3_000_000_000), "3.0B");
94    }
95
96    #[test]
97    fn xp_next_level_increases() {
98        let lv1 = (1u64 + 1) * (1 + 1) * 50;
99        let lv10 = (10u64 + 1) * (10 + 1) * 50;
100        assert!(lv10 > lv1);
101    }
102}