use std::fmt;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[repr(i16)]
pub enum Frequency {
NoFrequency = -1,
Once = 0,
Annual = 1,
Semiannual = 2,
EveryFourthMonth = 3,
Quarterly = 4,
Bimonthly = 6,
Monthly = 12,
EveryFourthWeek = 13,
Biweekly = 26,
Weekly = 52,
Daily = 365,
OtherFrequency = 999,
}
impl fmt::Display for Frequency {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let name = match self {
Frequency::NoFrequency => "No-Frequency",
Frequency::Once => "Once",
Frequency::Annual => "Annual",
Frequency::Semiannual => "Semiannual",
Frequency::EveryFourthMonth => "Every-Fourth-Month",
Frequency::Quarterly => "Quarterly",
Frequency::Bimonthly => "Bimonthly",
Frequency::Monthly => "Monthly",
Frequency::EveryFourthWeek => "Every-fourth-week",
Frequency::Biweekly => "Biweekly",
Frequency::Weekly => "Weekly",
Frequency::Daily => "Daily",
Frequency::OtherFrequency => "Unknown frequency",
};
f.write_str(name)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn discriminants_match_events_per_year() {
assert_eq!(Frequency::NoFrequency as i16, -1);
assert_eq!(Frequency::Once as i16, 0);
assert_eq!(Frequency::Annual as i16, 1);
assert_eq!(Frequency::Quarterly as i16, 4);
assert_eq!(Frequency::Monthly as i16, 12);
assert_eq!(Frequency::Weekly as i16, 52);
assert_eq!(Frequency::Daily as i16, 365);
assert_eq!(Frequency::OtherFrequency as i16, 999);
}
#[test]
fn display_matches_quantlib_labels() {
assert_eq!(Frequency::NoFrequency.to_string(), "No-Frequency");
assert_eq!(
Frequency::EveryFourthMonth.to_string(),
"Every-Fourth-Month"
);
assert_eq!(Frequency::EveryFourthWeek.to_string(), "Every-fourth-week");
assert_eq!(Frequency::OtherFrequency.to_string(), "Unknown frequency");
}
}