Skip to main content

ps_ecc/polynomial/methods/
iter.rs

1use crate::Polynomial;
2
3impl Polynomial {
4    /// Returns an iterator over the coefficients, from degree 0 to the
5    /// leading term.
6    pub fn iter(&self) -> std::slice::Iter<'_, u8> {
7        self.coefficients().iter()
8    }
9}
10
11#[cfg(test)]
12#[allow(clippy::expect_used)]
13mod tests {
14    use crate::Polynomial;
15
16    #[test]
17    fn iter_basic() {
18        let poly = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid polynomial");
19        let coeffs: Vec<u8> = poly.iter().copied().collect();
20
21        assert_eq!(coeffs, vec![1, 2, 3]);
22    }
23
24    #[test]
25    fn iter_in_for_loop() {
26        let poly = Polynomial::try_from(&[4u8, 5, 6][..]).expect("valid polynomial");
27        let mut sum = 0u8;
28
29        for &coef in &poly {
30            sum ^= coef;
31        }
32
33        assert_eq!(sum, 4 ^ 5 ^ 6);
34    }
35
36    #[test]
37    fn iter_empty_polynomial() {
38        let poly = Polynomial::default();
39        let coeffs: Vec<u8> = poly.iter().copied().collect();
40
41        assert_eq!(coeffs, vec![0]);
42    }
43
44    #[test]
45    fn iter_with_adapters() {
46        let poly = Polynomial::try_from(&[1u8, 2, 3, 4][..]).expect("valid polynomial");
47        let doubled: Vec<u8> = poly.iter().map(|&c| c.wrapping_mul(2)).collect();
48
49        assert_eq!(doubled, vec![2, 4, 6, 8]);
50    }
51
52    #[test]
53    fn iter_length_matches_degree_plus_one() {
54        let poly = Polynomial::try_from(&[1u8, 2, 3, 4, 5][..]).expect("valid polynomial");
55
56        assert_eq!(poly.iter().count(), 5);
57        assert_eq!(poly.iter().count(), poly.degree() as usize + 1);
58    }
59
60    #[test]
61    fn iter_max_degree() {
62        let coeffs = [1u8; 255];
63        let poly = Polynomial::try_from(&coeffs[..]).expect("valid polynomial");
64
65        assert_eq!(poly.iter().count(), 255);
66    }
67
68    #[test]
69    fn iter_sparse_polynomial() {
70        let poly = Polynomial::try_from(&[0u8, 0, 0, 1][..]).expect("valid polynomial");
71        let coeffs: Vec<u8> = poly.iter().copied().collect();
72
73        assert_eq!(coeffs, vec![0, 0, 0, 1]);
74    }
75
76    #[test]
77    fn iter_is_borrowing() {
78        let poly = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid polynomial");
79
80        let _ = poly.iter();
81        let _ = poly.iter();
82
83        assert_eq!(poly.degree(), 2);
84    }
85}