test(maths): code coverage
This commit is contained in:
parent
869dca85c0
commit
1e1a8457fa
159
src/maths.rs
159
src/maths.rs
|
@ -3,7 +3,7 @@ use std::ops;
|
||||||
pub mod evaluator;
|
pub mod evaluator;
|
||||||
pub mod solver;
|
pub mod solver;
|
||||||
|
|
||||||
//TODO slow ? check Stein's algorithm (binaryGCD)
|
//TODO slow ? check Stein's algorithm (binaryGCD) + tests
|
||||||
fn gcd(a: i128, b: i128) -> i128 {
|
fn gcd(a: i128, b: i128) -> i128 {
|
||||||
if b == 0 {
|
if b == 0 {
|
||||||
a
|
a
|
||||||
|
@ -43,6 +43,7 @@ impl Rational {
|
||||||
Rational::new(self.numerator, self.denominator * 10)
|
Rational::new(self.numerator, self.denominator * 10)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO return string
|
||||||
pub fn print(&self) {
|
pub fn print(&self) {
|
||||||
match (self.numerator, self.denominator) {
|
match (self.numerator, self.denominator) {
|
||||||
(_, 1) => print!("{}", self.numerator),
|
(_, 1) => print!("{}", self.numerator),
|
||||||
|
@ -50,6 +51,7 @@ impl Rational {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO rename or move to better scope, only used in complex div ?
|
||||||
pub fn simplify(lhs: Rational, rhs: Rational) -> Self {
|
pub fn simplify(lhs: Rational, rhs: Rational) -> Self {
|
||||||
let res = Rational::new(lhs.numerator * rhs.denominator, lhs.denominator * rhs.numerator);
|
let res = Rational::new(lhs.numerator * rhs.denominator, lhs.denominator * rhs.numerator);
|
||||||
res.reduce()
|
res.reduce()
|
||||||
|
@ -183,6 +185,7 @@ impl GaussianRational {
|
||||||
GaussianRational::new(self.real, -1 * self.imaginary)
|
GaussianRational::new(self.real, -1 * self.imaginary)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO return string, avoid printing real or imag part if zero
|
||||||
pub fn print(&self) {
|
pub fn print(&self) {
|
||||||
self.real.print();
|
self.real.print();
|
||||||
print!("+");
|
print!("+");
|
||||||
|
@ -252,6 +255,160 @@ impl ops::Div<GaussianRational> for GaussianRational {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn gcd_test() {
|
||||||
|
assert_eq!(gcd(7, 3), 1);
|
||||||
|
assert_eq!(gcd(7, -3), 1);
|
||||||
|
assert_eq!(gcd(-7, 3), -1);
|
||||||
|
assert_eq!(gcd(-7, -3), -1);
|
||||||
|
|
||||||
|
|
||||||
|
assert_eq!(gcd(25, 20), 5);
|
||||||
|
assert_eq!(gcd(25, -20), 5);
|
||||||
|
assert_eq!(gcd(-25, 20), -5);
|
||||||
|
assert_eq!(gcd(-25, -20), -5);
|
||||||
|
|
||||||
|
assert_eq!(gcd(30, 30), 30);
|
||||||
|
}
|
||||||
|
|
||||||
|
mod rational {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn new() {
|
||||||
|
let rational = Rational::new(5, 10);
|
||||||
|
assert_eq!(rational, Rational { numerator: 5, denominator: 10 });
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn reduce() {
|
||||||
|
let rational = Rational::new(20, 10);
|
||||||
|
assert_eq!(rational.reduce(), Rational::new(2, 1));
|
||||||
|
|
||||||
|
let rational = Rational::new(7, -3);
|
||||||
|
assert_eq!(rational.reduce(), Rational::new(-7, 3));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn inverse() {
|
||||||
|
let rational = Rational::new(5, 2);
|
||||||
|
assert_eq!(rational.inverse(), Rational::new(2, 5));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn left_shift() {
|
||||||
|
let rational = Rational::new(7, 3);
|
||||||
|
assert_eq!(rational.left_shift(), Rational::new(7, 30));
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
#[test]
|
||||||
|
fn simplify() {
|
||||||
|
let a = Rational::new(10, 3);
|
||||||
|
let b = Rational::new(7, 2);
|
||||||
|
|
||||||
|
assert_eq!(Rational::simplify(a, b), Rational::new(20, 21));
|
||||||
|
|
||||||
|
|
||||||
|
let a = Rational::new(10, 5);
|
||||||
|
let b = Rational::new(5, 2);
|
||||||
|
|
||||||
|
assert_eq!(Rational::simplify(a, b), Rational::new(4, 5));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn is_zero() {
|
||||||
|
let rational = Rational::new(0, 4);
|
||||||
|
assert_eq!(rational.is_zero(), true);
|
||||||
|
|
||||||
|
let rational = Rational::new(3, 4);
|
||||||
|
assert_eq!(rational.is_zero(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn getters() {
|
||||||
|
let rational = Rational::new(5, 7);
|
||||||
|
assert_eq!(rational.numerator(), 5);
|
||||||
|
assert_eq!(rational.denominator(), 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ops() {
|
||||||
|
let a = Rational::new(5, 7);
|
||||||
|
let b = Rational::new(12, 14);
|
||||||
|
let n = 37;
|
||||||
|
|
||||||
|
assert_eq!(a + b, Rational::new(11, 7));
|
||||||
|
assert_eq!(a - b, Rational::new(-1, 7));
|
||||||
|
assert_eq!(a * b, Rational::new(30, 49));
|
||||||
|
assert_eq!(a / b, Rational::new(5, 6));
|
||||||
|
|
||||||
|
assert_eq!(a + n, Rational::new(264, 7));
|
||||||
|
assert_eq!(n + a, Rational::new(264, 7));
|
||||||
|
assert_eq!(a - n, Rational::new(-254, 7));
|
||||||
|
assert_eq!(n - a, Rational::new(254, 7));
|
||||||
|
assert_eq!(a * n, Rational::new(185, 7));
|
||||||
|
assert_eq!(n * a, Rational::new(185, 7));
|
||||||
|
assert_eq!(a / n, Rational::new(5, 259));
|
||||||
|
assert_eq!(n / a, Rational::new(259, 5));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod gaussian_rational {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn new() {
|
||||||
|
let gaussian_rational = GaussianRational::new(Rational::new(5, 7), Rational::new(8, 3));
|
||||||
|
assert_eq!(gaussian_rational, GaussianRational {
|
||||||
|
real: Rational::new(5, 7),
|
||||||
|
imaginary: Rational::new(8, 3)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn conjugate() {
|
||||||
|
let gaussian_rational = GaussianRational::new(Rational::new(5, 7), Rational::new(8, 3));
|
||||||
|
assert_eq!(gaussian_rational.conjugate(), GaussianRational::new(Rational::new(5, 7), Rational::new(-8, 3)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn is_real() {
|
||||||
|
let gaussian_rational = GaussianRational::new(Rational::new(5, 7), Rational::new(8, 3));
|
||||||
|
assert_eq!(gaussian_rational.is_real(), false);
|
||||||
|
|
||||||
|
let gaussian_rational = GaussianRational::new(Rational::new(5, 7), Rational::new(0, 3));
|
||||||
|
assert_eq!(gaussian_rational.is_real(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn getters() {
|
||||||
|
let gaussian_rational = GaussianRational::new(Rational::new(5, 7), Rational::new(8, 3));
|
||||||
|
assert_eq!(gaussian_rational.real(), Rational::new(5, 7));
|
||||||
|
assert_eq!(gaussian_rational.imaginary(), Rational::new(8, 3));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ops() {
|
||||||
|
let a = GaussianRational::new(Rational::new(5, 7), Rational::new(8, 3));
|
||||||
|
let b = GaussianRational::new(Rational::new(8, 7), Rational::new(7, 3));
|
||||||
|
let n = 3;
|
||||||
|
|
||||||
|
assert_eq!(a + b, GaussianRational::new(Rational::new(13, 7), Rational::new(5, 1)));
|
||||||
|
assert_eq!(a - b, GaussianRational::new(Rational::new(-3, 7), Rational::new(1, 3)));
|
||||||
|
assert_eq!(a * b, GaussianRational::new(Rational::new(-2384, 441), Rational::new(33, 7)));
|
||||||
|
assert_eq!(a / b, GaussianRational::new(Rational::new(3104, 2977), Rational::new(609, 2977)));
|
||||||
|
|
||||||
|
assert_eq!(a * n, GaussianRational::new(Rational::new(15, 7), Rational::new(8, 1)));
|
||||||
|
assert_eq!(n * a, GaussianRational::new(Rational::new(15, 7), Rational::new(8, 1)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
pub struct SquareRoot {
|
pub struct SquareRoot {
|
||||||
rational: Rational,
|
rational: Rational,
|
||||||
|
|
Loading…
Reference in New Issue