diff --git a/features/src/ray.rs b/features/src/ray.rs index 0491fea..87aa2ef 100644 --- a/features/src/ray.rs +++ b/features/src/ray.rs @@ -1,15 +1,20 @@ use crate::structs::Tuple; +#[derive(Debug, PartialEq)] struct Ray { origin: Tuple, direction: Tuple, } impl Ray { - fn new(origin: Tuple, direction: Tuple) -> Ray { - Ray { - origin, - direction, + fn new(origin: Tuple, direction: Tuple) -> Option { + if !origin.is_point() || !direction.is_vector() { + None + } else { + Some(Ray { + origin, + direction, + }) } } } @@ -24,8 +29,24 @@ mod tests { let origin = Tuple::point(1, 2, 3); 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.direction, direction); } + + #[test] + pub fn origin_must_be_point() { + let direction = Tuple::vector::(4, 5, 6); + + let ray = Ray::new(direction, direction); + assert_eq!(ray, None); + } + + #[test] + pub fn direction_must_be_vector() { + let point = Tuple::point::(4, 5, 6); + let ray = Ray::new(point, point); + assert_eq!(ray, None); + } + }