use i_float::fix_angle::{FixAngle, FixTrigonometry};
use i_float::fix_float::{FixConvert, FixMath};
use std::f64::consts::PI;

#[test]
fn test_0() {
    let mut angle = -PI;
    while angle < PI {
        let fix_angle = FixAngle::new_from_radians_f64(angle);

        let fix_sin = fix_angle.sin();

        let sin0 = fix_sin.f64();
        let sin1 = angle.sin();

        let d_sin = sin0 - sin1;

        assert_eq!(d_sin.abs() < 0.01, true);

        angle += 0.001;
    }
}

#[test]
fn test_1() {
    let mut angle = -PI;
    while angle < PI {
        let fix_angle = FixAngle::new_from_radians_f64(angle);

        let fix_cos = fix_angle.cos();

        let cos0 = fix_cos.f64();
        let cos1 = angle.cos();

        let d_cos = cos0 - cos1;

        assert_eq!(d_cos.abs() < 0.01, true);

        angle += 0.001;
    }
}

#[test]
fn test_2() {
    let mut angle = -PI;
    while angle < PI {
        let fix_angle = FixAngle::new_from_radians_f64(angle);

        let rotator = fix_angle.rotator();
        let sc0 = (rotator.x.f64(), rotator.y.f64());
        let sc1 = angle.sin_cos();

        let d_sin = sc0.0 - sc1.0;
        let d_cos = sc0.1 - sc1.1;

        assert_eq!(d_sin.abs() < 0.01, true);
        assert_eq!(d_cos.abs() < 0.01, true);

        angle += 0.001;
    }
}

#[test]
fn test_3() {
    let mut angle: f64 = 0.0;
    let to_rad = PI / 180.0;
    while angle < 360.0 {
        let fix_angle = FixAngle::new_from_degrees_f64(angle);

        let rotator = fix_angle.rotator();
        let sc0 = (rotator.x.f64(), rotator.y.f64());
        let sc1 = (angle * to_rad).sin_cos();

        let d_sin = sc0.0 - sc1.0;
        let d_cos = sc0.1 - sc1.1;

        assert_eq!(d_sin.abs() < 0.01, true);
        assert_eq!(d_cos.abs() < 0.01, true);

        angle += 0.5;
    }
}

#[test]
fn test_4() {
    let mut angle: f64 = 0.0;
    while angle < 360.0 {
        let fix_float = angle.fix();

        let fix_angle0 = FixAngle::new_from_degrees_f64(angle);
        let fix_angle1 = FixAngle::new_from_degrees_fix(fix_float);

        assert_eq!(fix_angle0, fix_angle1);

        angle += 0.5;
    }
}

#[test]
fn test_5() {
    let mut radians: f64 = -PI;
    while radians < PI - 0.02 {
        let fix_float = radians.fix();

        let fix_angle0 = FixAngle::new_from_radians_f64(radians);
        let fix_angle1 = FixAngle::new_from_radians_fix(fix_float);

        let d0 = (fix_angle0 - fix_angle1).abs();

        assert_eq!(d0 < 10, true);

        radians += 0.01;
    }
}
