Increase test coverage
All checks were successful
timw4mail/rusty-numbers/pipeline/head This commit looks good
All checks were successful
timw4mail/rusty-numbers/pipeline/head This commit looks good
This commit is contained in:
parent
f8b91531b9
commit
e9b125aa7a
125
src/bigint.rs
125
src/bigint.rs
@ -2,11 +2,12 @@
|
|||||||
//! \[WIP\] Arbitrarily large integers
|
//! \[WIP\] Arbitrarily large integers
|
||||||
use crate::num::Sign::*;
|
use crate::num::Sign::*;
|
||||||
use crate::num::*;
|
use crate::num::*;
|
||||||
|
use core::convert::TryInto;
|
||||||
|
use core::mem::replace;
|
||||||
use core::ops::{
|
use core::ops::{
|
||||||
Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Sub, SubAssign,
|
Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Sub, SubAssign,
|
||||||
};
|
};
|
||||||
use core::usize;
|
use core::usize;
|
||||||
use std::convert::TryInto;
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq)]
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
pub struct BigInt {
|
pub struct BigInt {
|
||||||
@ -242,7 +243,7 @@ impl Mul for BigInt {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
out.trim_zeros();
|
out.shrink_to_fit();
|
||||||
|
|
||||||
out
|
out
|
||||||
}
|
}
|
||||||
@ -266,31 +267,36 @@ impl Rem for BigInt {
|
|||||||
|
|
||||||
impl AddAssign for BigInt {
|
impl AddAssign for BigInt {
|
||||||
fn add_assign(&mut self, rhs: Self) {
|
fn add_assign(&mut self, rhs: Self) {
|
||||||
*self = self.clone() + rhs;
|
let this = replace(self, BigInt::new());
|
||||||
|
*self = this + rhs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SubAssign for BigInt {
|
impl SubAssign for BigInt {
|
||||||
fn sub_assign(&mut self, rhs: Self) {
|
fn sub_assign(&mut self, rhs: Self) {
|
||||||
*self = self.clone() - rhs;
|
let this = replace(self, BigInt::new());
|
||||||
|
*self = this - rhs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MulAssign for BigInt {
|
impl MulAssign for BigInt {
|
||||||
fn mul_assign(&mut self, rhs: Self) {
|
fn mul_assign(&mut self, rhs: Self) {
|
||||||
*self = self.clone() * rhs;
|
let this = replace(self, BigInt::new());
|
||||||
|
*self = this * rhs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DivAssign for BigInt {
|
impl DivAssign for BigInt {
|
||||||
fn div_assign(&mut self, rhs: Self) {
|
fn div_assign(&mut self, rhs: Self) {
|
||||||
*self = self.clone() / rhs;
|
let this = replace(self, BigInt::new());
|
||||||
|
*self = this / rhs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RemAssign for BigInt {
|
impl RemAssign for BigInt {
|
||||||
fn rem_assign(&mut self, rhs: Self) {
|
fn rem_assign(&mut self, rhs: Self) {
|
||||||
*self = self.clone() % rhs;
|
let this = replace(self, BigInt::new());
|
||||||
|
*self = this % rhs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -445,6 +451,21 @@ mod tests {
|
|||||||
assert_eq!(sum.inner[1], 1usize);
|
assert_eq!(sum.inner[1], 1usize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_add_assign() {
|
||||||
|
let mut a = BigInt::from(core::usize::MAX);
|
||||||
|
let b = BigInt::from(core::usize::MAX);
|
||||||
|
|
||||||
|
a += b;
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
a.inner[0],
|
||||||
|
core::usize::MAX - 1,
|
||||||
|
"least significant place should be MAX - 1"
|
||||||
|
);
|
||||||
|
assert_eq!(a.inner[1], 1usize, "most significant place should be 1");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_sub() {
|
fn test_sub() {
|
||||||
let a = BigInt::from(core::usize::MAX);
|
let a = BigInt::from(core::usize::MAX);
|
||||||
@ -484,6 +505,69 @@ mod tests {
|
|||||||
assert_eq!(a.inner, vec![core::usize::MAX, core::usize::MAX]);
|
assert_eq!(a.inner, vec![core::usize::MAX, core::usize::MAX]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_mul() {
|
||||||
|
let a = BigInt::from(65536);
|
||||||
|
let b = BigInt::from(4);
|
||||||
|
|
||||||
|
let product = a * b;
|
||||||
|
assert_eq!(product.inner[0], 65536usize * 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_mul_overflow() {
|
||||||
|
let a = BigInt::from(core::usize::MAX);
|
||||||
|
let b = BigInt::from(5);
|
||||||
|
|
||||||
|
let product = a * b;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_mul_assign_overflow() {
|
||||||
|
let mut a = BigInt::from(core::usize::MAX);
|
||||||
|
let b = BigInt::from(5);
|
||||||
|
|
||||||
|
a *= b;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_div() {
|
||||||
|
let a = BigInt::from(128);
|
||||||
|
let b = BigInt::from(32);
|
||||||
|
|
||||||
|
let quotient = a / b;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_div_assign() {
|
||||||
|
let mut a = BigInt::from(128);
|
||||||
|
let b = BigInt::from(32);
|
||||||
|
|
||||||
|
a /= b;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_rem() {
|
||||||
|
let a = BigInt::from(5);
|
||||||
|
let b = BigInt::from(2);
|
||||||
|
|
||||||
|
let rem = a % b;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_rem_assign() {
|
||||||
|
let mut a = BigInt::from(5);
|
||||||
|
let b = BigInt::from(2);
|
||||||
|
|
||||||
|
a %= b;
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_zeros() {
|
fn test_zeros() {
|
||||||
let a = BigInt::new();
|
let a = BigInt::new();
|
||||||
@ -506,21 +590,6 @@ mod tests {
|
|||||||
assert_eq!(b.inner[0], core::usize::MAX);
|
assert_eq!(b.inner[0], core::usize::MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_add_assign() {
|
|
||||||
let mut a = BigInt::from(core::usize::MAX);
|
|
||||||
let b = BigInt::from(core::usize::MAX);
|
|
||||||
|
|
||||||
a += b;
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
a.inner[0],
|
|
||||||
core::usize::MAX - 1,
|
|
||||||
"least significant place should be MAX - 1"
|
|
||||||
);
|
|
||||||
assert_eq!(a.inner[1], 1usize, "most significant place should be 1");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_from() {
|
fn test_from() {
|
||||||
// Signed numbers
|
// Signed numbers
|
||||||
@ -529,4 +598,16 @@ mod tests {
|
|||||||
// Larger than usize
|
// Larger than usize
|
||||||
assert_eq!(BigInt::from(45u128), BigInt::from(45usize));
|
assert_eq!(BigInt::from(45u128), BigInt::from(45usize));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_from_large_unsigned() {
|
||||||
|
BigInt::from(core::u128::MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_from_large_signed() {
|
||||||
|
BigInt::from(128i128);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user