use super::*;
use ratatui::style::Color;
#[test]
fn test_green_to_red_at_zero() {
let color = value_to_color(0.0, 0.0, 1.0, &HeatmapColorScale::GreenToRed);
assert_eq!(color, Color::Rgb(0, 255, 0));
}
#[test]
fn test_green_to_red_at_half() {
let color = value_to_color(0.5, 0.0, 1.0, &HeatmapColorScale::GreenToRed);
assert_eq!(color, Color::Rgb(255, 255, 0)); }
#[test]
fn test_green_to_red_at_one() {
let color = value_to_color(1.0, 0.0, 1.0, &HeatmapColorScale::GreenToRed);
assert_eq!(color, Color::Rgb(255, 0, 0));
}
#[test]
fn test_blue_to_red_at_zero() {
let color = value_to_color(0.0, 0.0, 1.0, &HeatmapColorScale::BlueToRed);
assert_eq!(color, Color::Rgb(0, 0, 255));
}
#[test]
fn test_blue_to_red_at_half() {
let color = value_to_color(0.5, 0.0, 1.0, &HeatmapColorScale::BlueToRed);
assert_eq!(color, Color::Rgb(255, 0, 255)); }
#[test]
fn test_blue_to_red_at_one() {
let color = value_to_color(1.0, 0.0, 1.0, &HeatmapColorScale::BlueToRed);
assert_eq!(color, Color::Rgb(255, 0, 0));
}
#[test]
fn test_cool_to_warm_at_zero() {
let color = value_to_color(0.0, 0.0, 1.0, &HeatmapColorScale::CoolToWarm);
assert_eq!(color, Color::Rgb(0, 0, 200));
}
#[test]
fn test_cool_to_warm_at_half() {
let color = value_to_color(0.5, 0.0, 1.0, &HeatmapColorScale::CoolToWarm);
assert_eq!(color, Color::Rgb(200, 200, 200)); }
#[test]
fn test_cool_to_warm_at_one() {
let color = value_to_color(1.0, 0.0, 1.0, &HeatmapColorScale::CoolToWarm);
assert_eq!(color, Color::Rgb(200, 200, 0));
}
#[test]
fn test_intensity_at_zero() {
let color = value_to_color(0.0, 0.0, 1.0, &HeatmapColorScale::Intensity(Color::Cyan));
assert_eq!(color, Color::Rgb(0, 51, 51));
}
#[test]
fn test_intensity_at_one() {
let color = value_to_color(1.0, 0.0, 1.0, &HeatmapColorScale::Intensity(Color::Cyan));
assert_eq!(color, Color::Rgb(0, 255, 255));
}
#[test]
fn test_intensity_with_rgb_color() {
let color = value_to_color(
1.0,
0.0,
1.0,
&HeatmapColorScale::Intensity(Color::Rgb(100, 200, 50)),
);
assert_eq!(color, Color::Rgb(100, 200, 50));
}
#[test]
fn test_value_to_color_equal_min_max() {
let color = value_to_color(5.0, 5.0, 5.0, &HeatmapColorScale::GreenToRed);
assert_eq!(color, Color::Rgb(255, 255, 0));
}
#[test]
fn test_value_to_color_clamped_above() {
let color = value_to_color(2.0, 0.0, 1.0, &HeatmapColorScale::GreenToRed);
assert_eq!(color, Color::Rgb(255, 0, 0));
}
#[test]
fn test_value_to_color_clamped_below() {
let color = value_to_color(-1.0, 0.0, 1.0, &HeatmapColorScale::GreenToRed);
assert_eq!(color, Color::Rgb(0, 255, 0));
}
#[test]
fn test_blue_white_red_negative_is_blue() {
let color = value_to_color(-1.0, -1.0, 1.0, &HeatmapColorScale::BlueWhiteRed);
assert_eq!(color, Color::Rgb(0, 0, 255));
}
#[test]
fn test_blue_white_red_zero_is_white() {
let color = value_to_color(0.0, -1.0, 1.0, &HeatmapColorScale::BlueWhiteRed);
assert_eq!(color, Color::Rgb(255, 255, 255));
}
#[test]
fn test_blue_white_red_positive_is_red() {
let color = value_to_color(1.0, -1.0, 1.0, &HeatmapColorScale::BlueWhiteRed);
assert_eq!(color, Color::Rgb(255, 0, 0));
}
#[test]
fn test_blue_white_red_quarter_negative() {
let color = value_to_color(-0.5, -1.0, 1.0, &HeatmapColorScale::BlueWhiteRed);
assert_eq!(color, Color::Rgb(127, 127, 255));
}
#[test]
fn test_blue_white_red_quarter_positive() {
let color = value_to_color(0.5, -1.0, 1.0, &HeatmapColorScale::BlueWhiteRed);
assert_eq!(color, Color::Rgb(255, 127, 127));
}
#[test]
fn test_red_white_blue_negative_is_red() {
let color = value_to_color(-1.0, -1.0, 1.0, &HeatmapColorScale::RedWhiteBlue);
assert_eq!(color, Color::Rgb(255, 0, 0));
}
#[test]
fn test_red_white_blue_zero_is_white() {
let color = value_to_color(0.0, -1.0, 1.0, &HeatmapColorScale::RedWhiteBlue);
assert_eq!(color, Color::Rgb(255, 255, 255));
}
#[test]
fn test_red_white_blue_positive_is_blue() {
let color = value_to_color(1.0, -1.0, 1.0, &HeatmapColorScale::RedWhiteBlue);
assert_eq!(color, Color::Rgb(0, 0, 255));
}
#[test]
fn test_red_white_blue_quarter_negative() {
let color = value_to_color(-0.5, -1.0, 1.0, &HeatmapColorScale::RedWhiteBlue);
assert_eq!(color, Color::Rgb(255, 127, 127));
}
#[test]
fn test_red_white_blue_quarter_positive() {
let color = value_to_color(0.5, -1.0, 1.0, &HeatmapColorScale::RedWhiteBlue);
assert_eq!(color, Color::Rgb(127, 127, 255));
}
#[test]
fn test_blue_white_red_asymmetric_range_min() {
let color = value_to_color(-0.5, -0.5, 2.0, &HeatmapColorScale::BlueWhiteRed);
assert_eq!(color, Color::Rgb(0, 0, 255));
}
#[test]
fn test_blue_white_red_asymmetric_range_max() {
let color = value_to_color(2.0, -0.5, 2.0, &HeatmapColorScale::BlueWhiteRed);
assert_eq!(color, Color::Rgb(255, 0, 0));
}
#[test]
fn test_blue_white_red_asymmetric_range_midpoint() {
let color = value_to_color(0.75, -0.5, 2.0, &HeatmapColorScale::BlueWhiteRed);
assert_eq!(color, Color::Rgb(255, 255, 255));
}
#[test]
fn test_red_white_blue_asymmetric_range_min() {
let color = value_to_color(-0.5, -0.5, 2.0, &HeatmapColorScale::RedWhiteBlue);
assert_eq!(color, Color::Rgb(255, 0, 0));
}
#[test]
fn test_red_white_blue_asymmetric_range_max() {
let color = value_to_color(2.0, -0.5, 2.0, &HeatmapColorScale::RedWhiteBlue);
assert_eq!(color, Color::Rgb(0, 0, 255));
}
#[test]
fn test_blue_white_red_equal_range() {
let color = value_to_color(5.0, 5.0, 5.0, &HeatmapColorScale::BlueWhiteRed);
assert_eq!(color, Color::Rgb(255, 255, 255));
}
#[test]
fn test_red_white_blue_equal_range() {
let color = value_to_color(5.0, 5.0, 5.0, &HeatmapColorScale::RedWhiteBlue);
assert_eq!(color, Color::Rgb(255, 255, 255));
}
#[test]
fn test_blue_white_red_clamped_below() {
let color = value_to_color(-5.0, -1.0, 1.0, &HeatmapColorScale::BlueWhiteRed);
assert_eq!(color, Color::Rgb(0, 0, 255));
}
#[test]
fn test_blue_white_red_clamped_above() {
let color = value_to_color(5.0, -1.0, 1.0, &HeatmapColorScale::BlueWhiteRed);
assert_eq!(color, Color::Rgb(255, 0, 0));
}
#[test]
fn test_viridis_at_zero() {
let color = value_to_color(0.0, 0.0, 1.0, &HeatmapColorScale::Viridis);
assert_eq!(color, Color::Rgb(68, 1, 84));
}
#[test]
fn test_viridis_at_one() {
let color = value_to_color(1.0, 0.0, 1.0, &HeatmapColorScale::Viridis);
assert_eq!(color, Color::Rgb(253, 231, 37));
}
#[test]
fn test_viridis_at_midpoint() {
let color = value_to_color(0.5, 0.0, 1.0, &HeatmapColorScale::Viridis);
assert_eq!(color, Color::Rgb(31, 143, 140));
}
#[test]
fn test_viridis_interpolation_smoothness() {
let scale = HeatmapColorScale::Viridis;
let steps = 100;
let mut prev: Option<(u8, u8, u8)> = None;
for i in 0..=steps {
let t = i as f64 / steps as f64;
let color = value_to_color(t, 0.0, 1.0, &scale);
if let Color::Rgb(r, g, b) = color {
if let Some((pr, pg, pb)) = prev {
let dr = (r as i16 - pr as i16).unsigned_abs();
let dg = (g as i16 - pg as i16).unsigned_abs();
let db = (b as i16 - pb as i16).unsigned_abs();
assert!(
dr <= 10,
"Viridis red channel jump too large at step {i}: {dr}"
);
assert!(
dg <= 10,
"Viridis green channel jump too large at step {i}: {dg}"
);
assert!(
db <= 10,
"Viridis blue channel jump too large at step {i}: {db}"
);
}
prev = Some((r, g, b));
} else {
panic!("Expected Color::Rgb from Viridis scale");
}
}
}
#[test]
fn test_viridis_clamped_below() {
let color = value_to_color(-5.0, 0.0, 1.0, &HeatmapColorScale::Viridis);
assert_eq!(color, Color::Rgb(68, 1, 84));
}
#[test]
fn test_viridis_clamped_above() {
let color = value_to_color(5.0, 0.0, 1.0, &HeatmapColorScale::Viridis);
assert_eq!(color, Color::Rgb(253, 231, 37));
}
#[test]
fn test_viridis_equal_range() {
let color = value_to_color(5.0, 5.0, 5.0, &HeatmapColorScale::Viridis);
assert_eq!(color, Color::Rgb(31, 143, 140));
}
#[test]
fn test_inferno_at_zero() {
let color = value_to_color(0.0, 0.0, 1.0, &HeatmapColorScale::Inferno);
assert_eq!(color, Color::Rgb(0, 0, 4));
}
#[test]
fn test_inferno_at_one() {
let color = value_to_color(1.0, 0.0, 1.0, &HeatmapColorScale::Inferno);
assert_eq!(color, Color::Rgb(252, 255, 164));
}
#[test]
fn test_inferno_at_midpoint() {
let color = value_to_color(0.5, 0.0, 1.0, &HeatmapColorScale::Inferno);
assert_eq!(color, Color::Rgb(176, 55, 70));
}
#[test]
fn test_inferno_interpolation_smoothness() {
let scale = HeatmapColorScale::Inferno;
let steps = 100;
let mut prev: Option<(u8, u8, u8)> = None;
let max_delta: u16 = 12;
for i in 0..=steps {
let t = i as f64 / steps as f64;
let color = value_to_color(t, 0.0, 1.0, &scale);
if let Color::Rgb(r, g, b) = color {
if let Some((pr, pg, pb)) = prev {
let dr = (r as i16 - pr as i16).unsigned_abs();
let dg = (g as i16 - pg as i16).unsigned_abs();
let db = (b as i16 - pb as i16).unsigned_abs();
assert!(
dr <= max_delta,
"Inferno red channel jump too large at step {i}: {dr}"
);
assert!(
dg <= max_delta,
"Inferno green channel jump too large at step {i}: {dg}"
);
assert!(
db <= max_delta,
"Inferno blue channel jump too large at step {i}: {db}"
);
}
prev = Some((r, g, b));
} else {
panic!("Expected Color::Rgb from Inferno scale");
}
}
}
#[test]
fn test_inferno_clamped_below() {
let color = value_to_color(-5.0, 0.0, 1.0, &HeatmapColorScale::Inferno);
assert_eq!(color, Color::Rgb(0, 0, 4));
}
#[test]
fn test_inferno_clamped_above() {
let color = value_to_color(5.0, 0.0, 1.0, &HeatmapColorScale::Inferno);
assert_eq!(color, Color::Rgb(252, 255, 164));
}
#[test]
fn test_inferno_equal_range() {
let color = value_to_color(5.0, 5.0, 5.0, &HeatmapColorScale::Inferno);
assert_eq!(color, Color::Rgb(176, 55, 70));
}
#[test]
fn test_plasma_at_zero() {
let color = value_to_color(0.0, 0.0, 1.0, &HeatmapColorScale::Plasma);
assert_eq!(color, Color::Rgb(13, 8, 135));
}
#[test]
fn test_plasma_at_one() {
let color = value_to_color(1.0, 0.0, 1.0, &HeatmapColorScale::Plasma);
assert_eq!(color, Color::Rgb(240, 249, 33));
}
#[test]
fn test_plasma_at_midpoint() {
let color = value_to_color(0.5, 0.0, 1.0, &HeatmapColorScale::Plasma);
assert_eq!(color, Color::Rgb(203, 74, 117));
}
#[test]
fn test_plasma_interpolation_smoothness() {
let scale = HeatmapColorScale::Plasma;
let steps = 100;
let mut prev: Option<(u8, u8, u8)> = None;
for i in 0..=steps {
let t = i as f64 / steps as f64;
let color = value_to_color(t, 0.0, 1.0, &scale);
if let Color::Rgb(r, g, b) = color {
if let Some((pr, pg, pb)) = prev {
let dr = (r as i16 - pr as i16).unsigned_abs();
let dg = (g as i16 - pg as i16).unsigned_abs();
let db = (b as i16 - pb as i16).unsigned_abs();
assert!(
dr <= 10,
"Plasma red channel jump too large at step {i}: {dr}"
);
assert!(
dg <= 10,
"Plasma green channel jump too large at step {i}: {dg}"
);
assert!(
db <= 10,
"Plasma blue channel jump too large at step {i}: {db}"
);
}
prev = Some((r, g, b));
} else {
panic!("Expected Color::Rgb from Plasma scale");
}
}
}
#[test]
fn test_plasma_clamped_below() {
let color = value_to_color(-5.0, 0.0, 1.0, &HeatmapColorScale::Plasma);
assert_eq!(color, Color::Rgb(13, 8, 135));
}
#[test]
fn test_plasma_clamped_above() {
let color = value_to_color(5.0, 0.0, 1.0, &HeatmapColorScale::Plasma);
assert_eq!(color, Color::Rgb(240, 249, 33));
}
#[test]
fn test_plasma_equal_range() {
let color = value_to_color(5.0, 5.0, 5.0, &HeatmapColorScale::Plasma);
assert_eq!(color, Color::Rgb(203, 74, 117));
}
#[test]
fn test_viridis_at_exact_lut_entry() {
let color = value_to_color(1.0 / 15.0, 0.0, 1.0, &HeatmapColorScale::Viridis);
assert_eq!(color, Color::Rgb(72, 26, 108));
}
#[test]
fn test_inferno_at_exact_lut_entry() {
let color = value_to_color(1.0 / 15.0, 0.0, 1.0, &HeatmapColorScale::Inferno);
assert_eq!(color, Color::Rgb(11, 7, 36));
}
#[test]
fn test_plasma_at_exact_lut_entry() {
let color = value_to_color(1.0 / 15.0, 0.0, 1.0, &HeatmapColorScale::Plasma);
assert_eq!(color, Color::Rgb(49, 4, 150));
}
#[test]
fn test_perceptual_scale_equality() {
assert_eq!(HeatmapColorScale::Viridis, HeatmapColorScale::Viridis);
assert_eq!(HeatmapColorScale::Inferno, HeatmapColorScale::Inferno);
assert_eq!(HeatmapColorScale::Plasma, HeatmapColorScale::Plasma);
assert_ne!(HeatmapColorScale::Viridis, HeatmapColorScale::Inferno);
assert_ne!(HeatmapColorScale::Viridis, HeatmapColorScale::Plasma);
assert_ne!(HeatmapColorScale::Inferno, HeatmapColorScale::Plasma);
assert_ne!(HeatmapColorScale::Viridis, HeatmapColorScale::GreenToRed);
}
#[test]
fn test_color_scale_default_is_green_to_red() {
assert_eq!(HeatmapColorScale::default(), HeatmapColorScale::GreenToRed);
}
#[test]
fn test_color_scale_partial_eq() {
assert_eq!(HeatmapColorScale::BlueToRed, HeatmapColorScale::BlueToRed);
assert_ne!(HeatmapColorScale::BlueToRed, HeatmapColorScale::GreenToRed);
assert_eq!(
HeatmapColorScale::Intensity(Color::Red),
HeatmapColorScale::Intensity(Color::Red)
);
assert_ne!(
HeatmapColorScale::Intensity(Color::Red),
HeatmapColorScale::Intensity(Color::Blue)
);
}
#[test]
fn test_color_scale_diverging_eq() {
assert_eq!(
HeatmapColorScale::BlueWhiteRed,
HeatmapColorScale::BlueWhiteRed
);
assert_eq!(
HeatmapColorScale::RedWhiteBlue,
HeatmapColorScale::RedWhiteBlue
);
assert_ne!(
HeatmapColorScale::BlueWhiteRed,
HeatmapColorScale::RedWhiteBlue
);
}