1use crate::smoke::get_smoke_particles;
2
3pub fn debug_smoke_state() -> String {
4 let particles = get_smoke_particles();
5
6 let mut output = String::from("\n=== SMOKE STATE ===\n");
7 output.push_str(&format!("Total particles: {}\n", particles.len()));
8
9 for (i, p) in particles.iter().enumerate() {
10 output.push_str(&format!(
11 " [{}] x={:3} y={:3} pattern={:2} kind={} \n",
12 i, p.x, p.y, p.pattern, p.kind
13 ));
14 }
15
16 output.push_str("==================\n");
17 output
18}
19
20#[cfg(test)]
21mod tests {
22
23 #[test]
24 fn test_smoke_patterns() {
25 let patterns = vec![
27 "( )", "( )", "( )", "( )", "( )", "( )", "( )", "( )", "()", "()", "O",
28 "O", "O", "O", "O", " ",
29 ];
30
31 assert_eq!(patterns.len(), 16, "Must have 16 smoke patterns");
32 }
33
34 #[test]
35 fn test_dy_dx_arrays() {
36 let dy = vec![2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
37 let dx = vec![-2, -1, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3];
38
39 assert_eq!(dy.len(), 16, "DY array must have 16 elements");
40 assert_eq!(dx.len(), 16, "DX array must have 16 elements");
41
42 assert_eq!(dy[0], 2, "dy[0] should be 2 (expand upward)");
44 assert_eq!(dx[0], -2, "dx[0] should be -2 (leftward)");
45 assert_eq!(dy[4], 0, "dy[4] should be 0 (contract stops moving up)");
46 assert_eq!(dx[14], 3, "dx[14] should be 3 (rightward at end)");
47 }
48
49 #[test]
50 fn test_eraser_patterns() {
51 let erasers = vec![
52 " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ",
53 " ", " ", " ", " ", " ",
54 ];
55
56 assert_eq!(erasers.len(), 16, "Must have 16 eraser patterns");
57 }
58}