#[cfg(test)]
use std::fmt::Debug;
use std::ops::Mul;
#[cfg(test)]
use super::assert_abelian_group_laws;
use super::AbelianGroup;
pub trait One: Sized + Mul<Self, Output = Self> {
fn one() -> Self;
}
pub trait CommutativeRing: AbelianGroup + Mul<Self, Output = Self> + One {}
#[cfg(test)]
pub fn assert_commutative_ring_laws<T>(values: &[T])
where T: CommutativeRing + Clone + Eq + Debug {
assert_abelian_group_laws(values);
for a in values {
assert_eq!(a.clone() * T::one(), *a);
assert_eq!(T::one() * a.clone(), *a);
for b in values {
let lhs = a.clone() * b.clone();
let rhs = b.clone() * a.clone();
assert_eq!(lhs, rhs);
for c in values {
let lhs = (a.clone() * b.clone()) * c.clone();
let rhs = a.clone() * (b.clone() * c.clone());
assert_eq!(lhs, rhs);
let lhs = a.clone() * (b.clone() + c.clone());
let rhs = (a.clone() * b.clone()) + (a.clone() * c.clone());
assert_eq!(lhs, rhs);
}
}
}
}