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;
#[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<Ray> {
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::<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);
}
}