lean_ctx/core/buddy/
mod.rs1pub 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}