Skip to main content

ps_ecc/polynomial/implementations/
partial_eq.rs

1use crate::Polynomial;
2
3impl PartialEq for Polynomial {
4    fn eq(&self, other: &Self) -> bool {
5        if self.degree != other.degree {
6            return false;
7        }
8
9        let len = self.degree as usize + 1;
10
11        self.coefficients[..len] == other.coefficients[..len]
12    }
13}
14
15#[cfg(test)]
16#[allow(clippy::expect_used)]
17mod tests {
18    use crate::Polynomial;
19
20    #[test]
21    fn equal_polynomials() {
22        let a = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid");
23        let b = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid");
24
25        assert_eq!(a, b);
26    }
27
28    #[test]
29    fn different_degrees_not_equal() {
30        let a = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid");
31        let b = Polynomial::try_from(&[1u8, 2][..]).expect("valid");
32
33        assert_ne!(a, b);
34    }
35
36    #[test]
37    fn same_degree_different_coefficients() {
38        let a = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid");
39        let b = Polynomial::try_from(&[1u8, 2, 4][..]).expect("valid");
40
41        assert_ne!(a, b);
42    }
43
44    #[test]
45    fn zero_polynomials_equal() {
46        let a = Polynomial::default();
47        let b = Polynomial::default();
48
49        assert_eq!(a, b);
50    }
51
52    #[test]
53    fn zero_vs_nonzero_not_equal() {
54        let a = Polynomial::default();
55        let b = Polynomial::try_from(&[1u8][..]).expect("valid");
56
57        assert_ne!(a, b);
58    }
59
60    #[test]
61    fn reflexive() {
62        let p = Polynomial::try_from(&[5u8, 10, 15][..]).expect("valid");
63
64        assert_eq!(p, p);
65    }
66
67    #[test]
68    fn symmetric() {
69        let a = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid");
70        let b = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid");
71
72        assert_eq!(a == b, b == a);
73    }
74
75    #[test]
76    fn transitive() {
77        let a = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid");
78        let b = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid");
79        let c = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid");
80
81        assert!(a == b && b == c && a == c);
82    }
83
84    #[test]
85    fn trailing_zeros_trimmed_equal() {
86        let a = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid");
87        let b = Polynomial::try_from(&[1u8, 2, 3, 0, 0][..]).expect("valid");
88
89        assert_eq!(a, b);
90    }
91
92    #[test]
93    fn only_compares_relevant_coefficients() {
94        let mut a = Polynomial::default();
95        let mut b = Polynomial::default();
96
97        a.set(0, 1);
98        b.set(0, 1);
99
100        // Manually set garbage beyond degree (simulating uninitialized memory)
101        // This shouldn't affect equality since degree is 0
102        // Note: We can't actually do this safely, but the test verifies
103        // that equality only checks up to degree
104        assert_eq!(a, b);
105    }
106}