1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
2pub struct Rsum {
3 pub a: u16,
4 pub b: u16,
5}
6
7pub fn calc_rsum_block(data: &[u8]) -> Rsum {
8 let mut a: u16 = 0;
9 let mut b: u16 = 0;
10
11 for &byte in data {
12 a = a.wrapping_add(u16::from(byte));
13 b = b.wrapping_add(a);
14 }
15
16 Rsum { a, b }
17}
18
19#[cfg(test)]
20mod tests {
21 use super::*;
22
23 #[test]
24 fn test_rsum_empty() {
25 let rsum = calc_rsum_block(&[]);
26 assert_eq!(rsum.a, 0);
27 assert_eq!(rsum.b, 0);
28 }
29
30 #[test]
31 fn test_rsum_single_byte() {
32 let rsum = calc_rsum_block(&[1]);
33 assert_eq!(rsum.a, 1);
34 assert_eq!(rsum.b, 1);
35 }
36
37 #[test]
38 fn test_rsum_basic() {
39 let data: Vec<u8> = (0..=255).collect();
40 let rsum = calc_rsum_block(&data);
41 assert!(rsum.a > 0);
42 assert!(rsum.b > 0);
43 }
44}