diff --git a/rtchallenge/src/lib.rs b/rtchallenge/src/lib.rs new file mode 100644 index 0000000..921850a --- /dev/null +++ b/rtchallenge/src/lib.rs @@ -0,0 +1 @@ +mod tuples; diff --git a/rtchallenge/src/main.rs b/rtchallenge/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/rtchallenge/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/rtchallenge/src/tuples.rs b/rtchallenge/src/tuples.rs new file mode 100644 index 0000000..58f2540 --- /dev/null +++ b/rtchallenge/src/tuples.rs @@ -0,0 +1,47 @@ +struct Tuple { + x: f32, + y: f32, + z: f32, + w: f32, +} + +impl Tuple { + fn is_point(&self) -> bool { + self.w == 1.0 + } + + fn is_vector(&self) -> bool { + self.w == 0.0 + } +} + +fn tuple(x: f32, y: f32, z: f32, w: f32) -> Tuple { + Tuple { x, y, z, w } +} + +#[cfg(test)] +mod tests { + use super::tuple; + #[test] + fn point() { + // A tuple with w = 1 is a point + let a = tuple(4.3, -4.2, 3.1, 1.0); + assert_eq!(a.x, 4.3); + assert_eq!(a.y, -4.2); + assert_eq!(a.z, 3.1); + assert_eq!(a.w, 1.0); + assert!(a.is_point()); + assert!(!a.is_vector()); + } + #[test] + fn vector() { + // A tuple with w = 0 is a point + let a = tuple(4.3, -4.2, 3.1, 0.0); + assert_eq!(a.x, 4.3); + assert_eq!(a.y, -4.2); + assert_eq!(a.z, 3.1); + assert_eq!(a.w, 0.0); + assert!(!a.is_point()); + assert!(a.is_vector()); + } +}