ps-ecc 0.1.0-9

Generates Reed-Solomon error correction codes.
Documentation
use std::cmp::Ordering;

use crate::Polynomial;

impl Ord for Polynomial {
    fn cmp(&self, other: &Self) -> Ordering {
        self.degree().cmp(&other.degree()).then_with(|| {
            let d = self.degree() as usize;

            self.coefficients[..=d]
                .iter()
                .rev()
                .cmp(other.coefficients[..=d].iter().rev())
        })
    }
}

#[cfg(test)]
mod tests {
    use std::cmp::Ordering::{Equal, Greater, Less};

    use crate::Polynomial;

    #[test]
    fn equal_zero_polynomials() {
        let a = Polynomial::default();
        let b = Polynomial::default();

        assert_eq!(a.cmp(&b), Equal);
    }

    #[test]
    fn equal_nonzero_polynomials() {
        let mut a = Polynomial::default();
        let mut b = Polynomial::default();

        a.set(2, 5);
        a.set(0, 3);
        b.set(2, 5);
        b.set(0, 3);

        assert_eq!(a.cmp(&b), Equal);
    }

    #[test]
    fn higher_degree_is_greater() {
        let mut a = Polynomial::default();
        let mut b = Polynomial::default();

        a.set(3, 1);
        b.set(2, 255);

        assert_eq!(a.cmp(&b), Greater);
        assert_eq!(b.cmp(&a), Less);
    }

    #[test]
    fn same_degree_compare_leading_coefficient() {
        let mut a = Polynomial::default();
        let mut b = Polynomial::default();

        a.set(2, 10);
        b.set(2, 5);

        assert_eq!(a.cmp(&b), Greater);
        assert_eq!(b.cmp(&a), Less);
    }

    #[test]
    fn same_degree_equal_leading_compare_next() {
        let mut a = Polynomial::default();
        let mut b = Polynomial::default();

        a.set(2, 5);
        a.set(1, 10);
        b.set(2, 5);
        b.set(1, 3);

        assert_eq!(a.cmp(&b), Greater);
        assert_eq!(b.cmp(&a), Less);
    }

    #[test]
    fn same_degree_differ_only_at_constant() {
        let mut a = Polynomial::default();
        let mut b = Polynomial::default();

        a.set(2, 5);
        a.set(0, 2);
        b.set(2, 5);
        b.set(0, 1);

        assert_eq!(a.cmp(&b), Greater);
        assert_eq!(b.cmp(&a), Less);
    }

    #[test]
    fn reflexive() {
        let mut p = Polynomial::default();

        p.set(3, 7);
        p.set(1, 2);

        assert_eq!(p.cmp(&p), Equal);
    }

    #[test]
    fn transitive() {
        let mut a = Polynomial::default();
        let mut b = Polynomial::default();
        let mut c = Polynomial::default();

        a.set(1, 1);
        b.set(1, 2);
        c.set(1, 3);

        assert_eq!(a.cmp(&b), Less);
        assert_eq!(b.cmp(&c), Less);
        assert_eq!(a.cmp(&c), Less);
    }
}