Implement Add, Mul, Copy, Clone and Debug for ColourRgbF

This commit is contained in:
Matthew Gordon 2019-11-23 20:50:31 -05:00
parent f58afb2ded
commit 9b8eea6f20
1 changed files with 95 additions and 1 deletions

View File

@ -1,6 +1,8 @@
use nalgebra::{convert, RealField, Vector3}; use nalgebra::{convert, RealField, Vector3};
#[derive(Debug)] use std::ops::{Add, Mul};
#[derive(Copy, Clone, Debug)]
pub struct ColourRgbF<T: RealField> { pub struct ColourRgbF<T: RealField> {
values: Vector3<T>, values: Vector3<T>,
} }
@ -78,12 +80,47 @@ pub enum NamedColour {
Navy, Navy,
} }
impl<T: RealField> Add<ColourRgbF<T>> for ColourRgbF<T> {
type Output = ColourRgbF<T>;
fn add(self, rhs: ColourRgbF<T>) -> ColourRgbF<T> {
ColourRgbF {
values: self.values + rhs.values,
}
}
}
impl<T: RealField> Mul<T> for ColourRgbF<T> {
type Output = ColourRgbF<T>;
fn mul(self, rhs: T) -> ColourRgbF<T> {
ColourRgbF {
values: self.values * rhs,
}
}
}
impl<T: RealField> Mul<ColourRgbF<T>> for ColourRgbF<T> {
type Output = ColourRgbF<T>;
fn mul(self, rhs: ColourRgbF<T>) -> ColourRgbF<T> {
ColourRgbF {
values: self.values.component_mul(&rhs.values),
}
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
mod colour_rgb { mod colour_rgb {
use super::*; use super::*;
use quickcheck::{Arbitrary, Gen};
use quickcheck_macros::quickcheck;
impl<T: Arbitrary + RealField> Arbitrary for ColourRgbF<T> {
fn arbitrary<G: Gen>(g: &mut G) -> ColourRgbF<T> {
let values = <Vector3<T> as Arbitrary>::arbitrary(g);
ColourRgbF { values }
}
}
#[test] #[test]
fn constructor_sets_correct_red_green_and_blue() { fn constructor_sets_correct_red_green_and_blue() {
@ -99,5 +136,62 @@ mod tests {
let result = target.as_vector3(); let result = target.as_vector3();
assert!(result.x == 1.0); assert!(result.x == 1.0);
} }
#[quickcheck]
fn any_colour_multiplied_by_zero_is_black(colour: ColourRgbF<f64>) {
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<f64>,
scalar: f64,
) {
let target = colour * scalar;
assert!(target.red() == colour.red() * scalar);
}
#[quickcheck]
fn green_channel_multiplied_by_scalar_yields_correct_result(
colour: ColourRgbF<f64>,
scalar: f64,
) {
let target = colour * scalar;
assert!(target.green() == colour.green() * scalar);
}
#[quickcheck]
fn blue_channel_multiplied_by_scalar_yields_correct_result(
colour: ColourRgbF<f64>,
scalar: f64,
) {
let target = colour * scalar;
assert!(target.blue() == colour.blue() * scalar);
}
#[quickcheck]
fn adding_colourrgbf_adds_individual_channels(
colour1: ColourRgbF<f64>,
colour2: ColourRgbF<f64>,
) {
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<f64>,
colour2: ColourRgbF<f64>,
) {
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());
}
} }
} }