From 76a7299fb9a46ed416e7f3b355b2e94a874934b7 Mon Sep 17 00:00:00 2001 From: Matthew Gordon Date: Wed, 6 Nov 2019 17:32:47 -0500 Subject: [PATCH] Add more unit tests for Ray --- src/lib.rs | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index c98757a..1a1f587 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -27,17 +27,33 @@ extern crate quickcheck; extern crate quickcheck_macros; mod tests { use super::*; - use quickcheck::{Arbitrary,Gen}; - impl Arbitrary for Ray { - fn arbitrary(g: &mut G) -> Ray { + use quickcheck::{Arbitrary, Gen}; + impl Arbitrary for Ray { + fn arbitrary(g: &mut G) -> Ray { let origin = as Arbitrary>::arbitrary(g); let direction = as Arbitrary>::arbitrary(g); - return Ray{origin, direction} + return Ray::new(origin, direction); } } #[quickcheck] - fn test_t0_is_origin(ray:Ray) -> bool { + fn t0_is_origin(ray: Ray) -> bool { ray.point_at(0.0) == ray.origin } + + #[quickcheck] + fn t1_is_origin_plus_direction(ray: Ray) -> bool { + ray.point_at(1.0) == ray.origin + ray.direction + } + + #[quickcheck] + fn points_are_colinear(ray: Ray, t1: f64, t2: f64, t3: f64) -> bool { + let p1 = ray.point_at(t1); + let p2 = ray.point_at(t2); + let p3 = ray.point_at(t3); + let epsilon = [t1, t2, t3, ray.origin[0], ray.origin[1], ray.origin[2]] + .iter() + .fold(0.0, |a, &b| a.max(b.abs())) * std::f64::EPSILON * 128.0; + (p2 - p1).cross(&(p3 - p2)).norm() < epsilon + } }