1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
pub mod fix32;

/*   TODO:
    - overflow checks
    - Benchmark operations looking for performance problems

*/

#[cfg(test)]
mod tests {
    #[test]
    fn creation() {
        let n1 = super::fix32::Fix32::new();
        assert_eq!(n1.n, 0);
        let n1 = super::fix32::Fix32::from_i32(21_i32);
        assert_eq!(n1.n, 21000_i32);
        let n1 = super::fix32::Fix32::from_i64(-4_i64);
        assert_eq!(n1.n, -4000_i32);
        let n1 = super::fix32::Fix32::from_f32(3.1416);
        assert_eq!(n1.n, 3141_i32);
        let n1 = super::fix32::Fix32::from_f64(-1.23456789_f64);
        assert_eq!(n1.n, -1234_i32);
        let n1 = super::fix32::Fix32::with_n(456789_i32);
        assert_eq!(n1.n, 456789_i32);
    }

    #[test]
    fn get_values_from() {
        let mut n1 = super::fix32::Fix32::from_f32(1.23456_f32);
        assert_eq!((n1.get_f32() - 1.234_f32).abs() < 0.001_f32, true);
        assert_eq!((n1.get_f64() - 1.234_f64).abs() < 0.001_f64, true);
        assert_eq!(n1.get_str(), String::from("1.234"));
        assert_eq!(n1.get_i32(), 1_i32);
        assert_eq!(n1.get_rem(), 234_i32);
        n1.trunc();
        assert_eq!(n1.n, 1000_i32);
    }

    #[test]
    fn trait_add() {
        let n1 = super::fix32::Fix32::from_f32(1.23456_f32);
        let n2 = super::fix32::Fix32::from_f32(6.5_f32);
        let res = n1 + n2;
        assert_eq!(res.n, 7734_i32);
    }

    #[test]
    fn trait_sub() {
        let n1 = super::fix32::Fix32::from_f32(1.23456_f32);
        let n2 = super::fix32::Fix32::from_f32(6.5_f32);
        let res = n1 - n2;
        assert_eq!(res.n, -5266_i32);
    }

    #[test]
    fn trait_mul() {
        let n1 = super::fix32::Fix32::from_f32(1.5_f32);
        let n2 = super::fix32::Fix32::from_f32(-6.5_f32);
        let res = n1 * n2;
        assert_eq!(res.n, -9750_i32);
    }

    #[test]
    fn trait_div() {
        let n1 = super::fix32::Fix32::from_f32(1.5_f32);
        let n2 = super::fix32::Fix32::from_f32(-6.5_f32);
        let res = n1 / n2;
        assert_eq!(res.n, -230_i32);
    }

    #[test]
    fn trait_rem() {
        let n1 = super::fix32::Fix32::from_f32(100_f32);
        let n2 = super::fix32::Fix32::from_f32(10_f32);
        let res = n1 % n2;
        assert_eq!(res.n, 0_i32);
    }

    #[test]
    fn trait_comparing() {
        let n1 = super::fix32::Fix32::from_f32(100_f32);
        let n2 = super::fix32::Fix32::from_f32(10_f32);
        assert_eq!(n1 > n2, true);
        assert_eq!(n1 >= n2, true);
        assert_eq!(n1 < n2, false);
        assert_eq!(n1 <= n2, false);
        assert_eq!(n1 == n2, false);
        assert_eq!(n1 != n2, true);
    }

    #[test]
    fn get_abs() {
        let n = super::fix32::Fix32::from_f32(-5.124_f32);
        assert_eq!(n.abs().n, 5124_i32);
    }

    #[test]
    fn get_pow2() {
        let n = super::fix32::Fix32::from_f32(-5.124_f32);
        assert_eq!(n.pow2().n, 26255_i32);
    }

    #[test]
    fn get_pow3() {
        let n = super::fix32::Fix32::from_f32(-5.124_f32);
        assert_eq!(n.pow3().n, -134530_i32);
    }

    #[test]
    fn get_pow() {
        let n = super::fix32::Fix32::from_f32(-2.2_f32);
        assert_eq!(n.pow(5).n, -51535_i32);
    }
}