Skip to main content

ps_ecc/polynomial/implementations/
sub_assign.rs

1use std::ops::{BitXorAssign, SubAssign};
2
3use crate::Polynomial;
4
5impl SubAssign for Polynomial {
6    fn sub_assign(&mut self, rhs: Self) {
7        BitXorAssign::bitxor_assign(self, rhs);
8    }
9}
10
11impl SubAssign<&Self> for Polynomial {
12    fn sub_assign(&mut self, rhs: &Self) {
13        BitXorAssign::bitxor_assign(self, rhs);
14    }
15}
16
17#[cfg(test)]
18#[allow(clippy::expect_used)]
19mod tests {
20    use crate::Polynomial;
21
22    #[test]
23    fn sub_assign_basic() {
24        let mut a = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid polynomial");
25        let b = Polynomial::try_from(&[4u8, 5, 6][..]).expect("valid polynomial");
26
27        a -= b;
28
29        assert_eq!(a.coefficients(), &[1 ^ 4, 2 ^ 5, 3 ^ 6]);
30    }
31
32    #[test]
33    fn sub_assign_different_degrees() {
34        let mut a = Polynomial::try_from(&[1u8, 2][..]).expect("valid polynomial");
35        let b = Polynomial::try_from(&[3u8, 4, 5, 6][..]).expect("valid polynomial");
36
37        a -= b;
38
39        assert_eq!(a.coefficients(), &[1 ^ 3, 2 ^ 4, 5, 6]);
40    }
41
42    #[test]
43    fn sub_assign_cancels_to_zero() {
44        let mut a = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid polynomial");
45        let b = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid polynomial");
46
47        a -= b;
48
49        assert_eq!(a.degree(), 0);
50        assert_eq!(a.coefficients(), &[0]);
51    }
52
53    #[test]
54    fn sub_assign_with_reference() {
55        let mut a = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid polynomial");
56        let b = Polynomial::try_from(&[4u8, 5, 6][..]).expect("valid polynomial");
57
58        a -= &b;
59
60        assert_eq!(a.coefficients(), &[1 ^ 4, 2 ^ 5, 3 ^ 6]);
61    }
62
63    #[test]
64    fn sub_assign_multiple() {
65        let mut a = Polynomial::try_from(&[1u8][..]).expect("valid polynomial");
66        let b = Polynomial::try_from(&[2u8][..]).expect("valid polynomial");
67        let c = Polynomial::try_from(&[4u8][..]).expect("valid polynomial");
68
69        a -= b;
70        a -= c;
71
72        assert_eq!(a.coefficients(), &[1 ^ 2 ^ 4]);
73    }
74
75    #[test]
76    fn sub_assign_equals_add_assign() {
77        let mut a = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid polynomial");
78        let mut b = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid polynomial");
79        let c = Polynomial::try_from(&[4u8, 5, 6][..]).expect("valid polynomial");
80
81        a -= &c;
82        b += &c;
83
84        assert_eq!(a, b);
85    }
86}