hsluv 0.3.1

Human-friendly HSL (revision 4)
Documentation
use super::*;

#[derive(Debug, Clone)]
struct ColorValues {
    lch: Lch,
    luv: Luv,
    rgb: Rgb,
    xyz: Xyz,
    hpluv: Hpluv,
    hsluv: Hsluv,
}

include!(concat!(env!("OUT_DIR"), "/snapshot-rev4.rs"));

const MAX_DIFF: f64 = 0.00000001;

fn check_eq(color: &str, format: &'static str, expected: f64, actual: f64) {
    if Float::abs(expected - actual) < MAX_DIFF {
        ()
    } else {
        panic!(
            "{} {}: expected {}, got {}",
            color, format, expected, actual
        )
    }
}

#[test]
fn test_rgb_to_lch() {
    for (color, values) in SNAPSHOT.iter() {
        let xyz = Xyz::from(values.rgb);
        check_eq(color, "Xyz.x", values.xyz.x, xyz.x);
        check_eq(color, "Xyz.y", values.xyz.y, xyz.y);
        check_eq(color, "Xyz.z", values.xyz.z, xyz.z);

        let luv = Luv::from(xyz);
        check_eq(color, "Luv.lightness", values.luv.lightness, luv.lightness);
        check_eq(color, "Luv.u", values.luv.u, luv.u);
        check_eq(color, "Luv.v", values.luv.v, luv.v);

        let lch = Lch::from(luv);
        check_eq(color, "Lch.lightness", values.lch.lightness, lch.lightness);
        check_eq(color, "Lch.chroma", values.lch.chroma, lch.chroma);
        check_eq(color, "Lch.hue", values.lch.hue, lch.hue);
    }
}

#[test]
fn test_lch_to_rgb() {
    for (color, values) in SNAPSHOT.iter() {
        let luv = Luv::from(values.lch);
        check_eq(color, "Luv.lightness", values.luv.lightness, luv.lightness);
        check_eq(color, "Luv.u", values.luv.u, luv.u);
        check_eq(color, "Luv.v", values.luv.v, luv.v);

        let xyz = Xyz::from(luv);
        check_eq(color, "Xyz.x", values.xyz.x, xyz.x);
        check_eq(color, "Xyz.y", values.xyz.y, xyz.y);
        check_eq(color, "Xyz.z", values.xyz.z, xyz.z);

        let rgb = Rgb::from(xyz);
        check_eq(color, "Rgb.red", values.rgb.red, rgb.red);
        check_eq(color, "Rgb.green", values.rgb.green, rgb.green);
        check_eq(color, "Rgb.blue", values.rgb.blue, rgb.blue);
    }
}

#[test]
fn test_lch_to_hsluv() {
    for (color, values) in SNAPSHOT.iter() {
        let hsluv = Hsluv::from(values.lch);
        check_eq(color, "Hsluv.hue", values.hsluv.hue, hsluv.hue);
        check_eq(
            color,
            "Hsluv.saturation",
            values.hsluv.saturation,
            hsluv.saturation,
        );
        check_eq(
            color,
            "Hsluv.lightness",
            values.hsluv.lightness,
            hsluv.lightness,
        );
    }
}

#[test]
fn test_lch_to_hpluv() {
    for (color, values) in SNAPSHOT.iter() {
        let hpluv = Hpluv::from(values.lch);
        check_eq(color, "Hpluv.hue", values.hpluv.hue, hpluv.hue);
        check_eq(
            color,
            "Hpluv.saturation",
            values.hpluv.saturation,
            hpluv.saturation,
        );
        check_eq(
            color,
            "Hpluv.lightness",
            values.hpluv.lightness,
            hpluv.lightness,
        );
    }
}

#[test]
fn test_hsluv_to_lch() {
    for (color, values) in SNAPSHOT.iter() {
        let lch = Lch::from(values.hsluv);
        check_eq(color, "Lch.lightness", values.lch.lightness, lch.lightness);
        check_eq(color, "Lch.chroma", values.lch.chroma, lch.chroma);
        check_eq(color, "Lch.hue", values.lch.hue, lch.hue);
    }
}

#[test]
fn test_hpluv_to_lch() {
    for (color, values) in SNAPSHOT.iter() {
        let lch = Lch::from(values.hpluv);
        check_eq(color, "Lch.lightness", values.lch.lightness, lch.lightness);
        check_eq(color, "Lch.chroma", values.lch.chroma, lch.chroma);
        check_eq(color, "Lch.hue", values.lch.hue, lch.hue);
    }
}