kago 0.3.0

A crate for custom-width signed and unsigned integers.
Documentation
use crate::*;
use num_traits::*;
use pretty_assertions::assert_eq;
use rstest::*;

#[fixture]
fn i8_vec() -> Vec<i8> {
    ((i8::MIN)..=(i8::MAX)).collect::<Vec<i8>>()
}

#[rstest]
fn test_i8_add(i8_vec: Vec<i8>) {
    for i in i8_vec.iter() {
        for j in i8_vec.iter() {
            let i = *i;
            let j = *j;
            let x = I8::new(i);
            let y = I8::new(j);
            if let Some(expected) = i.checked_add(j) {
                let expected = I8::new(expected);
                assert_eq!(x + y, expected);
                assert_eq!(x.checked_add(&y), Some(expected));
            } else {
                assert_eq!(x.checked_add(&y), None);
            }

            // wrapping版のテスト
            let expected = i.wrapping_add(j);
            let expected = I8::new(expected);
            assert_eq!(x.wrapping_add(&y), expected);
        }
    }
}

#[rstest]
fn test_i8_sub(i8_vec: Vec<i8>) {
    for i in i8_vec.iter() {
        for j in i8_vec.iter() {
            let i = *i;
            let j = *j;
            let x = I8::new(i);
            let y = I8::new(j);
            if let Some(expected) = i.checked_sub(j) {
                let expected = I8::new(expected);
                assert_eq!(x - y, expected);
                assert_eq!(x.checked_sub(&y), Some(expected));
            } else {
                assert_eq!(x.checked_sub(&y), None);
            }

            // wrapping版のテスト
            let expected = i.wrapping_sub(j);
            let expected = I8::new(expected);
            assert_eq!(x.wrapping_sub(&y), expected);
        }
    }
}

#[rstest]
fn test_i8_mul(i8_vec: Vec<i8>) {
    for i in i8_vec.iter() {
        for j in i8_vec.iter() {
            let i = *i;
            let j = *j;
            let x = I8::new(i);
            let y = I8::new(j);
            if let Some(expected) = i.checked_mul(j) {
                let expected = I8::new(expected);
                assert_eq!(x * y, expected);
                assert_eq!(x.checked_mul(&y), Some(expected));
            } else {
                assert_eq!(x.checked_mul(&y), None);
            }
        }
    }
}

#[rstest]
fn test_i8_div(i8_vec: Vec<i8>) {
    for i in i8_vec.iter() {
        for j in i8_vec.iter() {
            let i = *i;
            let j = *j;
            let x = I8::new(i);
            let y = I8::new(j);
            if let Some(expected) = i.checked_div(j) {
                let expected = I8::new(expected);
                assert_eq!(x / y, expected);
                assert_eq!(x.checked_div(&y), Some(expected));
            } else {
                assert_eq!(x.checked_div(&y), None);
            }
        }
    }
}

#[rstest]
fn test_i8_rem(i8_vec: Vec<i8>) {
    for i in i8_vec.iter() {
        for j in i8_vec.iter() {
            let i = *i;
            let j = *j;
            let x = I8::new(i);
            let y = I8::new(j);
            if let Some(expected) = i.checked_rem(j) {
                let expected = I8::new(expected);
                assert_eq!(x % y, expected);
                assert_eq!(x.checked_rem(&y), Some(expected));
            } else {
                assert_eq!(x.checked_rem(&y), None);
            }
        }
    }
}