enforce point and vector for origin and direction

This commit is contained in:
Jon Janzen
2022-03-11 18:35:11 -07:00
parent 910570bf37
commit cd297fd4a9

View File

@@ -1,15 +1,20 @@
use crate::structs::Tuple; use crate::structs::Tuple;
#[derive(Debug, PartialEq)]
struct Ray { struct Ray {
origin: Tuple, origin: Tuple,
direction: Tuple, direction: Tuple,
} }
impl Ray { impl Ray {
fn new(origin: Tuple, direction: Tuple) -> Ray { fn new(origin: Tuple, direction: Tuple) -> Option<Ray> {
Ray { if !origin.is_point() || !direction.is_vector() {
None
} else {
Some(Ray {
origin, origin,
direction, direction,
})
} }
} }
} }
@@ -24,8 +29,24 @@ mod tests {
let origin = Tuple::point(1, 2, 3); let origin = Tuple::point(1, 2, 3);
let direction = Tuple::vector(4, 5, 6); let direction = Tuple::vector(4, 5, 6);
let ray = Ray::new(origin, direction); let ray = Ray::new(origin, direction).unwrap();
assert_eq!(ray.origin, origin); assert_eq!(ray.origin, origin);
assert_eq!(ray.direction, direction); assert_eq!(ray.direction, direction);
} }
#[test]
pub fn origin_must_be_point() {
let direction = Tuple::vector::<i32, i32, i32>(4, 5, 6);
let ray = Ray::new(direction, direction);
assert_eq!(ray, None);
}
#[test]
pub fn direction_must_be_vector() {
let point = Tuple::point::<i32, i32, i32>(4, 5, 6);
let ray = Ray::new(point, point);
assert_eq!(ray, None);
}
} }