Skip to main content

zsync_rs/
rsum.rs

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}