use crate::optics::materials::GemMaterial;
#[test]
fn every_builtin_has_an_explicit_scattering_arm() {
for material in GemMaterial::all_materials() {
assert!(
GemMaterial::recommended_scattering_arm(&material.name).is_some(),
"{} has no explicit recommended_scattering arm -- it silently falls \
through to the generic default",
material.name
);
}
}
#[test]
fn new_custom_dispersion_delta_measures_exactly_at_f_and_c() {
for dispersion_delta in [0.005f32, 0.010, 0.02564, 0.05] {
let material =
GemMaterial::new_custom("F-C probe", 1.6, dispersion_delta, 0.0, [0.0, 0.0, 0.0]);
let n_f = material.dispersion.evaluate(486.1);
let n_c = material.dispersion.evaluate(656.3);
let measured = n_f - n_c;
assert!(
(measured - dispersion_delta).abs() < 1e-4,
"requested F-C delta {dispersion_delta} but measured {measured} \
(n_F={n_f}, n_C={n_c})"
);
}
}
#[test]
fn new_custom_preserves_mean_ri_at_sodium_d_line_regardless_of_dispersion_delta() {
for dispersion_delta in [0.0f32, 0.01, 0.03] {
let material =
GemMaterial::new_custom("D-line probe", 1.72, dispersion_delta, 0.0, [0.0, 0.0, 0.0]);
let n_d = material.dispersion.evaluate(589.3);
assert!(
(n_d - 1.72).abs() < 1e-4,
"dispersion_delta={dispersion_delta}: n_d should stay 1.72, got {n_d}"
);
}
}
#[test]
fn with_body_colour_changes_only_the_absorption() {
let yellow = crate::optics::materials::body_colour::BODY_COLOUR_PRESETS[5];
assert_eq!(
yellow.key, "yellow",
"test premise: index 5 is the yellow preset"
);
let base = GemMaterial::sapphire();
let coloured = base.clone().with_body_colour(yellow.absorption_rgb);
assert_eq!(coloured.name, base.name);
assert_eq!(coloured.dispersion, base.dispersion);
assert_eq!(
coloured.birefringence_delta.to_bits(),
base.birefringence_delta.to_bits()
);
assert_eq!(
coloured.c_axis.to_array().map(f32::to_bits),
base.c_axis.to_array().map(f32::to_bits)
);
assert_ne!(
coloured.absorption, base.absorption,
"the colour variant must actually change the absorption"
);
assert_eq!(
coloured.absorption,
crate::optics::absorption::AbsorptionTensor::isotropic(
crate::optics::absorption::legacy_rgb_bands(yellow.absorption_rgb)
)
);
let mut restored = coloured;
restored.absorption = base.absorption.clone();
assert_eq!(restored, base);
}