use nexrad_model::data::Product;
use nexrad_render::{
clutter_filter_power_scale, correlation_coefficient_scale, default_scale,
differential_phase_scale, differential_reflectivity_scale, nws_reflectivity_scale,
spectrum_width_scale, velocity_scale, Color, ColorScaleLevel, DiscreteColorScale,
};
#[test]
fn test_discrete_color_scale_ordering() {
let scale = DiscreteColorScale::new(vec![
ColorScaleLevel::new(30.0, Color::rgb(0.0, 1.0, 0.0)),
ColorScaleLevel::new(0.0, Color::BLACK),
ColorScaleLevel::new(50.0, Color::rgb(1.0, 0.0, 0.0)),
]);
let color = scale.color(50.0);
assert_eq!(color, Color::rgb(1.0, 0.0, 0.0));
let color = scale.color(35.0);
assert_eq!(color, Color::rgb(0.0, 1.0, 0.0));
let color = scale.color(15.0);
assert_eq!(color, Color::BLACK);
}
#[test]
fn test_color_scale_boundary_values() {
let scale = DiscreteColorScale::new(vec![
ColorScaleLevel::new(0.0, Color::BLACK),
ColorScaleLevel::new(30.0, Color::rgb(0.0, 1.0, 0.0)),
ColorScaleLevel::new(50.0, Color::rgb(1.0, 0.0, 0.0)),
]);
assert_eq!(scale.color(50.0), Color::rgb(1.0, 0.0, 0.0));
assert_eq!(scale.color(30.0), Color::rgb(0.0, 1.0, 0.0));
assert_eq!(scale.color(0.0), Color::BLACK);
}
#[test]
fn test_color_scale_negative_values() {
let scale = DiscreteColorScale::new(vec![
ColorScaleLevel::new(-10.0, Color::rgb(0.0, 0.0, 1.0)),
ColorScaleLevel::new(0.0, Color::BLACK),
ColorScaleLevel::new(30.0, Color::rgb(0.0, 1.0, 0.0)),
]);
assert_eq!(scale.color(-5.0), Color::rgb(0.0, 0.0, 1.0));
let color = scale.color(-20.0);
assert_eq!(color, Color::rgb(0.0, 0.0, 1.0));
}
#[test]
fn test_color_scale_high_values() {
let scale = DiscreteColorScale::new(vec![
ColorScaleLevel::new(0.0, Color::BLACK),
ColorScaleLevel::new(50.0, Color::rgb(1.0, 0.0, 0.0)),
]);
assert_eq!(scale.color(100.0), Color::rgb(1.0, 0.0, 0.0));
assert_eq!(scale.color(75.0), Color::rgb(1.0, 0.0, 0.0));
}
#[test]
fn test_nws_reflectivity_scale() {
let scale = nws_reflectivity_scale();
let color = scale.color(0.0);
assert_eq!(color, Color::rgb(0.0, 0.0, 0.0));
let color = scale.color(25.0);
assert_eq!(color, Color::rgb(0.1961, 0.8039, 0.1961));
let color = scale.color(50.0);
assert_eq!(color, Color::rgb(1.0, 0.1882, 0.1882));
let color = scale.color(80.0);
assert_eq!(color, Color::rgb(1.0, 1.0, 1.0));
}
#[test]
fn test_color_scale_clone() {
let scale = nws_reflectivity_scale();
let cloned = scale.clone();
assert_eq!(scale.color(30.0), cloned.color(30.0));
assert_eq!(scale.color(50.0), cloned.color(50.0));
}
#[test]
fn test_color_scale_debug() {
let scale = nws_reflectivity_scale();
let debug_str = format!("{:?}", scale);
assert!(!debug_str.is_empty());
assert!(debug_str.contains("DiscreteColorScale"));
}
#[test]
fn test_velocity_scale_negative() {
let scale = velocity_scale();
let color = scale.color(-60.0);
assert_eq!(color, Color::rgb(0.0, 0.3922, 0.0));
let color = scale.color(-40.0);
assert_eq!(color, Color::rgb(0.0, 0.5451, 0.0));
}
#[test]
fn test_velocity_scale_zero() {
let scale = velocity_scale();
let color = scale.color(0.0);
assert_eq!(color, Color::rgb(0.6627, 0.6627, 0.6627));
}
#[test]
fn test_velocity_scale_positive() {
let scale = velocity_scale();
let color = scale.color(64.0);
assert_eq!(color, Color::rgb(0.5451, 0.0, 0.0));
let color = scale.color(50.0);
assert_eq!(color, Color::rgb(0.8039, 0.0, 0.0));
let color = scale.color(40.0);
assert_eq!(color, Color::rgb(1.0, 0.4118, 0.4118));
}
#[test]
fn test_spectrum_width_scale() {
let scale = spectrum_width_scale();
let color = scale.color(2.0);
assert_eq!(color, Color::rgb(0.502, 0.502, 0.502));
let color = scale.color(14.0);
assert_eq!(color, Color::rgb(0.0, 0.8039, 0.0));
let color = scale.color(28.0);
assert_eq!(color, Color::rgb(1.0, 0.0, 0.0));
}
#[test]
fn test_differential_reflectivity_scale() {
let scale = differential_reflectivity_scale();
let color = scale.color(-1.5);
assert_eq!(color, Color::rgb(0.502, 0.0, 0.502));
let color = scale.color(0.25);
assert_eq!(color, Color::rgb(0.6627, 0.6627, 0.6627));
let color = scale.color(3.0);
assert_eq!(color, Color::rgb(1.0, 0.6471, 0.0));
}
#[test]
fn test_correlation_coefficient_scale() {
let scale = correlation_coefficient_scale();
let color = scale.color(0.3);
assert_eq!(color, Color::rgb(0.3922, 0.0, 0.5882));
let color = scale.color(0.99);
assert_eq!(color, Color::rgb(0.902, 0.902, 0.902));
}
#[test]
fn test_differential_phase_scale() {
let scale = differential_phase_scale();
let color = scale.color(20.0);
assert_eq!(color, Color::rgb(0.502, 0.0, 0.502));
let color = scale.color(150.0);
assert_eq!(color, Color::rgb(0.0, 0.8039, 0.0));
let color = scale.color(300.0);
assert_eq!(color, Color::rgb(1.0, 0.0, 0.0));
}
#[test]
fn test_clutter_filter_power_scale() {
let scale = clutter_filter_power_scale();
let color = scale.color(-15.0);
assert_eq!(color, Color::rgb(0.0, 0.0, 0.5451));
let color = scale.color(0.0);
assert_eq!(color, Color::rgb(0.6627, 0.6627, 0.6627));
let color = scale.color(12.0);
assert_eq!(color, Color::rgb(1.0, 0.4118, 0.4118));
}
#[test]
fn test_default_scale_reflectivity() {
let scale = default_scale(Product::Reflectivity);
let nws_scale = nws_reflectivity_scale();
assert_eq!(scale.color(30.0), nws_scale.color(30.0));
assert_eq!(scale.color(50.0), nws_scale.color(50.0));
}
#[test]
fn test_default_scale_velocity() {
let scale = default_scale(Product::Velocity);
let velocity_scale = velocity_scale();
assert_eq!(scale.color(-32.0), velocity_scale.color(-32.0));
assert_eq!(scale.color(32.0), velocity_scale.color(32.0));
}
#[test]
fn test_default_scale_all_products() {
let products = [
Product::Reflectivity,
Product::Velocity,
Product::SpectrumWidth,
Product::DifferentialReflectivity,
Product::DifferentialPhase,
Product::CorrelationCoefficient,
Product::ClutterFilterPower,
];
for product in products {
let scale = default_scale(product);
let _ = scale.color(0.0);
let _ = scale.color(50.0);
}
}