use crate::{
Calendar, FixedDate, LastWeekday, Month, NthWeekday, Ordinal, Rule, Weekday, Weekend,
WeekendShift, Year, YearRange,
};
pub const NERC: Calendar<'static> = Calendar {
name: "North American Energy Reliability Council",
weekend: Weekend::SAT_SUN,
rules: &[
Rule::Fixed(FixedDate::new(Month::Jan, 1).shift(WeekendShift::SunForward)),
Rule::Fixed(
FixedDate::new(Month::May, 30)
.shift(WeekendShift::SatBackSunForward)
.years(YearRange::literal_through(1970)),
),
Rule::LastWeekday(
LastWeekday::new(Weekday::Mon, Month::May).from_year(Year::literal(1971)),
),
Rule::Fixed(FixedDate::new(Month::Jul, 4).shift(WeekendShift::SunForward)),
Rule::NthWeekday(NthWeekday::new(Ordinal::First, Weekday::Mon, Month::Sep)),
Rule::NthWeekday(NthWeekday::new(Ordinal::Fourth, Weekday::Thu, Month::Nov)),
Rule::Fixed(FixedDate::new(Month::Dec, 25).shift(WeekendShift::SunForward)),
],
};
#[cfg(test)]
#[allow(clippy::unwrap_used, clippy::expect_used)]
mod tests {
use super::*;
use crate::Date;
fn ymd(y: u16, m: Month, d: u8) -> Date {
Date::from_ymd(y, m, d).unwrap()
}
#[test]
fn nerc_holidays_2024() {
assert!(NERC.is_holiday(ymd(2024, Month::Jan, 1))); assert!(NERC.is_holiday(ymd(2024, Month::May, 27))); assert!(NERC.is_holiday(ymd(2024, Month::Jul, 4))); assert!(NERC.is_holiday(ymd(2024, Month::Sep, 2))); assert!(NERC.is_holiday(ymd(2024, Month::Nov, 28))); assert!(NERC.is_holiday(ymd(2024, Month::Dec, 25))); }
#[test]
fn nerc_excludes_non_peak_holidays() {
assert!(!NERC.is_holiday(ymd(2024, Month::Jan, 15))); assert!(!NERC.is_holiday(ymd(2024, Month::Feb, 19))); assert!(!NERC.is_holiday(ymd(2024, Month::Jun, 19))); assert!(!NERC.is_holiday(ymd(2024, Month::Oct, 14))); assert!(!NERC.is_holiday(ymd(2024, Month::Nov, 11))); }
#[test]
fn nerc_sunday_forward_only() {
assert!(NERC.is_holiday(ymd(2022, Month::Dec, 26)));
assert!(NERC.is_holiday(ymd(2022, Month::Dec, 25))); assert!(!NERC.is_holiday(ymd(2026, Month::Jul, 3)));
assert!(!NERC.is_business_day(ymd(2026, Month::Jul, 4)));
}
}