1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct Score {
6 current: u32,
8 best: u32,
10 last_move: u32,
12}
13
14impl Score {
15 pub fn new() -> Self {
17 Self {
18 current: 0,
19 best: 0,
20 last_move: 0,
21 }
22 }
23
24 pub fn current(&self) -> u32 {
26 self.current
27 }
28
29 pub fn best(&self) -> u32 {
31 self.best
32 }
33
34 pub fn last_move(&self) -> u32 {
36 self.last_move
37 }
38
39 pub fn add_merge_points(&mut self, merged_value: u32) {
41 self.last_move = merged_value;
42 self.current += merged_value;
43
44 if self.current > self.best {
45 self.best = self.current;
46 }
47 }
48
49 pub fn reset_current(&mut self) {
51 self.current = 0;
52 self.last_move = 0;
53 }
54
55 pub fn reset_all(&mut self) {
57 self.current = 0;
58 self.best = 0;
59 self.last_move = 0;
60 }
61
62 pub fn calculate_merge_score(merged_value: u32) -> u32 {
64 merged_value
65 }
66}
67
68impl Default for Score {
69 fn default() -> Self {
70 Self::new()
71 }
72}
73
74#[cfg(test)]
75mod tests {
76 use super::*;
77
78 #[test]
79 fn test_score_creation() {
80 let score = Score::new();
81 assert_eq!(score.current(), 0);
82 assert_eq!(score.best(), 0);
83 assert_eq!(score.last_move(), 0);
84 }
85
86 #[test]
87 fn test_score_operations() {
88 let mut score = Score::new();
89
90 score.add_merge_points(4);
92 assert_eq!(score.current(), 4);
93 assert_eq!(score.best(), 4);
94 assert_eq!(score.last_move(), 4);
95
96 score.add_merge_points(8);
98 assert_eq!(score.current(), 12);
99 assert_eq!(score.best(), 12);
100 assert_eq!(score.last_move(), 8);
101
102 score.reset_current();
104 assert_eq!(score.current(), 0);
105 assert_eq!(score.best(), 12); assert_eq!(score.last_move(), 0);
107 }
108
109 #[test]
110 fn test_merge_score_calculation() {
111 assert_eq!(Score::calculate_merge_score(2), 2);
112 assert_eq!(Score::calculate_merge_score(4), 4);
113 assert_eq!(Score::calculate_merge_score(8), 8);
114 assert_eq!(Score::calculate_merge_score(2048), 2048);
115 }
116}