tuples: move tests from doctest to unit.

This commit is contained in:
Bill Thiede 2021-07-30 21:23:56 -07:00
parent 1d5e5a164b
commit 4352c03d20

View File

@ -3,27 +3,11 @@ use std::ops::{Add, Div, Mul, Neg, Sub};
use crate::{Float, EPSILON};
/// Short hand for creating a Tuple that represents a point, w=1.
///
/// # Examples
/// ```
/// use rtchallenge::tuples::{point, Tuple};
///
/// assert_eq!(point(1., 2., 3.), Tuple::point(1., 2., 3.));
/// assert_eq!(point(1., 2., 3.), Tuple::new(1., 2., 3., 1.));
/// ```
pub fn point(x: Float, y: Float, z: Float) -> Tuple {
Tuple::point(x, y, z)
}
/// Short hand for creating a Tuple that represents a vector, w=0.
///
/// # Examples
/// ```
/// use rtchallenge::tuples::{vector, Tuple};
///
/// assert_eq!(vector(1., 2., 3.), Tuple::vector(1., 2., 3.));
/// assert_eq!(vector(1., 2., 3.), Tuple::new(1., 2., 3., 0.));
/// ```
pub fn vector(x: Float, y: Float, z: Float) -> Tuple {
Tuple::vector(x, y, z)
}
@ -73,26 +57,6 @@ impl Tuple {
}
/// Reflects vector v across normal n.
///
/// # Examples
/// ```
/// use rtchallenge::{
/// tuples::{reflect, Tuple},
/// Float,
/// };
///
/// // Reflecting a vector approaching at 45°
/// let v = Tuple::vector(1., -1., 0.);
/// let n = Tuple::vector(0., 1., 0.);
/// let r = reflect(v, n);
/// assert_eq!(r, Tuple::vector(1., 1., 0.));
///
/// // Reflecting off a slanted surface.
/// let v = Tuple::vector(0., -1., 0.);
/// let n = Tuple::vector((2. as Float).sqrt() / 2., (2. as Float).sqrt() / 2., 0.);
/// let r = reflect(v, n);
/// assert_eq!(r, Tuple::vector(1., 0., 0.));
/// ```
pub fn reflect(v: Tuple, n: Tuple) -> Tuple {
v - n * 2. * dot(v, n)
}
@ -297,7 +261,7 @@ impl Sub for Color {
#[cfg(test)]
mod tests {
use super::{cross, dot, Color, Float, Tuple, EPSILON};
use super::{cross, dot, reflect, Color, Float, Tuple, EPSILON};
#[test]
fn is_point() {
// A tuple with w = 1 is a point
@ -456,4 +420,20 @@ mod tests {
let c2 = Color::new(0.9, 1., 0.1);
assert_eq!(c1 * c2, Color::new(1.0 * 0.9, 0.2 * 1., 0.4 * 0.1));
}
#[test]
fn reflect_approaching_at_45() {
// Reflecting a vector approaching at 45°
let v = Tuple::vector(1., -1., 0.);
let n = Tuple::vector(0., 1., 0.);
let r = reflect(v, n);
assert_eq!(r, Tuple::vector(1., 1., 0.));
}
#[test]
fn reflect_slanted_surface() {
// Reflecting off a slanted surface.
let v = Tuple::vector(0., -1., 0.);
let n = Tuple::vector((2. as Float).sqrt() / 2., (2. as Float).sqrt() / 2., 0.);
let r = reflect(v, n);
assert_eq!(r, Tuple::vector(1., 0., 0.));
}
}