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}"
);
}
}