Files
wasm-pong/pong/tests/vector_tests.rs
2022-05-02 13:46:23 +02:00

133 lines
3.8 KiB
Rust

use pong::geom::geom::Vector;
use rstest::rstest;
use std::f64::consts::FRAC_PI_2;
use std::f64::consts::FRAC_PI_4;
use std::f64::consts::PI;
#[rstest]
#[case(1., 0., 1.)]
#[case(0., 1., 1.)]
#[case(3., 4., 5.)]
pub fn should_get_correct_length(#[case] x: f64, #[case] y: f64, #[case] expected: f64) {
let vector = Vector { x, y };
let len = vector.len();
assert_eq!(len, expected);
}
#[rstest]
#[case(1., 0., 1., 0.)]
#[case(3., 0., 1., 0.)]
#[case(3., 4., 3. / 5., 4. / 5.)]
pub fn should_normalize_correctly(
#[case] x: f64,
#[case] y: f64,
#[case] expected_x: f64,
#[case] expected_y: f64,
) {
let mut vector = Vector { x, y };
let expected = Vector {
x: expected_x,
y: expected_y,
};
vector.normalize();
assert_eq!(vector, expected);
}
#[rstest]
#[case(Vector::new(1., 1.), Vector::new(2., 2.), 0.)]
#[case(Vector::new(1., 0.), Vector::new(1., 1.), 0.79)]
pub fn should_calculate_angle_correctly(
#[case] vector_a: Vector,
#[case] vector_b: Vector,
#[case] expected_angle: f64,
) {
let res = vector_a.angle(&vector_b);
assert_eq!(res, expected_angle);
}
#[rstest]
#[case(Vector::new(1., 0.), Vector::new(0., -1.))]
#[case(Vector::new(0., 1.), Vector::new(1., 0.))]
#[case(Vector::new(7., 7.), Vector::new(7., -7.))]
pub fn should_get_orthogonal_clockwise(#[case] mut vector: Vector, #[case] expected: Vector) {
vector.orthogonal_clockwise();
assert_eq!(vector, expected);
}
#[rstest]
#[case(Vector::new(0., -1.), Vector::new(1., 0.))]
#[case(Vector::new(1., 0.), Vector::new(0., 1.))]
#[case(Vector::new(7., 7.), Vector::new(-7., 7.))]
pub fn should_get_orthogonal_counter_clockwise(
#[case] mut vector: Vector,
#[case] expected: Vector,
) {
vector.orthogonal_counter_clockwise();
assert_eq!(vector, expected);
}
#[rstest]
#[case(Vector::new(1., 0.), FRAC_PI_4, Vector::unit())]
pub fn should_correctly_rotate(
#[case] mut vector: Vector,
#[case] radians: f64,
#[case] expected: Vector,
) {
vector.rotate(radians);
assert_eq!(vector, expected);
}
#[rstest]
#[case(Vector::new(1., 0.), Vector::new(1., 0.), 1.)]
#[case(Vector::new(1., 0.), Vector::new(0., 1.), 0.)]
#[case(Vector::new(1., 0.), Vector::new(-1., 0.), -1.)]
pub fn should_calculate_dot_product(
#[case] mut vector: Vector,
#[case] mut other: Vector,
#[case] expected: f64,
) {
let dot = vector.dot(&other);
assert_eq!(dot, expected);
}
#[rstest]
#[case(Vector::new(0., 1.), Vector::new(1., 0.), Vector::new(0., 0.))]
#[case(Vector::new(1., 0.), Vector::new(1., 0.), Vector::new(1., 0.))]
#[case(Vector::new(-1., 0.), Vector::new(1., 0.), Vector::new(-1., 0.))]
#[case(Vector::new(1., 1.), Vector::new(1., 0.), Vector::new(1., 0.))]
#[case(Vector::new(2., 1.), Vector::new(1., 0.), Vector::new(2., 0.))]
pub fn should_get_projection(
#[case] vector: Vector,
#[case] other: Vector,
#[case] expected: Vector,
) {
let projected = vector.get_projection(&other);
assert_eq!(projected, expected);
}
#[rstest]
#[case(Vector::new(1., 1.), Vector::new(1., 0.), Vector::new(0., -1.))]
#[case(Vector::new(-1., -1.), Vector::new(1., 0.), Vector::new(0., 1.))]
pub fn should_get_opposing_orthogonal(
#[case] vector: Vector,
#[case] onto: Vector,
#[case] expected: Vector,
) {
let orthogonal = vector.get_opposing_orthogonal(&onto);
assert_eq!(orthogonal, expected);
}
#[rstest]
#[case(Vector::new(1., 1.), Vector::new(1., 0.), Vector::new(1., -1.))]
#[case(Vector::new(-1., 1.), Vector::new(1., 0.), Vector::new(-1., -1.))]
#[case(Vector::new(1., -1.), Vector::new(0., 1.), Vector::new(-1., -1.))]
#[case(Vector::new(-1., -1.), Vector::new(0., 1.), Vector::new(1., -1.))]
pub fn should_reflect_vector(
#[case] mut vector: Vector,
#[case] onto: Vector,
#[case] expected: Vector,
) {
vector.reflect(&onto);
assert_eq!(vector, expected);
}