use fixed32::Fp;
use fixed32_math::{Rect, Vector};
#[test]
fn multiply_fp_vector() {
let result = Fp::from(2) * Vector::from((10, 33));
assert_eq!(result.x, Fp::from(20));
assert_eq!(result.y, Fp::from(66));
}
#[test]
fn multiply_vector_fp() {
let result = Vector::from((10, 33)) * Fp::from(2);
assert_eq!(result.x, Fp::from(20));
assert_eq!(result.y, Fp::from(66));
}
#[test]
fn rect_from() {
let result = Rect::from((10, 33, 20, 30));
assert_eq!(result.pos, Vector::from((10, 33)));
assert_eq!(result.size, Vector::from((20, 30)));
}
#[test]
fn rect_move() {
let result = Rect::from((10, 33, 20, 30)).move_by(Vector::from((18, -2)));
assert_eq!(result.pos, Vector::from((28, 31)));
assert_eq!(result.size, Vector::from((20, 30)));
}
#[test]
fn test_rotate_0_degrees() {
let vector = Vector {
x: Fp::from(1.0),
y: Fp::from(0.0),
};
let angle = Fp::from(0);
let rotated = vector.rotate(angle);
assert_eq!(
rotated,
Vector {
x: Fp::from(1.0),
y: Fp::from(0.0)
}
);
}
#[test]
fn test_rotate_90_degrees() {
let vector = Vector {
x: Fp::from(1.0),
y: Fp::from(0.0),
};
let angle = Fp::FRAC_PI_2; let rotated = vector.rotate(angle);
let expected_vector = Vector {
x: Fp::from(0.0),
y: Fp::from(1.0),
};
let len = (expected_vector - rotated).sqr_len();
assert!(len < Fp::from(0.01));
}
#[test]
fn test_rotate_270_degrees() {
let vector = Vector::new(Fp::from(1.0), Fp::from(0.0));
let angle = Fp::from(3.0 * std::f32::consts::FRAC_PI_2); let rotated = vector.rotate(angle);
let expected_vector = Vector::new(Fp::from(0.0), Fp::from(-1.0));
let len = (expected_vector - rotated).sqr_len();
assert!(len < Fp::from(0.01));
}
#[test]
fn test_contains_point_inside() {
let rect = Rect::new(Vector::from((0, 0)), Vector::from((10, 10)));
let point_inside = Vector::from((5, 5));
assert!(rect.contains_point(&point_inside));
}
#[test]
fn test_contains_point_near_edge() {
let rect = Rect::new(Vector::from((0, 0)), Vector::from((10, 10)));
let point_on_edge = Vector::from((9, 5));
assert!(rect.contains_point(&point_on_edge));
}
#[test]
fn test_contains_point_outside() {
let rect = Rect::new(Vector::from((0, 0)), Vector::from((10, 10)));
let point_outside = Vector::from((10, 5));
assert!(!rect.contains_point(&point_outside));
}
#[test]
fn test_intersection_no_overlap() {
let rect1 = Rect::new(Vector::from((0, 0)), Vector::from((10, 10)));
let rect2 = Rect::new(Vector::from((15, 15)), Vector::from((10, 10)));
assert_eq!(rect1.intersection(&rect2), None);
}
#[test]
fn test_intersection_partial_overlap() {
let rect1 = Rect::new(Vector::from((0, 0)), Vector::from((10, 10)));
let rect2 = Rect::new(Vector::from((5, 5)), Vector::from((10, 10)));
let expected = Rect::new(Vector::from((5, 5)), Vector::from((5, 5)));
assert_eq!(rect1.intersection(&rect2), Some(expected));
}
#[test]
fn test_intersection_full_overlap() {
let rect1 = Rect::new(Vector::from((0, 0)), Vector::from((10, 10)));
let rect2 = Rect::new(Vector::from((2, 2)), Vector::from((5, 5)));
let expected = Rect::new(Vector::from((2, 2)), Vector::from((5, 5)));
assert_eq!(rect1.intersection(&rect2), Some(expected));
}