use super::Band;
pub trait RadialProfile {
fn profile_radii_arcsec(&self) -> Option<&[f64]>;
fn profile_surface_brightness(&self, band: Band) -> Option<&[f64]>;
fn profile_surface_brightness_ivar(&self, _band: Band) -> Option<&[f64]> {
None
}
}
#[cfg(test)]
mod tests {
use super::*;
struct ProfileEntry {
radii: Vec<f64>,
sb_r: Vec<f64>,
ivar_r: Vec<f64>,
}
impl RadialProfile for ProfileEntry {
fn profile_radii_arcsec(&self) -> Option<&[f64]> {
Some(&self.radii)
}
fn profile_surface_brightness(&self, band: Band) -> Option<&[f64]> {
match band {
Band::SdssR => Some(&self.sb_r),
_ => None,
}
}
fn profile_surface_brightness_ivar(&self, band: Band) -> Option<&[f64]> {
match band {
Band::SdssR => Some(&self.ivar_r),
_ => None,
}
}
}
#[test]
fn radii_and_surface_brightness_round_trip_as_borrowed_slices() {
let entry = ProfileEntry {
radii: vec![0.5, 1.0, 2.0, 4.0],
sb_r: vec![100.0, 60.0, 30.0, 5.0],
ivar_r: vec![0.01, 0.02, 0.04, 0.1],
};
let radii = entry.profile_radii_arcsec().unwrap();
let sb = entry.profile_surface_brightness(Band::SdssR).unwrap();
let ivar = entry.profile_surface_brightness_ivar(Band::SdssR).unwrap();
assert_eq!(radii.len(), 4);
assert_eq!(sb.len(), radii.len());
assert_eq!(ivar.len(), radii.len());
assert!(radii.windows(2).all(|w| w[1] > w[0]), "radii must increase");
assert!(std::ptr::eq(radii.as_ptr(), entry.radii.as_ptr()));
assert!(std::ptr::eq(sb.as_ptr(), entry.sb_r.as_ptr()));
}
#[test]
fn unmeasured_band_returns_none() {
let entry = ProfileEntry {
radii: vec![0.5, 1.0],
sb_r: vec![100.0, 50.0],
ivar_r: vec![0.01, 0.02],
};
assert!(entry.profile_surface_brightness(Band::GaiaG).is_none());
assert!(entry.profile_surface_brightness_ivar(Band::GaiaG).is_none());
}
struct NoProfile;
impl RadialProfile for NoProfile {
fn profile_radii_arcsec(&self) -> Option<&[f64]> {
None
}
fn profile_surface_brightness(&self, _band: Band) -> Option<&[f64]> {
None
}
}
#[test]
fn no_profile_implementor_returns_none_and_uses_default_ivar() {
let s = NoProfile;
assert!(s.profile_radii_arcsec().is_none());
assert!(s.profile_surface_brightness(Band::SdssR).is_none());
assert!(s.profile_surface_brightness_ivar(Band::SdssR).is_none());
}
}