diff --git a/tuples/src/lib.rs b/tuples/src/lib.rs index 5951ecf..01b4211 100644 --- a/tuples/src/lib.rs +++ b/tuples/src/lib.rs @@ -29,10 +29,18 @@ fn tuple_z(tuple: PointVector) -> f32 { fn tuple_is_point(tuple: PointVector) -> bool { relative_eq!(1.0, tuple.3) } + fn tuple_is_vector(tuple: PointVector) -> bool { relative_eq!(0.0, tuple.3) } +fn tuple_equals(lhs: PointVector, rhs: PointVector) -> bool { + relative_eq!(lhs.0, rhs.0) + && relative_eq!(lhs.1, rhs.1) + && relative_eq!(lhs.2, rhs.2) + && relative_eq!(lhs.3, rhs.3) +} + #[cfg(test)] mod tests { use super::*; @@ -70,4 +78,25 @@ mod tests { let vector = vector((4.0, -4.0, 3.0)); assert_eq!(true, tuple_is_vector(vector)); } + + #[test] + fn tuples_equal() { + let lhs = point((1.0, 2.0, 3.0)); + let rhs = point((1.0, 2.0, 3.0)); + assert_eq!(true, tuple_equals(lhs, rhs)); + } + + #[test] + fn tuples_relative_equal() { + let lhs = point((1.0000001, 2.0, 3.0)); + let rhs = point((1.0, 2.0, 3.0)); + assert_eq!(true, tuple_equals(lhs, rhs)); + } + + #[test] + fn tuples_not_equal() { + let lhs = point((1.0, 2.0, 3.0)); + let rhs = vector((1.0, 2.0, 3.0)); + assert_eq!(false, tuple_equals(lhs, rhs)); + } }