culors 1.6.0

Rust port of the culori color library. Color spaces, CSS Color Module 4 parsing, interpolation, gamut mapping, ΔE, blending, filters.
Documentation
//! Ported tests for ICtCp.

use culors::convert;
use culors::spaces::{Itp, Rgb};
use culors::ColorSpace;

#[path = "common/mod.rs"]
mod common;

const EPS: f64 = 1e-10;

#[test]
fn itp_metadata() {
    assert_eq!(Itp::CHANNELS, &["i", "t", "p"]);
    assert_eq!(Itp::MODE, "itp");
}

#[test]
fn itp_red() {
    let rgb = Rgb {
        r: 1.0,
        g: 0.0,
        b: 0.0,
        alpha: None,
    };
    let v: Itp = convert(rgb);
    common::assert_close(v.i, 0.4278802843622844, EPS);
    common::assert_close(v.t, -0.11570435976969046, EPS);
    common::assert_close(v.p, 0.27872894737532694, EPS);
}

#[test]
fn itp_green() {
    let rgb = Rgb {
        r: 0.0,
        g: 1.0,
        b: 0.0,
        alpha: None,
    };
    let v: Itp = convert(rgb);
    common::assert_close(v.i, 0.5397602802111227, EPS);
    common::assert_close(v.t, -0.28124791880458244, EPS);
    common::assert_close(v.p, -0.04948450651601132, EPS);
}

#[test]
fn itp_blue() {
    let rgb = Rgb {
        r: 0.0,
        g: 0.0,
        b: 1.0,
        alpha: None,
    };
    let v: Itp = convert(rgb);
    common::assert_close(v.i, 0.35598362802705463, EPS);
    common::assert_close(v.t, 0.2693341555682033, EPS);
    common::assert_close(v.p, -0.16137109768327434, EPS);
}

#[test]
fn itp_arbitrary() {
    let rgb = Rgb {
        r: 0.25,
        g: 0.4,
        b: 0.75,
        alpha: None,
    };
    let v: Itp = convert(rgb);
    common::assert_close(v.i, 0.3956335876749574, EPS);
    common::assert_close(v.t, 0.1378085173482485, EPS);
    common::assert_close(v.p, -0.07824793852607184, EPS);
}

#[test]
fn itp_gray() {
    let rgb = Rgb {
        r: 0.5,
        g: 0.5,
        b: 0.5,
        alpha: None,
    };
    let v: Itp = convert(rgb);
    common::assert_close(v.i, 0.42701896671887857, EPS);
    common::assert_close(v.t, 0.0, 1e-12);
    common::assert_close(v.p, 0.0, 1e-12);
}

#[test]
fn itp_round_trip() {
    let original = Itp {
        i: 0.4,
        t: 0.05,
        p: -0.1,
        alpha: Some(0.4),
    };
    let xyz = original.to_xyz65();
    let back = Itp::from_xyz65(xyz);
    common::assert_close(back.i, original.i, 1e-7);
    common::assert_close(back.t, original.t, 1e-7);
    common::assert_close(back.p, original.p, 1e-7);
    assert_eq!(back.alpha, Some(0.4));
}