From 9b8eea6f2090e98e710b1b79938e1c6f5df7cb0e Mon Sep 17 00:00:00 2001 From: Matthew Gordon Date: Sat, 23 Nov 2019 20:50:31 -0500 Subject: [PATCH] Implement Add, Mul, Copy, Clone and Debug for ColourRgbF --- src/colour.rs | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 1 deletion(-) diff --git a/src/colour.rs b/src/colour.rs index 7446ecb..9aad6db 100644 --- a/src/colour.rs +++ b/src/colour.rs @@ -1,6 +1,8 @@ use nalgebra::{convert, RealField, Vector3}; -#[derive(Debug)] +use std::ops::{Add, Mul}; + +#[derive(Copy, Clone, Debug)] pub struct ColourRgbF { values: Vector3, } @@ -78,12 +80,47 @@ pub enum NamedColour { Navy, } +impl Add> for ColourRgbF { + type Output = ColourRgbF; + fn add(self, rhs: ColourRgbF) -> ColourRgbF { + ColourRgbF { + values: self.values + rhs.values, + } + } +} + +impl Mul for ColourRgbF { + type Output = ColourRgbF; + fn mul(self, rhs: T) -> ColourRgbF { + ColourRgbF { + values: self.values * rhs, + } + } +} + +impl Mul> for ColourRgbF { + type Output = ColourRgbF; + fn mul(self, rhs: ColourRgbF) -> ColourRgbF { + ColourRgbF { + values: self.values.component_mul(&rhs.values), + } + } +} + #[cfg(test)] mod tests { use super::*; mod colour_rgb { use super::*; + use quickcheck::{Arbitrary, Gen}; + use quickcheck_macros::quickcheck; + impl Arbitrary for ColourRgbF { + fn arbitrary(g: &mut G) -> ColourRgbF { + let values = as Arbitrary>::arbitrary(g); + ColourRgbF { values } + } + } #[test] fn constructor_sets_correct_red_green_and_blue() { @@ -99,5 +136,62 @@ mod tests { let result = target.as_vector3(); assert!(result.x == 1.0); } + + #[quickcheck] + fn any_colour_multiplied_by_zero_is_black(colour: ColourRgbF) { + let target = colour * 0.0; + assert!(target.red() == 0.0); + assert!(target.green() == 0.0); + assert!(target.blue() == 0.0); + } + + #[quickcheck] + fn red_channel_multiplied_by_scalar_yields_correct_result( + colour: ColourRgbF, + scalar: f64, + ) { + let target = colour * scalar; + assert!(target.red() == colour.red() * scalar); + } + + #[quickcheck] + fn green_channel_multiplied_by_scalar_yields_correct_result( + colour: ColourRgbF, + scalar: f64, + ) { + let target = colour * scalar; + assert!(target.green() == colour.green() * scalar); + } + + #[quickcheck] + fn blue_channel_multiplied_by_scalar_yields_correct_result( + colour: ColourRgbF, + scalar: f64, + ) { + let target = colour * scalar; + assert!(target.blue() == colour.blue() * scalar); + } + + #[quickcheck] + fn adding_colourrgbf_adds_individual_channels( + colour1: ColourRgbF, + colour2: ColourRgbF, + ) { + let target = colour1 + colour2; + assert!(target.red() == colour1.red() + colour2.red()); + assert!(target.green() == colour1.green() + colour2.green()); + assert!(target.blue() == colour1.blue() + colour2.blue()); + } + + #[quickcheck] + fn multiplying_colourrgbf_adds_individual_channels( + colour1: ColourRgbF, + colour2: ColourRgbF, + ) { + let target = colour1 * colour2; + assert!(target.red() == colour1.red() * colour2.red()); + assert!(target.green() == colour1.green() * colour2.green()); + assert!(target.blue() == colour1.blue() * colour2.blue()); + } } }