use crate::{iter::MonthIter, ncal, Calendar, Month, MonthKind, YearKind, REFORM1582_JDN};
#[test]
fn julian_properties() {
let cal = Calendar::JULIAN;
assert!(cal.is_proleptic());
assert!(!cal.is_reforming());
assert_eq!(cal.reformation(), None);
assert_eq!(cal.last_julian_date(), None);
assert_eq!(cal.first_gregorian_date(), None);
}
#[test]
fn gregorian_properties() {
let cal = Calendar::GREGORIAN;
assert!(cal.is_proleptic());
assert!(!cal.is_reforming());
assert_eq!(cal.reformation(), None);
assert_eq!(cal.last_julian_date(), None);
assert_eq!(cal.first_gregorian_date(), None);
}
#[test]
fn gregorian_reform_properties() {
let cal = Calendar::REFORM1582;
assert!(!cal.is_proleptic());
assert!(cal.is_reforming());
assert_eq!(cal.reformation(), Some(REFORM1582_JDN));
let last_julian = cal.last_julian_date().unwrap();
assert_eq!(last_julian.calendar(), cal);
assert_eq!(last_julian.year(), 1582);
assert_eq!(last_julian.month(), Month::October);
assert_eq!(last_julian.day(), 4);
assert_eq!(last_julian.ordinal(), 277);
assert_eq!(last_julian.day_ordinal(), 4);
let first_gregorian = cal.first_gregorian_date().unwrap();
assert_eq!(first_gregorian.calendar(), cal);
assert_eq!(first_gregorian.year(), 1582);
assert_eq!(first_gregorian.month(), Month::October);
assert_eq!(first_gregorian.day(), 15);
assert_eq!(first_gregorian.ordinal(), 278);
assert_eq!(first_gregorian.day_ordinal(), 5);
}
#[test]
fn min_reform_properties() {
let cal = Calendar::reforming(1830692).unwrap();
assert!(!cal.is_proleptic());
assert!(cal.is_reforming());
assert_eq!(cal.reformation(), Some(1830692));
let last_julian = cal.last_julian_date().unwrap();
assert_eq!(last_julian.calendar(), cal);
assert_eq!(last_julian.year(), 300);
assert_eq!(last_julian.month(), Month::February);
assert_eq!(last_julian.day(), 28);
assert_eq!(last_julian.ordinal(), 59);
assert_eq!(last_julian.day_ordinal(), 28);
let first_gregorian = cal.first_gregorian_date().unwrap();
assert_eq!(first_gregorian.calendar(), cal);
assert_eq!(first_gregorian.year(), 300);
assert_eq!(first_gregorian.month(), Month::March);
assert_eq!(first_gregorian.day(), 1);
assert_eq!(first_gregorian.ordinal(), 60);
assert_eq!(first_gregorian.day_ordinal(), 1);
}
#[test]
fn ord() {
use std::cmp::Ordering;
let calendars = [
Calendar::JULIAN,
Calendar::reforming(1830692).unwrap(),
Calendar::REFORM1582,
Calendar::reforming(ncal::UNITED_KINGDOM).unwrap(),
Calendar::reforming(ncal::RUSSIA).unwrap(),
Calendar::reforming(2147439588).unwrap(),
Calendar::GREGORIAN,
];
for (i, cal1) in calendars.iter().enumerate() {
for (j, cal2) in calendars.iter().enumerate() {
match i.cmp(&j) {
Ordering::Less => assert!(cal1 < cal2),
Ordering::Equal => assert!(cal1 == cal2),
Ordering::Greater => assert!(cal1 > cal2),
}
}
}
}
#[test]
fn gregorian_leap_year() {
let cal = Calendar::GREGORIAN;
assert_eq!(cal.year_kind(2000), YearKind::Leap);
assert_eq!(cal.year_length(2000), 366);
for (m, days) in MonthIter::new().zip([31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]) {
let shape = cal.month_shape(2000, m).unwrap();
assert_eq!(shape.len(), days);
assert_eq!(shape.kind(), MonthKind::Normal);
}
}
#[test]
fn gregorian_common_year() {
let cal = Calendar::GREGORIAN;
assert_eq!(cal.year_kind(1900), YearKind::Common);
assert_eq!(cal.year_length(1900), 365);
for (m, days) in MonthIter::new().zip([31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]) {
let shape = cal.month_shape(1900, m).unwrap();
assert_eq!(shape.len(), days);
assert_eq!(shape.kind(), MonthKind::Normal);
}
}
#[test]
fn julian_leap_year() {
let cal = Calendar::JULIAN;
assert_eq!(cal.year_kind(1900), YearKind::Leap);
assert_eq!(cal.year_length(1900), 366);
for (m, days) in MonthIter::new().zip([31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]) {
let shape = cal.month_shape(1900, m).unwrap();
assert_eq!(shape.len(), days);
assert_eq!(shape.kind(), MonthKind::Normal);
}
}
#[test]
fn julian_common_year() {
let cal = Calendar::GREGORIAN;
assert_eq!(cal.year_kind(1901), YearKind::Common);
assert_eq!(cal.year_length(1901), 365);
for (m, days) in MonthIter::new().zip([31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]) {
let shape = cal.month_shape(1901, m).unwrap();
assert_eq!(shape.len(), days);
assert_eq!(shape.kind(), MonthKind::Normal);
}
}