#![allow(clippy::type_complexity)]
use culors::{difference_euclidean, nearest, parse, Color};
fn p(s: &str) -> Color {
parse(s).unwrap()
}
fn rgb(c: &Color) -> (f64, f64, f64) {
match c {
Color::Rgb(r) => (r.r, r.g, r.b),
_ => panic!("expected Rgb, got {c:?}"),
}
}
#[test]
fn nearest_single_match_red() {
let palette = vec![p("red"), p("green"), p("blue")];
let find = nearest(palette, None);
let hits = find(&p("red"), 1);
assert_eq!(hits.len(), 1);
assert_eq!(rgb(&hits[0]), (1.0, 0.0, 0.0));
}
#[test]
fn nearest_purple_picks_magenta_first() {
let palette = vec![
p("red"),
p("green"),
p("blue"),
p("yellow"),
p("cyan"),
p("magenta"),
p("black"),
p("white"),
];
let find = nearest(palette, None);
let hits = find(&p("#800080"), 1);
assert_eq!(hits.len(), 1);
assert_eq!(rgb(&hits[0]), (1.0, 0.0, 1.0));
}
#[test]
fn nearest_purple_top_three() {
let palette = vec![
p("red"),
p("green"),
p("blue"),
p("yellow"),
p("cyan"),
p("magenta"),
p("black"),
p("white"),
];
let find = nearest(palette, None);
let hits = find(&p("#800080"), 3);
let colors: Vec<_> = hits.iter().map(rgb).collect();
assert_eq!(
colors,
vec![(1.0, 0.0, 1.0), (1.0, 0.0, 0.0), (0.0, 0.0, 1.0)]
);
}
#[test]
fn nearest_n_clamped_to_len_minus_one() {
let palette = vec![p("red"), p("green"), p("blue"), p("yellow")];
let find = nearest(palette, None);
let hits = find(&p("red"), 4);
assert_eq!(hits.len(), 3);
}
#[test]
fn nearest_usize_max_returns_all_sorted() {
let palette = vec![p("red"), p("green"), p("blue"), p("yellow")];
let find = nearest(palette, None);
let hits = find(&p("red"), usize::MAX);
assert_eq!(hits.len(), 4);
assert_eq!(rgb(&hits[0]), (1.0, 0.0, 0.0));
}
#[test]
fn nearest_custom_metric() {
let palette = vec![
p("red"),
p("green"),
p("blue"),
p("yellow"),
p("cyan"),
p("magenta"),
p("black"),
p("white"),
];
let metric: Box<dyn Fn(&Color, &Color) -> f64> = Box::new(difference_euclidean("rgb"));
let find = nearest(palette, Some(metric));
let hits = find(&p("#800080"), 1);
assert_eq!(hits.len(), 1);
assert_eq!(rgb(&hits[0]), (1.0, 0.0, 1.0));
}
#[test]
fn nearest_empty_palette_returns_empty() {
let find = nearest(Vec::<Color>::new(), None);
let hits = find(&p("red"), 5);
assert!(hits.is_empty());
}