diff --git a/tuples/Cargo.lock b/tuples/Cargo.lock index 8ba689a..614411b 100644 --- a/tuples/Cargo.lock +++ b/tuples/Cargo.lock @@ -1,5 +1,32 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "approx" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278" +dependencies = [ + "num-traits", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + [[package]] name = "tuples" version = "0.1.0" +dependencies = [ + "approx", +] diff --git a/tuples/Cargo.toml b/tuples/Cargo.toml index 016dc20..337594f 100644 --- a/tuples/Cargo.toml +++ b/tuples/Cargo.toml @@ -7,3 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +approx = "0.4" diff --git a/tuples/src/lib.rs b/tuples/src/lib.rs index d464b4d..5951ecf 100644 --- a/tuples/src/lib.rs +++ b/tuples/src/lib.rs @@ -1,4 +1,18 @@ +#[macro_use] +extern crate approx; + +use std::f32; + type PointVector = (f32, f32, f32, f32); +type Dimensions = (f32, f32, f32); + +fn point(dims: Dimensions) -> PointVector { + (dims.0, dims.1, dims.2, 1.0) +} + +fn vector(dims: Dimensions) -> PointVector { + (dims.0, dims.1, dims.2, 0.0) +} fn tuple_x(tuple: PointVector) -> f32 { tuple.0 @@ -13,10 +27,10 @@ fn tuple_z(tuple: PointVector) -> f32 { } fn tuple_is_point(tuple: PointVector) -> bool { - tuple.3 == 1.0 + relative_eq!(1.0, tuple.3) } fn tuple_is_vector(tuple: PointVector) -> bool { - tuple.3 == 0.0 + relative_eq!(0.0, tuple.3) } #[cfg(test)] @@ -27,21 +41,33 @@ mod tests { fn get_point() { let tuple = (4.3, -4.2, 3.1, 1.0); - assert_eq!( 4.3, tuple_x(tuple)); - assert_eq!(-4.2, tuple_y(tuple)); - assert_eq!( 3.1, tuple_z(tuple)); + assert_relative_eq!( 4.3, tuple_x(tuple)); + assert_relative_eq!(-4.2, tuple_y(tuple)); + assert_relative_eq!( 3.1, tuple_z(tuple)); assert_eq!(true, tuple_is_point(tuple)); assert_eq!(false, tuple_is_vector(tuple)); } + #[test] + fn create_point() { + let point = point((4.0, -4.0, 3.0)); + assert_eq!(true, tuple_is_point(point)); + } + #[test] fn get_vector() { let tuple = (4.3, -4.2, 3.1, 0.0); - assert_eq!( 4.3, tuple_x(tuple)); - assert_eq!(-4.2, tuple_y(tuple)); - assert_eq!( 3.1, tuple_z(tuple)); + assert_relative_eq!( 4.3, tuple_x(tuple)); + assert_relative_eq!(-4.2, tuple_y(tuple)); + assert_relative_eq!( 3.1, tuple_z(tuple)); assert_eq!(false, tuple_is_point(tuple)); assert_eq!(true, tuple_is_vector(tuple)); } + + #[test] + fn create_vector() { + let vector = vector((4.0, -4.0, 3.0)); + assert_eq!(true, tuple_is_vector(vector)); + } }