use crate::calendar::Calendar;
use crate::utilities::unpack_date;
use time::{Date, Month};
use RustQuant_iso::*;
pub struct DenmarkCalendar;
impl Calendar for DenmarkCalendar {
fn new() -> Self {
Self
}
fn name(&self) -> &'static str {
"Denmark"
}
fn country_code(&self) -> ISO_3166 {
DENMARK
}
fn market_identifier_code(&self) -> ISO_10383 {
XCSE
}
fn is_holiday(&self, date: Date) -> bool {
let (y, m, d, _, yd, em) = unpack_date(date, false);
if (
(yd == em - 4)
|| (yd == em - 3)
|| (yd == em)
|| (yd == em + 25 && y <= 2023)
|| (yd == em + 38)
|| (yd == em + 39 && y >= 2009)
|| (yd == em + 49)
|| (d == 1 && m == Month::January)
|| (d == 5 && m == Month::June)
|| (d == 24 && m == Month::December)
|| (d == 25 && m == Month::December)
|| (d == 26 && m == Month::December)
|| (d == 31 && m == Month::December)
) {
return true;
}
false
}
}
#[cfg(test)]
mod test_denmark {
use super::*;
use time::macros::date;
#[test]
fn test_name() {
let calendar = DenmarkCalendar;
assert_eq!(calendar.name(), "Denmark");
}
#[test]
fn test_is_weekend() {
let calendar = DenmarkCalendar;
let sat = date!(2023 - 08 - 26);
let sun = date!(2023 - 08 - 27);
assert!(!calendar.is_business_day(sat));
assert!(!calendar.is_business_day(sun));
}
#[test]
fn test_is_public_holiday() {
let calendar = DenmarkCalendar;
let new_years_day = date!(2023 - 01 - 01);
let maunday_thursday = date!(2023 - 04 - 06);
let good_friday = date!(2023 - 04 - 07);
let easter_monday = date!(2023 - 04 - 10);
let general_prayer_day = date!(2023 - 05 - 05);
let ascension = date!(2023 - 05 - 18);
let day_after_ascension = date!(2023 - 05 - 19);
let whit_monday = date!(2023 - 05 - 29);
let constitution_day = date!(2023 - 06 - 05);
let christmas_eve = date!(2023 - 12 - 24);
let christmas = date!(2023 - 12 - 25);
let boxing_day = date!(2023 - 12 - 26);
let new_years_eve = date!(2023 - 12 - 31);
assert!(!calendar.is_business_day(new_years_day));
assert!(!calendar.is_business_day(maunday_thursday));
assert!(!calendar.is_business_day(good_friday));
assert!(!calendar.is_business_day(easter_monday));
assert!(!calendar.is_business_day(general_prayer_day));
assert!(!calendar.is_business_day(ascension));
assert!(!calendar.is_business_day(day_after_ascension));
assert!(!calendar.is_business_day(whit_monday));
assert!(!calendar.is_business_day(constitution_day));
assert!(!calendar.is_business_day(christmas_eve));
assert!(!calendar.is_business_day(christmas));
assert!(!calendar.is_business_day(boxing_day));
assert!(!calendar.is_business_day(new_years_eve));
}
#[test]
fn test_is_regular_business_day() {
let calendar = DenmarkCalendar;
let regular_day1 = date!(2023 - 03 - 15);
let regular_day2 = date!(2023 - 07 - 11);
let regular_day3 = date!(2023 - 09 - 15);
let regular_day4 = date!(2008 - 05 - 02); let regular_day5 = date!(2024 - 04 - 26);
assert!(calendar.is_business_day(regular_day1));
assert!(calendar.is_business_day(regular_day2));
assert!(calendar.is_business_day(regular_day3));
assert!(calendar.is_business_day(regular_day4));
assert!(calendar.is_business_day(regular_day5));
}
}