From d938156dfb2ee4da85690ce3f1fb93cf81bd2cff Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Thu, 23 May 2024 09:26:26 -0700 Subject: [PATCH] Fix bugs in several calendars with new continuity test (#4904) Fixes #2703 Fixes #4914 Mostly fixes #2713 --- Cargo.lock | 2 + components/calendar/Cargo.toml | 2 + components/calendar/src/chinese_based.rs | 5 +- components/calendar/src/coptic.rs | 2 +- components/calendar/src/duration.rs | 12 +- components/calendar/src/ethiopian.rs | 2 +- components/calendar/src/islamic.rs | 110 +++- components/calendar/src/iso.rs | 45 -- components/calendar/src/lib.rs | 2 + .../calendar/src/provider/chinese_based.rs | 9 +- components/calendar/src/provider/islamic.rs | 48 +- .../calendar/src/tests/continuity_test.rs | 238 +++++++++ components/calendar/src/tests/mod.rs | 5 + components/datetime/Cargo.toml | 3 +- components/icu/Cargo.toml | 2 +- .../macros/calendar_chinesecache_v1.rs.data | 2 +- .../macros/calendar_dangicache_v1.rs.data | 2 +- ...endar_islamicobservationalcache_v1.rs.data | 2 +- .../macros/calendar_chinesecache_v1.rs.data | 2 +- .../macros/calendar_dangicache_v1.rs.data | 2 +- ...endar_islamicobservationalcache_v1.rs.data | 2 +- .../json/calendar/chinesecache@1/und.json | 500 +++++++++--------- .../data/json/calendar/dangicache@1/und.json | 500 +++++++++--------- .../islamicobservationalcache@1/und.json | 2 +- .../tests/data/postcard/fingerprints.csv | 6 +- utils/calendrical_calculations/Cargo.toml | 2 + .../calendrical_calculations/src/astronomy.rs | 1 + .../src/chinese_based.rs | 57 +- .../src/hebrew_keviyah.rs | 22 +- utils/calendrical_calculations/src/islamic.rs | 100 +++- 30 files changed, 1049 insertions(+), 640 deletions(-) create mode 100644 components/calendar/src/tests/continuity_test.rs create mode 100644 components/calendar/src/tests/mod.rs diff --git a/Cargo.lock b/Cargo.lock index ea3e09f1406..08f28fe0c99 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -296,6 +296,7 @@ version = "0.1.0" dependencies = [ "core_maths", "displaydoc", + "log", ] [[package]] @@ -942,6 +943,7 @@ dependencies = [ "icu_provider", "serde", "serde_json", + "simple_logger", "tinystr", "writeable", "zerovec", diff --git a/components/calendar/Cargo.toml b/components/calendar/Cargo.toml index 623b47c684b..3c490afb19f 100644 --- a/components/calendar/Cargo.toml +++ b/components/calendar/Cargo.toml @@ -39,6 +39,7 @@ icu = { path = "../../components/icu", default-features = false } icu_benchmark_macros = { path = "../../tools/benchmark/macros" } serde = { workspace = true, features = ["derive", "alloc"] } serde_json = { workspace = true } +simple_logger = { workspace = true } [target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies] @@ -47,6 +48,7 @@ criterion = { workspace = true } [features] default = ["compiled_data"] +logging = ["calendrical_calculations/logging"] std = ["icu_provider/std", "icu_locid/std", "calendrical_calculations/std"] serde = ["dep:serde", "zerovec/serde", "tinystr/serde", "icu_provider/serde"] datagen = ["serde", "dep:databake", "zerovec/databake", "tinystr/databake"] diff --git a/components/calendar/src/chinese_based.rs b/components/calendar/src/chinese_based.rs index ea0ee759ec4..212801daa09 100644 --- a/components/calendar/src/chinese_based.rs +++ b/components/calendar/src/chinese_based.rs @@ -106,7 +106,10 @@ fn compute_packed_with_yb( let ny_offset = if let Ok(ny_offset) = u8::try_from(ny_offset) { ny_offset } else { - debug_assert!(false, "Expected small new years offset, got {ny_offset}"); + debug_assert!( + false, + "Expected small new years offset, got {ny_offset} in ISO year {related_iso}" + ); 0 }; PackedChineseBasedYearInfo::new(month_lengths, leap_month, ny_offset) diff --git a/components/calendar/src/coptic.rs b/components/calendar/src/coptic.rs index e4819e20a91..7564512b217 100644 --- a/components/calendar/src/coptic.rs +++ b/components/calendar/src/coptic.rs @@ -87,7 +87,7 @@ impl CalendarArithmetic for Coptic { } fn is_leap_year(year: i32, _data: ()) -> bool { - year % 4 == 3 + year.rem_euclid(4) == 3 } fn last_month_day_in_year(year: i32, _data: ()) -> (u8, u8) { diff --git a/components/calendar/src/duration.rs b/components/calendar/src/duration.rs index 5ae7ed8bfc4..01b8fe4035f 100644 --- a/components/calendar/src/duration.rs +++ b/components/calendar/src/duration.rs @@ -64,7 +64,7 @@ use core::marker::PhantomData; /// ``` /// /// Currently unstable for ICU4X 1.0 -#[derive(Copy, Clone, Eq, PartialEq)] +#[derive(Eq, PartialEq)] #[allow(clippy::exhaustive_structs)] // this type should be stable (and is intended to be constructed manually) #[doc(hidden)] pub struct DateDuration { @@ -80,6 +80,16 @@ pub struct DateDuration { pub marker: PhantomData, } +// Custom impl so that C need not be bound on Copy/Clone +impl Clone for DateDuration { + fn clone(&self) -> Self { + *self + } +} + +// Custom impl so that C need not be bound on Copy/Clone +impl Copy for DateDuration {} + /// A "duration unit" used to specify the minimum or maximum duration of time to /// care about /// diff --git a/components/calendar/src/ethiopian.rs b/components/calendar/src/ethiopian.rs index 09ecfd60d10..1e519f55e4e 100644 --- a/components/calendar/src/ethiopian.rs +++ b/components/calendar/src/ethiopian.rs @@ -107,7 +107,7 @@ impl CalendarArithmetic for Ethiopian { } fn is_leap_year(year: i32, _data: ()) -> bool { - year % 4 == 3 + year.rem_euclid(4) == 3 } fn last_month_day_in_year(year: i32, _data: ()) -> (u8, u8) { diff --git a/components/calendar/src/islamic.rs b/components/calendar/src/islamic.rs index 9252af9c213..1f801403c65 100644 --- a/components/calendar/src/islamic.rs +++ b/components/calendar/src/islamic.rs @@ -218,34 +218,89 @@ impl IslamicTabular { } } +/// Compact representation of the length of an Islamic year. +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] +enum IslamicYearLength { + /// Long (355-day) Islamic year + L355, + /// Short (354-day) Islamic year + L354, + /// Unexpectedly Short (353-day) Islamic year + /// + /// It is probably a bug when this year length is returned. See: + /// + L353, +} + +impl Default for IslamicYearLength { + fn default() -> Self { + Self::L354 + } +} + +impl IslamicYearLength { + fn try_from_int(value: i64) -> Option { + match value { + 355 => Some(Self::L355), + 354 => Some(Self::L354), + 353 => Some(Self::L353), + _ => None, + } + } + fn to_int(self) -> u16 { + match self { + Self::L355 => 355, + Self::L354 => 354, + Self::L353 => 353, + } + } +} + #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] pub(crate) struct IslamicYearInfo { packed_data: PackedIslamicYearInfo, - /// Is the previous year 355 days (short = 354) - prev_year_long: bool, + prev_year_length: IslamicYearLength, } impl IslamicYearInfo { pub(crate) const LONG_YEAR_LEN: u16 = 355; const SHORT_YEAR_LEN: u16 = 354; - pub(crate) fn new(prev_year_long: bool, packed_data: PackedIslamicYearInfo) -> Self { - Self { - prev_year_long, - packed_data, - } + pub(crate) fn new( + prev_packed: PackedIslamicYearInfo, + this_packed: PackedIslamicYearInfo, + extended_year: i32, + ) -> (Self, i32) { + let days_in_year = prev_packed.days_in_year(); + let days_in_year = match IslamicYearLength::try_from_int(days_in_year as i64) { + Some(x) => x, + None => { + debug_assert!(false, "Found wrong year length for Islamic year {extended_year}: Expected 355, 354, or 353, got {days_in_year}"); + Default::default() + } + }; + let year_info = Self { + prev_year_length: days_in_year, + packed_data: this_packed, + }; + (year_info, extended_year) } fn compute(extended_year: i32) -> Self { let ny = IB::fixed_from_islamic(extended_year, 1, 1); let packed_data = PackedIslamicYearInfo::compute_with_ny::(extended_year, ny); let prev_ny = IB::fixed_from_islamic(extended_year - 1, 1, 1); - let diff = u16::try_from(ny - prev_ny).unwrap_or(0); - debug_assert!( - diff == Self::SHORT_YEAR_LEN || diff == Self::LONG_YEAR_LEN, - "Found wrong year length for Islamic year {}: Expected 355 or 354, got {diff}", - extended_year - 1 - ); - Self::new(diff == Self::LONG_YEAR_LEN, packed_data) + let rd_diff = ny - prev_ny; + let rd_diff = match IslamicYearLength::try_from_int(rd_diff) { + Some(x) => x, + None => { + debug_assert!(false, "({}) Found wrong year length for Islamic year {extended_year}: Expected 355, 354, or 353, got {rd_diff}", IB::DEBUG_NAME); + Default::default() + } + }; + Self { + prev_year_length: rd_diff, + packed_data, + } } /// Get the new year R.D. given the extended year that this yearinfo is for fn new_year(self, extended_year: i32) -> RataDie { @@ -266,11 +321,7 @@ impl IslamicYearInfo { #[inline] fn days_in_prev_year(self) -> u16 { - if self.prev_year_long { - Self::LONG_YEAR_LEN - } else { - Self::SHORT_YEAR_LEN - } + self.prev_year_length.to_int() } } @@ -848,9 +899,9 @@ impl CalendarArithmetic for IslamicCivil { fn days_in_provided_year(year: i32, _data: ()) -> u16 { if Self::is_leap_year(year, ()) { - 355 + IslamicYearInfo::LONG_YEAR_LEN } else { - 354 + IslamicYearInfo::SHORT_YEAR_LEN } } @@ -1092,9 +1143,9 @@ impl CalendarArithmetic for IslamicTabular { fn days_in_provided_year(year: i32, _data: ()) -> u16 { if Self::is_leap_year(year, ()) { - 355 + IslamicYearInfo::LONG_YEAR_LEN } else { - 354 + IslamicYearInfo::SHORT_YEAR_LEN } } @@ -2176,4 +2227,17 @@ mod test { assert_eq!(islamic.month().ordinal, 4); assert_eq!(islamic.year().number, 1432); } + + #[test] + fn test_regression_4914() { + // https://github.com/unicode-org/icu4x/issues/4914 + let cal = IslamicUmmAlQura::new_always_calculating(); + let era = "ah".parse().unwrap(); + let year = -6823; + let month_code = "M01".parse().unwrap(); + let dt = cal.date_from_codes(era, year, month_code, 1).unwrap(); + assert_eq!(dt.0.day, 1); + assert_eq!(dt.0.month, 1); + assert_eq!(dt.0.year, -6823); + } } diff --git a/components/calendar/src/iso.rs b/components/calendar/src/iso.rs index cddbf3a656c..6f28fef25b3 100644 --- a/components/calendar/src/iso.rs +++ b/components/calendar/src/iso.rs @@ -834,49 +834,4 @@ mod test { check(-1439, 1969, 12, 31, 0, 1); check(-2879, 1969, 12, 30, 0, 1); } - - #[test] - fn test_continuity_near_year_zero() { - // https://github.com/unicode-org/icu4x/issues/4893 - const ONE_DAY_DURATION: DateDuration = DateDuration { - years: 0, - months: 0, - weeks: 0, - days: 1, - marker: core::marker::PhantomData, - }; - - let mut iso_date = Date::try_new_iso_date(-10, 1, 1).unwrap(); - let mut rata_die = iso_date.to_fixed(); - let mut weekday = iso_date.day_of_week(); - - for _ in 0..(366 * 20) { - let next_iso_date = iso_date.added(ONE_DAY_DURATION); - let next_rata_die = next_iso_date.to_fixed(); - assert_eq!( - next_rata_die, - rata_die + 1, - "{iso_date:?}..{next_iso_date:?}" - ); - let next_weekday = next_iso_date.day_of_week(); - assert_eq!( - (next_weekday as usize) % 7, - (weekday as usize + 1) % 7, - "{iso_date:?}..{next_iso_date:?}" - ); - if iso_date.month().code.parsed().unwrap().0 == 2 && iso_date.day_of_month().0 == 28 { - assert_eq!(next_iso_date.is_in_leap_year(), iso_date.is_in_leap_year()); - if iso_date.is_in_leap_year() { - assert_eq!(next_iso_date.month().code.parsed().unwrap().0, 2); - assert_eq!(next_iso_date.day_of_month().0, 29); - } else { - assert_eq!(next_iso_date.month().code.parsed().unwrap().0, 3); - assert_eq!(next_iso_date.day_of_month().0, 1); - } - } - iso_date = next_iso_date; - rata_die = next_rata_die; - weekday = next_weekday; - } - } } diff --git a/components/calendar/src/lib.rs b/components/calendar/src/lib.rs index 2e3007af59e..ba3e3b7a8ce 100644 --- a/components/calendar/src/lib.rs +++ b/components/calendar/src/lib.rs @@ -136,6 +136,8 @@ pub mod julian; pub mod persian; pub mod provider; pub mod roc; +#[cfg(test)] +mod tests; pub mod types; mod week_of; diff --git a/components/calendar/src/provider/chinese_based.rs b/components/calendar/src/provider/chinese_based.rs index 0eae8012ac6..ebf83436f90 100644 --- a/components/calendar/src/provider/chinese_based.rs +++ b/components/calendar/src/provider/chinese_based.rs @@ -151,8 +151,11 @@ impl PackedChineseBasedYearInfo { /// /// According to Reingold & Dershowitz, ch 19.6, Chinese New Year occurs on Jan 21 - Feb 21 inclusive. /// - /// Chinese New Year in the year 30 AD is January 20 (30-01-20) - pub(crate) const FIRST_NY: u8 = 20; + /// Chinese New Year in the year 30 AD is January 20 (30-01-20). + /// + /// We allow it to occur as early as January 19 which is the earliest the second new moon + /// could occur after the Winter Solstice if the solstice is pinned to December 20. + pub(crate) const FIRST_NY: u8 = 19; pub(crate) fn new( month_lengths: [bool; 13], @@ -163,7 +166,7 @@ impl PackedChineseBasedYearInfo { !month_lengths[12] || leap_month_idx.is_some(), "Last month length should not be set for non-leap years" ); - debug_assert!(ny_offset < 33, "Year offset too big to store"); + debug_assert!(ny_offset < 34, "Year offset too big to store"); debug_assert!( leap_month_idx.map(|l| l.get() <= 13).unwrap_or(true), "Leap month indices must be 1 <= i <= 13" diff --git a/components/calendar/src/provider/islamic.rs b/components/calendar/src/provider/islamic.rs index 3715ab2e87f..85e70bacb74 100644 --- a/components/calendar/src/provider/islamic.rs +++ b/components/calendar/src/provider/islamic.rs @@ -15,6 +15,7 @@ use crate::islamic::IslamicYearInfo; use calendrical_calculations::islamic::IslamicBasedMarker; use calendrical_calculations::rata_die::RataDie; +use core::fmt; use icu_provider::prelude::*; use zerovec::ule::{AsULE, ULE}; use zerovec::ZeroVec; @@ -78,12 +79,7 @@ impl<'data> IslamicCacheV1<'data> { return None; }; - let days_in_prev_year = prev_packed.days_in_year(); - - Some(IslamicYearInfo::new( - days_in_prev_year == IslamicYearInfo::LONG_YEAR_LEN, - this_packed, - )) + Some(IslamicYearInfo::new(prev_packed, this_packed, extended_year).0) } /// Get the cached data for the Islamic Year corresponding to a given day. /// @@ -108,11 +104,9 @@ impl<'data> IslamicCacheV1<'data> { if fixed < this_ny { let prev2_packed = self.data.get(delta - 2)?; - return Some(( - IslamicYearInfo::new( - prev2_packed.days_in_year() == IslamicYearInfo::LONG_YEAR_LEN, - prev_packed, - ), + return Some(IslamicYearInfo::new( + prev2_packed, + prev_packed, extended_year - 1, )); } @@ -120,19 +114,15 @@ impl<'data> IslamicCacheV1<'data> { let next_ny = next_packed.ny::(extended_year + 1); if fixed >= next_ny { - Some(( - IslamicYearInfo::new( - this_packed.days_in_year() == IslamicYearInfo::LONG_YEAR_LEN, - next_packed, - ), + Some(IslamicYearInfo::new( + this_packed, + next_packed, extended_year + 1, )) } else { - Some(( - IslamicYearInfo::new( - prev_packed.days_in_year() == IslamicYearInfo::LONG_YEAR_LEN, - this_packed, - ), + Some(IslamicYearInfo::new( + prev_packed, + this_packed, extended_year, )) } @@ -159,7 +149,7 @@ impl<'data> IslamicCacheV1<'data> { /// including in SemVer minor releases. While the serde representation of data structs is guaranteed /// to be stable, their Rust representation might not be. Use with caution. /// -#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, ULE)] +#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, ULE)] #[cfg_attr( feature = "datagen", derive(serde::Serialize, databake::Bake), @@ -169,6 +159,15 @@ impl<'data> IslamicCacheV1<'data> { #[repr(packed)] pub struct PackedIslamicYearInfo(pub u8, pub u8); +impl fmt::Debug for PackedIslamicYearInfo { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> { + fmt.debug_struct("PackedIslamicYearInfo") + .field("ny_offset", &self.ny_offset()) + .field("month_lengths", &self.month_lengths()) + .finish() + } +} + impl PackedIslamicYearInfo { pub(crate) fn new(month_lengths: [bool; 12], ny_offset: i8) -> Self { debug_assert!( @@ -193,6 +192,11 @@ impl PackedIslamicYearInfo { Self(le[0], le[1]) } + fn month_lengths(self) -> [u8; 12] { + let months: [u8; 12] = core::array::from_fn(|i| 1 + i as u8); + months.map(|x| if self.month_has_30_days(x) { 30 } else { 29 }) + } + // Get the new year offset from the mean synodic new year pub(crate) fn ny_offset(self) -> i8 { let masked = (self.1 >> 5) as i8; diff --git a/components/calendar/src/tests/continuity_test.rs b/components/calendar/src/tests/continuity_test.rs new file mode 100644 index 00000000000..955954906da --- /dev/null +++ b/components/calendar/src/tests/continuity_test.rs @@ -0,0 +1,238 @@ +// This file is part of ICU4X. For terms of use, please see the file +// called LICENSE at the top level of the ICU4X source tree +// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). + +use crate::*; +use core::marker::PhantomData; + +fn check_continuity(mut date: Date) { + let one_day_duration = DateDuration:: { + years: 0, + months: 0, + weeks: 0, + days: 1, + marker: PhantomData, + }; + + let mut rata_die = date.to_fixed(); + let mut weekday = date.day_of_week(); + let mut year = date.year(); + let mut is_in_leap_year = date.is_in_leap_year(); + + for _ in 0..(366 * 20) { + let next_date = date.added(one_day_duration); + let next_rata_die = next_date.to_fixed(); + assert_eq!(next_rata_die, rata_die + 1, "{next_date:?}"); + let next_weekday = next_date.day_of_week(); + let next_year = next_date.year(); + let next_is_in_leap_year = next_date.is_in_leap_year(); + assert_eq!( + (next_weekday as usize) % 7, + (weekday as usize + 1) % 7, + "{next_date:?}" + ); + if year == next_year { + assert_eq!(is_in_leap_year, next_is_in_leap_year, "{next_date:?}"); + } + date = next_date; + rata_die = next_rata_die; + weekday = next_weekday; + year = next_year; + is_in_leap_year = next_is_in_leap_year; + } +} + +fn check_every_250_days(mut date: Date) { + let one_thousand_days_duration = DateDuration:: { + years: 0, + months: 0, + weeks: 0, + days: 250, + marker: PhantomData, + }; + + let mut rata_die = date.to_fixed(); + + for _ in 0..2000 { + let next_date = date.added(one_thousand_days_duration); + let next_iso = next_date.to_iso(); + let next_rata_die = next_iso.to_fixed(); + assert_eq!(next_rata_die, rata_die + 250, "{next_date:?}"); + let next_date_roundtrip = next_iso.to_calendar(Ref(next_date.calendar())); + assert_eq!(next_date, next_date_roundtrip, "{next_date:?}"); + date = next_date; + rata_die = next_rata_die; + } +} + +#[test] +fn test_buddhist_continuity() { + let date = Date::try_new_buddhist_date(-10, 1, 1); + check_continuity(date.unwrap()); + let date = Date::try_new_buddhist_date(-300, 1, 1); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_chinese_continuity() { + let cal = crate::chinese::Chinese::new(); + let cal = Ref(&cal); + let date = Date::try_new_chinese_date_with_calendar(-10, 1, 1, cal); + check_continuity(date.unwrap()); + let date = Date::try_new_chinese_date_with_calendar(-300, 1, 1, cal); + check_every_250_days(date.unwrap()); + let date = Date::try_new_chinese_date_with_calendar(-10000, 1, 1, cal); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_coptic_continuity() { + let date = Date::try_new_coptic_date(-10, 1, 1); + check_continuity(date.unwrap()); + let date = Date::try_new_coptic_date(-300, 1, 1); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_dangi_continuity() { + let cal = crate::dangi::Dangi::new(); + let cal = Ref(&cal); + let date = Date::try_new_dangi_date_with_calendar(-10, 1, 1, cal); + check_continuity(date.unwrap()); + let date = Date::try_new_dangi_date_with_calendar(-300, 1, 1, cal); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_ethiopian_continuity() { + use crate::ethiopian::EthiopianEraStyle::*; + let date = Date::try_new_ethiopian_date(AmeteMihret, -10, 1, 1); + check_continuity(date.unwrap()); + let date = Date::try_new_ethiopian_date(AmeteMihret, -300, 1, 1); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_ethiopian_amete_alem_continuity() { + use crate::ethiopian::EthiopianEraStyle::*; + let date = Date::try_new_ethiopian_date(AmeteAlem, -10, 1, 1); + check_continuity(date.unwrap()); + let date = Date::try_new_ethiopian_date(AmeteAlem, -300, 1, 1); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_gregorian_continuity() { + let date = Date::try_new_gregorian_date(-10, 1, 1); + check_continuity(date.unwrap()); + let date = Date::try_new_gregorian_date(-300, 1, 1); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_hebrew_continuity() { + let date = Date::try_new_hebrew_date(-10, 1, 1); + check_continuity(date.unwrap()); + let date = Date::try_new_hebrew_date(-300, 1, 1); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_indian_continuity() { + let date = Date::try_new_indian_date(-10, 1, 1); + check_continuity(date.unwrap()); + let date = Date::try_new_indian_date(-300, 1, 1); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_islamic_civil_continuity() { + let cal = crate::islamic::IslamicCivil::new(); + let cal = Ref(&cal); + let date = Date::try_new_islamic_civil_date_with_calendar(-10, 1, 1, cal); + check_continuity(date.unwrap()); + let date = Date::try_new_islamic_civil_date_with_calendar(-300, 1, 1, cal); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_islamic_observational_continuity() { + #[cfg(feature = "logging")] + let _ = simple_logger::SimpleLogger::new().env().init(); + let cal = crate::islamic::IslamicObservational::new(); + let cal = Ref(&cal); + let date = Date::try_new_observational_islamic_date(-10, 1, 1, cal); + check_continuity(date.unwrap()); + let date = Date::try_new_observational_islamic_date(-300, 1, 1, cal); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_islamic_tabular_continuity() { + let cal = crate::islamic::IslamicTabular::new(); + let cal = Ref(&cal); + let date = Date::try_new_islamic_tabular_date_with_calendar(-10, 1, 1, cal); + check_continuity(date.unwrap()); + let date = Date::try_new_islamic_tabular_date_with_calendar(-300, 1, 1, cal); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_islamic_umm_al_qura_continuity() { + #[cfg(feature = "logging")] + let _ = simple_logger::SimpleLogger::new().env().init(); + let cal = crate::islamic::IslamicUmmAlQura::new(); + let cal = Ref(&cal); + let date = Date::try_new_ummalqura_date(-10, 1, 1, cal); + check_continuity(date.unwrap()); + let date = Date::try_new_ummalqura_date(-300, 1, 1, cal); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_iso_continuity() { + let date = Date::try_new_iso_date(-10, 1, 1); + check_continuity(date.unwrap()); + let date = Date::try_new_iso_date(-300, 1, 1); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_japanese_continuity() { + use crate::types::Era; + use tinystr::tinystr; + let cal = crate::japanese::Japanese::new(); + let cal = Ref(&cal); + let date = Date::try_new_japanese_date(Era(tinystr!(16, "heisei")), 20, 1, 1, cal); + check_continuity(date.unwrap()); + let date = Date::try_new_japanese_date(Era(tinystr!(16, "bce")), 500, 1, 1, cal); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_japanese_extended_continuity() { + use crate::types::Era; + use tinystr::tinystr; + let cal = crate::japanese::JapaneseExtended::new(); + let cal = Ref(&cal); + let date = Date::try_new_japanese_extended_date(Era(tinystr!(16, "heisei")), 20, 1, 1, cal); + check_continuity(date.unwrap()); + let date = Date::try_new_japanese_extended_date(Era(tinystr!(16, "bce")), 500, 1, 1, cal); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_persian_continuity() { + let date = Date::try_new_persian_date(-10, 1, 1); + check_continuity(date.unwrap()); + let date = Date::try_new_persian_date(-300, 1, 1); + check_every_250_days(date.unwrap()); +} + +#[test] +fn test_roc_continuity() { + let date = Date::try_new_roc_date(-10, 1, 1); + check_continuity(date.unwrap()); + let date = Date::try_new_roc_date(-300, 1, 1); + check_every_250_days(date.unwrap()); +} diff --git a/components/calendar/src/tests/mod.rs b/components/calendar/src/tests/mod.rs new file mode 100644 index 00000000000..a4330b4af10 --- /dev/null +++ b/components/calendar/src/tests/mod.rs @@ -0,0 +1,5 @@ +// This file is part of ICU4X. For terms of use, please see the file +// called LICENSE at the top level of the ICU4X source tree +// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). + +mod continuity_test; diff --git a/components/datetime/Cargo.toml b/components/datetime/Cargo.toml index a8ca363dc43..d44a1eba61b 100644 --- a/components/datetime/Cargo.toml +++ b/components/datetime/Cargo.toml @@ -88,7 +88,8 @@ datagen = [ "icu_timezone/datagen", "serde", "std", - ] +] +logging = ["icu_calendar/logging"] experimental = ["dep:litemap"] bench = ["serde"] compiled_data = ["dep:icu_datetime_data", "dep:icu_locid_transform", "icu_calendar/compiled_data", "icu_decimal/compiled_data", "icu_plurals/compiled_data", "icu_timezone/compiled_data"] diff --git a/components/icu/Cargo.toml b/components/icu/Cargo.toml index 655bbddd77e..2d004033ca7 100644 --- a/components/icu/Cargo.toml +++ b/components/icu/Cargo.toml @@ -125,7 +125,7 @@ experimental = [ "dep:icu_experimental", ] sync = ["icu_provider/sync"] -logging = ["icu_provider/logging"] +logging = ["icu_provider/logging", "icu_datetime/logging"] [package.metadata.cargo-all-features] # Components are tested individually, and there's no logic in this crate diff --git a/provider/baked/calendar/data/macros/calendar_chinesecache_v1.rs.data b/provider/baked/calendar/data/macros/calendar_chinesecache_v1.rs.data index 72a2922a433..3c3126bf161 100644 --- a/provider/baked/calendar/data/macros/calendar_chinesecache_v1.rs.data +++ b/provider/baked/calendar/data/macros/calendar_chinesecache_v1.rs.data @@ -11,7 +11,7 @@ macro_rules! __impl_calendar_chinesecache_v1 { #[clippy::msrv = "1.67"] impl $provider { #[doc(hidden)] - pub const SINGLETON_CALENDAR_CHINESECACHE_V1: &'static ::Yokeable = &icu::calendar::provider::chinese_based::ChineseBasedCacheV1 { first_extended_year: 4537i32, data: unsafe { zerovec::ZeroVec::from_bytes_unchecked(b"\xD26\x17R\x07<\xA5\x0E&J\xD6\x12K\x066\x9B\n\x1EZ\xB5\nj\x050Y\x0B\x1ARw\x04R\x07*%\xFB\x14%\x0B:K\n\"\xAB\xD4\x0C\xAD\x022k\x05\x1Cik\x06\xA9\r,\x92\x1D\x19\x92\x0E>%\r&M\xDA\x10V\n6\xB6\x02 \xB5\xB5\x08\xD4\x060\xA9\x0E\x1A\x92~\x06\x92\x0E*&\xED\x14+\x058W\n\"\xB6\xD2\x0CZ\x0B2\xD4\x06\x1E\xC9\x8E\x08I\x07,\x93\x16\x17\x93\n<+\x05&[\xEA\x0E\xAD\n4j\x05 U\xBB\n\xA4\x0B0I\x0B\x1A\x93z\x04\x95\n*-\x15\x136\x058\xAD\n\"\xAA\xD5\x0E\xB2\x052\xA5\r\x1CJ\x9D\x08J\r.\x95*\x17\x97\n:V\x05&\xB5\xEA\x10\xD5\n4\xD2\x06 \xA5\xAE\n\xA5\x0E0J\x06\x1A\x97\x8C\x02\x9B\n(Z\x15\x15j\x058i\x0B\"R\xD7\x0ER\x0B4%\x0B\x1CK\xB6\x06K\n,\xAB4\x17\xAD\x02:m\x05$i\xEB\x10\xA9\r6\x92\r %\xBD\n%\r0Mz\x1BV\n>\xB6\x02(\xB5\xE5\x12\xD5\x068\xA9\x0E\"\x92\xDE\x0E\x92\x0E4&\r\x1EV\x8A\x06W\n*\xD64\x17Z\x03<\xD5\x06$\xC9\xD6\x10I\x076\x93\x06 +\xB5\x08+\x05.[\n\x18Zu\x04j\x05(U\x1B\x13\xA4\x0B:I\x0B$\x93\xDA\x0C\x95\n2-\x05\x1C\xAD\xAA\x06\xB5\n*\xAAU\x17\xD2\x05<\xA5\r&J\xFD\x10J\r6\x95\x0C .\xB5\nV\x05.\xB5\n\x18\xB2u\x04\xD2\x06*\xA5\xEE\x12%\x078K\x06\"\x97\xCC\x0C\xAB\x0C0Z\x05\x1C\xD6\x8A\x06i\x0B,R\x97\x17R\x0B<%\x0B&K\xFA\x10K\n4\xAB\x04\x1E[\xC5\x08\xAD\x05.j\x0B\x18R{\x04\x92\r*%\x1D\x15%\r8U\n\"\xAD\xD4\x0C\xB6\x042\xB5\x05\x1A\xAA\x8D\x06\xC9\x0E,\x92>\x19\x92\x0E<&\r&V\xEA\x10W\n4V\x05\x1E\xD5\xA6\x08U\x07.I\x07\x1A\x93\x8E\x02\x93\x06(+\x15\x13+\x058[\n Z\xD5\x0Cj\x052e\x0B\x1CJ\xB7\x06J\x0B,\x95:\x17\x95\n<-\x05$\xAD\xEA\x0E\xB5\n4\xAA\x05 \xA5\xAB\x08\xA5\r.J\r\x1A\x95\x9C\x04\x96\x0C(N\x19\x13V\x058\xB5\n\"\xB2\xD5\x0C\xD2\x062\xA5\x0E\x1CJ\xAE\x08\x8B\x06*\x97,\x15\xAB\x04:[\x05$\xD6\xEA\x0Ej\x0B4R\x07 %\xB7\nE\x0B.\x8B\n\x18\x9Bt\x02\xAB\x04([\t\x13\xAD\x058\xAA\x0B$R\xDB\x10\x92\r4%\r\x1EK\xBA\x08U\n.\xADT\x17\xB6\x04<\xB5\x06&\xAA\xED\x12\xC9\x0E6\x92\x0E\"&\xBD\x0C*\r2V\n\x1A\xB6\x94\x04V\x05*\xD5\n\x15U\x0B8J\x07$\x93\xCE\x0E\x95\x064+\x05\x1CW\xAA\x06\x9B\n,Z\x95\x19j\x05\xA5\x0E&") } }; + pub const SINGLETON_CALENDAR_CHINESECACHE_V1: &'static ::Yokeable = &icu::calendar::provider::chinese_based::ChineseBasedCacheV1 { first_extended_year: 4537i32, data: unsafe { zerovec::ZeroVec::from_bytes_unchecked(b"\xD26\x19R\x07>\xA5\x0E(J\xD6\x14K\x068\x9B\n Z\xB5\x0Cj\x052Y\x0B\x1CRw\x06R\x07,%\xFB\x16%\x0B+\x05([\xEA\x10\xAD\n6j\x05\"U\xBB\x0C\xA4\x0B2I\x0B\x1C\x93z\x06\x95\n,-\x15\x156\x05:\xAD\n$\xAA\xD5\x10\xB2\x054\xA5\r\x1EJ\x9D\nJ\r0\x95*\x19\x97\n\xD5\x06&\xC9\xD6\x12I\x078\x93\x06\"+\xB5\n+\x050[\n\x1AZu\x06j\x05*U\x1B\x15\xA4\x0B\xA5\r(J\xFD\x12J\r8\x95\x0C\".\xB5\x0CV\x050\xB5\n\x1A\xB2u\x06\xD2\x06,\xA5\xEE\x14%\x07:K\x06$\x97\xCC\x0E\xAB\x0C2Z\x05\x1E\xD6\x8A\x08i\x0B.R\x97\x19R\x0B>%\x0B(K\xFA\x12K\n6\xAB\x04 [\xC5\n\xAD\x050j\x0B\x1AR{\x06\x92\r,%\x1D\x17%\r:U\n$\xAD\xD4\x0E\xB6\x044\xB5\x05\x1C\xAA\x8D\x08\xC9\x0E.\x92>\x1B\x92\x0E>&\r(V\xEA\x12W\n6V\x05 \xD5\xA6\nU\x070I\x07\x1C\x93\x8E\x04\x93\x06*+\x15\x15+\x05:[\n\"Z\xD5\x0Ej\x054e\x0B\x1EJ\xB7\x08J\x0B.\x95:\x19\x95\n>-\x05&\xAD\xEA\x10\xB5\n6\xAA\x05\"\xA5\xAB\n\xA5\r0J\r\x1C\x95\x9C\x06\x96\x0C*N\x19\x15V\x05:\xB5\n$\xB2\xD5\x0E\xD2\x064\xA5\x0E\x1EJ\xAE\n\x8B\x06,\x97,\x17\xAB\x04<[\x05&\xD6\xEA\x10j\x0B6R\x07\"%\xB7\x0CE\x0B0\x8B\n\x1A\x9Bt\x04\xAB\x04*[\t\x15\xAD\x05:\xAA\x0B&R\xDB\x12\x92\r6%\r K\xBA\nU\n0\xADT\x19\xB6\x04>\xB5\x06(\xAA\xED\x14\xC9\x0E8\x92\x0E$&\xBD\x0E*\r4V\n\x1C\xB6\x94\x06V\x05,\xD5\n\x17U\x0B:J\x07&\x93\xCE\x10\x95\x066+\x05\x1EW\xAA\x08\x9B\n.Z\x95\x1Bj\x05>e\x0B(J\xF7\x14J\x0B:\x15\x0B\"+\xD5\x0CM\x052\xAD\n\x1Cju\x06\xAA\x05,\xA5\x0B\x17\xA5\r for $provider { diff --git a/provider/baked/calendar/data/macros/calendar_dangicache_v1.rs.data b/provider/baked/calendar/data/macros/calendar_dangicache_v1.rs.data index 1dff408a3cf..759675ffba8 100644 --- a/provider/baked/calendar/data/macros/calendar_dangicache_v1.rs.data +++ b/provider/baked/calendar/data/macros/calendar_dangicache_v1.rs.data @@ -11,7 +11,7 @@ macro_rules! __impl_calendar_dangicache_v1 { #[clippy::msrv = "1.67"] impl $provider { #[doc(hidden)] - pub const SINGLETON_CALENDAR_DANGICACHE_V1: &'static ::Yokeable = &icu::calendar::provider::chinese_based::ChineseBasedCacheV1 { first_extended_year: 4233i32, data: unsafe { zerovec::ZeroVec::from_bytes_unchecked(b"\xD26\x17R\x07<\xA5\x0E&J\xCE\x12K\x056\x97\n\x1EV\xB5\nj\x050U\x0B\x1ARw\x04R\x07*%\xF7\x14%\x0B:K\n\"\x9B\xD2\x0C\xAD\n2j\x05\x1Eik\x06\xA9\x0B,R\x1B\x19\x92\r>%\r&M\xDA\x10V\t6\xB5\x02 \xAD\xB5\x08\xD4\x060\xA9\r\x1A\x92}\x06\x92\x0E*&\xED\x14'\x058W\n\"\xB6\xD2\x0C\xDA\n2\xD4\x06\x1E\xA9\x8E\x08I\x07,\x93\x16\x17\x93\n<+\x05&[\xEA\x0Em\t4j\x0B T\xBB\x0C\xA4\x0B0I\x0B\x1A\x93z\x04\x95\n*+\x15\x13-\x058\xAD\n\"j\xD5\x0E\xB2\r2\xA4\r\x1EI\x9D\x08J\r.\x95:\x17\x96\n\xB6\x02(\xAD\xF5\x12\xD4\x06:\xA9\r\"\x92\xDD\x0E\x92\x0E4&\r\x1EV\x8A\x06W\n*\xB62\x17Z\x0B<\xD4\x06&\xC9\xCE\x10I\x076\x93\x06 '\xB5\x08+\x05.[\n\x18Zu\x04j\x03(U\x1B\x13\xA4\x0B:I\x0B$\x93\xDA\x0C\x95\n2-\x05\x1C]\x8A\x06\xAD\n*\xAAU\x17\xD2\x05<\xA5\r&J\xDD\x10J\r6\x95\n -\xB5\nV\x05.\xB5\n\x18\xAAu\x04\xD2\x06*\xA5\xEE\x12\xA5\x0E8J\x0E$\x96\xCC\x0E\x9B\x0C0Z\x05\x1C\xD5\x8A\x06i\x0B,R\x97\x17R\x07<%\x0B&K\xF6\x10K\n4\xAB\x04\x1E[\xC5\x08m\x05.i\x0B\x18R{\x04\x92\r*%\x1D\x15%\r8M\n\"\xAD\xD4\x0C\xB6\x022\xB5\x05\x1A\xA9\x8D\x06\xA9\x0E,\x92=\x19\x92\x0E<&\r&V\xEA\x10W\n4\xD6\x04\x1E\xB5\xA6\x08\xD5\x06.\xC9\x0E\x1A\x92\x8E\x04\x93\x06(+\x15\x13+\x058[\n Z\xD5\x0Cj\x052U\x0B\x1CI\xB7\x06I\x0B,\x93:\x17\x95\n<-\x05$\xAD\xEA\x0E\xB5\n4\xAA\x05 \xA5\xAB\x08\xA5\r.J\r\x1A\x95\x9A\x04\x95\x0C(.\x15\x13V\x058\xB5\n\"\xB2\xD5\x0C\xD2\x062\xA5\x0E\x1CJ\xBE\x08J\x06,\x97,\x15\xAB\x0C:Z\x05&\xD5\xEA\x0Ei\x0B4R\x07 \xA5\xB6\n%\x0B.K\x06\x18\x97\x94\x02\xAB\x04([\x05\x13\xAD\x058i\x0B$R\xDB\x10\x92\r4%\r\x1EK\xBA\x08U\n.\xADT\x17\xB6\x04<\xB5\x05&\xAA\xED\x12\xC9\x0E6\x92\x0E\"%\xBD\x0C&\r2V\n\x1A\xAE\x94\x04\xD6\x04*\xD5\n\x15\xD5\x068\xC9\x06$\x93\xCE\x0E\x93\x064+\x05\x1CW\xAA\x06[\n,ZU\x19j\x05\xA5\x0E&") } }; + pub const SINGLETON_CALENDAR_DANGICACHE_V1: &'static ::Yokeable = &icu::calendar::provider::chinese_based::ChineseBasedCacheV1 { first_extended_year: 4233i32, data: unsafe { zerovec::ZeroVec::from_bytes_unchecked(b"\xD26\x19R\x07>\xA5\x0E(J\xCE\x14K\x058\x97\n V\xB5\x0Cj\x052U\x0B\x1CRw\x06R\x07,%\xF7\x16%\x0B+\x05([\xEA\x10m\t6j\x0B\"T\xBB\x0E\xA4\x0B2I\x0B\x1C\x93z\x06\x95\n,+\x15\x15-\x05:\xAD\n$j\xD5\x10\xB2\r4\xA4\r I\x9D\nJ\r0\x95:\x19\x96\n>V\x05(\xB5\xEA\x12\xD5\n6\xD2\x06\"\xA5\xAE\x0C\xA5\x0E2J\x0E\x1C\x96\x8C\x06\x9B\n*V\x15\x17j\x05:Y\x0B$R\xD7\x10R\x076%\x07\x1EK\xB6\x08K\n.\xAB2\x19\xAD\x02\xD4\x06(\xC9\xCE\x12I\x078\x93\x06\"'\xB5\n+\x050[\n\x1AZu\x06j\x03*U\x1B\x15\xA4\x0B\xA5\r(J\xDD\x12J\r8\x95\n\"-\xB5\x0CV\x050\xB5\n\x1A\xAAu\x06\xD2\x06,\xA5\xEE\x14\xA5\x0E:J\x0E&\x96\xCC\x10\x9B\x0C2Z\x05\x1E\xD5\x8A\x08i\x0B.R\x97\x19R\x07>%\x0B(K\xF6\x12K\n6\xAB\x04 [\xC5\nm\x050i\x0B\x1AR{\x06\x92\r,%\x1D\x17%\r:M\n$\xAD\xD4\x0E\xB6\x024\xB5\x05\x1C\xA9\x8D\x08\xA9\x0E.\x92=\x1B\x92\x0E>&\r(V\xEA\x12W\n6\xD6\x04 \xB5\xA6\n\xD5\x060\xC9\x0E\x1C\x92\x8E\x06\x93\x06*+\x15\x15+\x05:[\n\"Z\xD5\x0Ej\x054U\x0B\x1EI\xB7\x08I\x0B.\x93:\x19\x95\n>-\x05&\xAD\xEA\x10\xB5\n6\xAA\x05\"\xA5\xAB\n\xA5\r0J\r\x1C\x95\x9A\x06\x95\x0C*.\x15\x15V\x05:\xB5\n$\xB2\xD5\x0E\xD2\x064\xA5\x0E\x1EJ\xBE\nJ\x06.\x97,\x17\xAB\x0C\xB5\x05(\xAA\xED\x14\xC9\x0E8\x92\x0E$%\xBD\x0E&\r4V\n\x1C\xAE\x94\x06\xD6\x04,\xD5\n\x17\xD5\x06:\xC9\x06&\x93\xCE\x10\x93\x066+\x05\x1EW\xAA\x08[\n.ZU\x1Bj\x05>e\x0B(J\xF7\x14I\x0B:\x95\n\"+\xD5\x0C-\x052\xAD\n\x1Cju\x06\xAA\x05,\xA5\x0B\x17\xA5\r for $provider { diff --git a/provider/baked/calendar/data/macros/calendar_islamicobservationalcache_v1.rs.data b/provider/baked/calendar/data/macros/calendar_islamicobservationalcache_v1.rs.data index 3b40463a0cd..a0d71539b16 100644 --- a/provider/baked/calendar/data/macros/calendar_islamicobservationalcache_v1.rs.data +++ b/provider/baked/calendar/data/macros/calendar_islamicobservationalcache_v1.rs.data @@ -11,7 +11,7 @@ macro_rules! __impl_calendar_islamicobservationalcache_v1 { #[clippy::msrv = "1.67"] impl $provider { #[doc(hidden)] - pub const SINGLETON_CALENDAR_ISLAMICOBSERVATIONALCACHE_V1: &'static ::Yokeable = &icu::calendar::provider::islamic::IslamicCacheV1 { first_extended_year: 1317i32, data: unsafe { zerovec::ZeroVec::from_bytes_unchecked(b"/9\xAE\x02\xAD\x05\xAA\r\x92-%-\x8D\n-\x05m\x05j\x0BT'I\x0F\x92.&+V\x05\xAE\n\xAC#i\x07T/\xA4.L-\x9C*\\\x05\xBA\x06\xB4%\xA9\rT-\xAA*6\tv\x02u5\xDA\n\xB4&\x99\x06+\x05;\n\x9E\x04^\n\\\x05Y\x0B*+U\n+\n[\x02;5\xD9\n\xD2&\xA5\x0EJ.\x96\x0C-\x05m\nj\rX'I/\x92.)-U*\xB5\x0C\xB4%\xB1\r\xA4+I+\x95\n\xB5\x04m\t\xEC\x02\xE9\x06\xD2\x0Ed-\xAA,V\tv\x04\xF5\x04\xEA\n\xD4*i*S\tk\x04\xBB8v\x02u\t\xAA\x05S\r&-N\n\xAE\x04m\t\xEA\x02\xD5\n\xA5\x06K\x06\xA5\x0C+\t\xAB\x02k\x05\xA5\x0BQ+\xA3\nG\x05\xA7\x02W5\xE6\n\xD4%\xC9\r\x92-\xA5*U\x05\xAD\x01\xEB2\xE9\t\xD2%\xA5\x05\xCB\x02W\t\xB6\x02v\t\xF4\x02i\x0BJ+\x96\n.\x05^\x02\xDD4\xDA\n\xD4%\xA5\x05K\x05\x8F:\xAE\x04^\tZ\x03M\x0B&'\x8B\x06\x17\x05O\n\xAE\x04\xAD\x06\xAA\r\x94-I-\x95\n-\x05\xAD\nj\x03U\x07J\x0F\x94+&+V\x05\xAE\nt#j\x07T')/T-\xAC*\\\x05\xBA\x02\xB9\x05\xB2\rT-*+V\t\xAE\x02]\x05\xBA\n\xB4&\x99\x06+\x06[\x0C\x1E\t^\x02]\x05Y\r2-\x15\r+\n\x9B\x04[9\xDA\n\xD4&\xA9\x0EJ.\x95,-\x05\xAD\nj\rh'Q/\xA2.I-U*\xD5\x04\xB5\t\xB2\r\xA8+Q+\xA5\nU\x05m\n\xEC\x04\xE9\x06\xD2-d-\xAA,V\nv\x04\xF5\x08\xEA\x02\xE5\n\xAA*U\t\xAB\x04W\x01\xB74\xB5\t\xAA\x05\xA5\r*-V\n\xAE\x08k\t\xEA\x04\xD3\n\xA5\x06S\x0E#-K\n\xAB\x02\xAB\x05\xA5\x0B\xA2'E'\x8B\x06\xAB\x04k9\xEA\x02\xD5\x05\xC9\r\xA2-\xC5*U\t\xAD\x01\xED\x02\xEA\t\xD4#\xA9\x03K\x03") } }; + pub const SINGLETON_CALENDAR_ISLAMICOBSERVATIONALCACHE_V1: &'static ::Yokeable = &icu::calendar::provider::islamic::IslamicCacheV1 { first_extended_year: 1317i32, data: unsafe { zerovec::ZeroVec::from_bytes_unchecked(b"/9\xAE\x02\xAD\x05\xAA\r\x92-%-\x8D\n-\x05m\x05j\x0BT'I\x0F\x92.&+V\x05\xAE\n\xAC#i\x07T/\xA4.L-\x9C*\\\x05\xBA\x06\xB4%\xA9\rT-\xAA*6\tv\x02u5\xDA\n\xB4&\x99\x06+\x05;\n\x9E\x04^\n\\\x05Y\x0B*+U\n+\n[\x02;5\xD9\n\xD2&\xA5\x0EJ.\x96\x0C-\x05m\nj\rX'I/\x92.)-U*\xB5\x0C\xB4%\xB1\r\xA4+I+\x95\n\xB5\x04m\t\xEC\x02\xE9\x06\xD2\x0Ed-\xAA,V\tv\x04\xF5\x04\xEA\n\xD4*i*S\tk\x04\xBB8v\x02u\t\xAA\x05S\r&-N\n\xAE\x04m\t\xEA\x02\xD5\n\xA5\x06K\x06\xA7\x0C+\t\xAB\x02k\x05\xA5\x0BQ+\xA3\nG\x05\xA7\x02W5\xE6\n\xD4%\xC9\r\x92-\xA5*U\x05\xAD\x01\xEB2\xE9\t\xD2%\xA5\x05\xCB\x02W\t\xB6\x02v\t\xF4\x02i\x0BJ+\x96\n.\x05^\x02\xDD4\xDA\n\xD4%\xA5\x05K\x05\x8F:\xAE\x04^\tZ\x03M\x0B&'\x8B\x06\x17\x05O\n\xAE\x04\xAD\x06\xAA\r\x94-I-\x95\n-\x05\xAD\nj\x03U\x07J\x0F\x94+&+V\x05\xAE\nt#j\x07T')/T-\xAC*\\\x05\xBA\x02\xB9\x05\xB2\rT-*+V\t\xAE\x02]\x05\xBA\n\xB4&\x99\x06+\x06[\x0C\x1E\t^\x02]\x05Y\r2-\x15\r+\n\x9B\x04[9\xDA\n\xD4&\xA9\x0EJ.\x95,-\x05\xAD\nj\rh'Q/\xA2.I-U*\xD5\x04\xB5\t\xB2\r\xA8+Q+\xA5\nU\x05m\n\xEC\x04\xE9\x06\xD2-d-\xAA,V\nv\x04\xF5\x08\xEA\x02\xE5\n\xAA*U\t\xAB\x04W\x01\xB74\xB5\t\xAA\x05\xA5\r*-V\n\xAE\x08k\t\xEA\x04\xD3\n\xA5\x06S\x0E#-K\n\xAB\x02\xAB\x05\xA5\x0B\xA2'E'\x8B\x06\xAB\x04k9\xEA\x02\xD5\x05\xC9\r\xA2-\xC5*U\t\xAD\x01\xED\x02\xEA\t\xD4#\xA9\x03K\x03") } }; } #[clippy::msrv = "1.67"] impl icu_provider::DataProvider for $provider { diff --git a/provider/datagen/tests/data/baked/macros/calendar_chinesecache_v1.rs.data b/provider/datagen/tests/data/baked/macros/calendar_chinesecache_v1.rs.data index 72a2922a433..3c3126bf161 100644 --- a/provider/datagen/tests/data/baked/macros/calendar_chinesecache_v1.rs.data +++ b/provider/datagen/tests/data/baked/macros/calendar_chinesecache_v1.rs.data @@ -11,7 +11,7 @@ macro_rules! __impl_calendar_chinesecache_v1 { #[clippy::msrv = "1.67"] impl $provider { #[doc(hidden)] - pub const SINGLETON_CALENDAR_CHINESECACHE_V1: &'static ::Yokeable = &icu::calendar::provider::chinese_based::ChineseBasedCacheV1 { first_extended_year: 4537i32, data: unsafe { zerovec::ZeroVec::from_bytes_unchecked(b"\xD26\x17R\x07<\xA5\x0E&J\xD6\x12K\x066\x9B\n\x1EZ\xB5\nj\x050Y\x0B\x1ARw\x04R\x07*%\xFB\x14%\x0B:K\n\"\xAB\xD4\x0C\xAD\x022k\x05\x1Cik\x06\xA9\r,\x92\x1D\x19\x92\x0E>%\r&M\xDA\x10V\n6\xB6\x02 \xB5\xB5\x08\xD4\x060\xA9\x0E\x1A\x92~\x06\x92\x0E*&\xED\x14+\x058W\n\"\xB6\xD2\x0CZ\x0B2\xD4\x06\x1E\xC9\x8E\x08I\x07,\x93\x16\x17\x93\n<+\x05&[\xEA\x0E\xAD\n4j\x05 U\xBB\n\xA4\x0B0I\x0B\x1A\x93z\x04\x95\n*-\x15\x136\x058\xAD\n\"\xAA\xD5\x0E\xB2\x052\xA5\r\x1CJ\x9D\x08J\r.\x95*\x17\x97\n:V\x05&\xB5\xEA\x10\xD5\n4\xD2\x06 \xA5\xAE\n\xA5\x0E0J\x06\x1A\x97\x8C\x02\x9B\n(Z\x15\x15j\x058i\x0B\"R\xD7\x0ER\x0B4%\x0B\x1CK\xB6\x06K\n,\xAB4\x17\xAD\x02:m\x05$i\xEB\x10\xA9\r6\x92\r %\xBD\n%\r0Mz\x1BV\n>\xB6\x02(\xB5\xE5\x12\xD5\x068\xA9\x0E\"\x92\xDE\x0E\x92\x0E4&\r\x1EV\x8A\x06W\n*\xD64\x17Z\x03<\xD5\x06$\xC9\xD6\x10I\x076\x93\x06 +\xB5\x08+\x05.[\n\x18Zu\x04j\x05(U\x1B\x13\xA4\x0B:I\x0B$\x93\xDA\x0C\x95\n2-\x05\x1C\xAD\xAA\x06\xB5\n*\xAAU\x17\xD2\x05<\xA5\r&J\xFD\x10J\r6\x95\x0C .\xB5\nV\x05.\xB5\n\x18\xB2u\x04\xD2\x06*\xA5\xEE\x12%\x078K\x06\"\x97\xCC\x0C\xAB\x0C0Z\x05\x1C\xD6\x8A\x06i\x0B,R\x97\x17R\x0B<%\x0B&K\xFA\x10K\n4\xAB\x04\x1E[\xC5\x08\xAD\x05.j\x0B\x18R{\x04\x92\r*%\x1D\x15%\r8U\n\"\xAD\xD4\x0C\xB6\x042\xB5\x05\x1A\xAA\x8D\x06\xC9\x0E,\x92>\x19\x92\x0E<&\r&V\xEA\x10W\n4V\x05\x1E\xD5\xA6\x08U\x07.I\x07\x1A\x93\x8E\x02\x93\x06(+\x15\x13+\x058[\n Z\xD5\x0Cj\x052e\x0B\x1CJ\xB7\x06J\x0B,\x95:\x17\x95\n<-\x05$\xAD\xEA\x0E\xB5\n4\xAA\x05 \xA5\xAB\x08\xA5\r.J\r\x1A\x95\x9C\x04\x96\x0C(N\x19\x13V\x058\xB5\n\"\xB2\xD5\x0C\xD2\x062\xA5\x0E\x1CJ\xAE\x08\x8B\x06*\x97,\x15\xAB\x04:[\x05$\xD6\xEA\x0Ej\x0B4R\x07 %\xB7\nE\x0B.\x8B\n\x18\x9Bt\x02\xAB\x04([\t\x13\xAD\x058\xAA\x0B$R\xDB\x10\x92\r4%\r\x1EK\xBA\x08U\n.\xADT\x17\xB6\x04<\xB5\x06&\xAA\xED\x12\xC9\x0E6\x92\x0E\"&\xBD\x0C*\r2V\n\x1A\xB6\x94\x04V\x05*\xD5\n\x15U\x0B8J\x07$\x93\xCE\x0E\x95\x064+\x05\x1CW\xAA\x06\x9B\n,Z\x95\x19j\x05\xA5\x0E&") } }; + pub const SINGLETON_CALENDAR_CHINESECACHE_V1: &'static ::Yokeable = &icu::calendar::provider::chinese_based::ChineseBasedCacheV1 { first_extended_year: 4537i32, data: unsafe { zerovec::ZeroVec::from_bytes_unchecked(b"\xD26\x19R\x07>\xA5\x0E(J\xD6\x14K\x068\x9B\n Z\xB5\x0Cj\x052Y\x0B\x1CRw\x06R\x07,%\xFB\x16%\x0B+\x05([\xEA\x10\xAD\n6j\x05\"U\xBB\x0C\xA4\x0B2I\x0B\x1C\x93z\x06\x95\n,-\x15\x156\x05:\xAD\n$\xAA\xD5\x10\xB2\x054\xA5\r\x1EJ\x9D\nJ\r0\x95*\x19\x97\n\xD5\x06&\xC9\xD6\x12I\x078\x93\x06\"+\xB5\n+\x050[\n\x1AZu\x06j\x05*U\x1B\x15\xA4\x0B\xA5\r(J\xFD\x12J\r8\x95\x0C\".\xB5\x0CV\x050\xB5\n\x1A\xB2u\x06\xD2\x06,\xA5\xEE\x14%\x07:K\x06$\x97\xCC\x0E\xAB\x0C2Z\x05\x1E\xD6\x8A\x08i\x0B.R\x97\x19R\x0B>%\x0B(K\xFA\x12K\n6\xAB\x04 [\xC5\n\xAD\x050j\x0B\x1AR{\x06\x92\r,%\x1D\x17%\r:U\n$\xAD\xD4\x0E\xB6\x044\xB5\x05\x1C\xAA\x8D\x08\xC9\x0E.\x92>\x1B\x92\x0E>&\r(V\xEA\x12W\n6V\x05 \xD5\xA6\nU\x070I\x07\x1C\x93\x8E\x04\x93\x06*+\x15\x15+\x05:[\n\"Z\xD5\x0Ej\x054e\x0B\x1EJ\xB7\x08J\x0B.\x95:\x19\x95\n>-\x05&\xAD\xEA\x10\xB5\n6\xAA\x05\"\xA5\xAB\n\xA5\r0J\r\x1C\x95\x9C\x06\x96\x0C*N\x19\x15V\x05:\xB5\n$\xB2\xD5\x0E\xD2\x064\xA5\x0E\x1EJ\xAE\n\x8B\x06,\x97,\x17\xAB\x04<[\x05&\xD6\xEA\x10j\x0B6R\x07\"%\xB7\x0CE\x0B0\x8B\n\x1A\x9Bt\x04\xAB\x04*[\t\x15\xAD\x05:\xAA\x0B&R\xDB\x12\x92\r6%\r K\xBA\nU\n0\xADT\x19\xB6\x04>\xB5\x06(\xAA\xED\x14\xC9\x0E8\x92\x0E$&\xBD\x0E*\r4V\n\x1C\xB6\x94\x06V\x05,\xD5\n\x17U\x0B:J\x07&\x93\xCE\x10\x95\x066+\x05\x1EW\xAA\x08\x9B\n.Z\x95\x1Bj\x05>e\x0B(J\xF7\x14J\x0B:\x15\x0B\"+\xD5\x0CM\x052\xAD\n\x1Cju\x06\xAA\x05,\xA5\x0B\x17\xA5\r for $provider { diff --git a/provider/datagen/tests/data/baked/macros/calendar_dangicache_v1.rs.data b/provider/datagen/tests/data/baked/macros/calendar_dangicache_v1.rs.data index 1dff408a3cf..759675ffba8 100644 --- a/provider/datagen/tests/data/baked/macros/calendar_dangicache_v1.rs.data +++ b/provider/datagen/tests/data/baked/macros/calendar_dangicache_v1.rs.data @@ -11,7 +11,7 @@ macro_rules! __impl_calendar_dangicache_v1 { #[clippy::msrv = "1.67"] impl $provider { #[doc(hidden)] - pub const SINGLETON_CALENDAR_DANGICACHE_V1: &'static ::Yokeable = &icu::calendar::provider::chinese_based::ChineseBasedCacheV1 { first_extended_year: 4233i32, data: unsafe { zerovec::ZeroVec::from_bytes_unchecked(b"\xD26\x17R\x07<\xA5\x0E&J\xCE\x12K\x056\x97\n\x1EV\xB5\nj\x050U\x0B\x1ARw\x04R\x07*%\xF7\x14%\x0B:K\n\"\x9B\xD2\x0C\xAD\n2j\x05\x1Eik\x06\xA9\x0B,R\x1B\x19\x92\r>%\r&M\xDA\x10V\t6\xB5\x02 \xAD\xB5\x08\xD4\x060\xA9\r\x1A\x92}\x06\x92\x0E*&\xED\x14'\x058W\n\"\xB6\xD2\x0C\xDA\n2\xD4\x06\x1E\xA9\x8E\x08I\x07,\x93\x16\x17\x93\n<+\x05&[\xEA\x0Em\t4j\x0B T\xBB\x0C\xA4\x0B0I\x0B\x1A\x93z\x04\x95\n*+\x15\x13-\x058\xAD\n\"j\xD5\x0E\xB2\r2\xA4\r\x1EI\x9D\x08J\r.\x95:\x17\x96\n\xB6\x02(\xAD\xF5\x12\xD4\x06:\xA9\r\"\x92\xDD\x0E\x92\x0E4&\r\x1EV\x8A\x06W\n*\xB62\x17Z\x0B<\xD4\x06&\xC9\xCE\x10I\x076\x93\x06 '\xB5\x08+\x05.[\n\x18Zu\x04j\x03(U\x1B\x13\xA4\x0B:I\x0B$\x93\xDA\x0C\x95\n2-\x05\x1C]\x8A\x06\xAD\n*\xAAU\x17\xD2\x05<\xA5\r&J\xDD\x10J\r6\x95\n -\xB5\nV\x05.\xB5\n\x18\xAAu\x04\xD2\x06*\xA5\xEE\x12\xA5\x0E8J\x0E$\x96\xCC\x0E\x9B\x0C0Z\x05\x1C\xD5\x8A\x06i\x0B,R\x97\x17R\x07<%\x0B&K\xF6\x10K\n4\xAB\x04\x1E[\xC5\x08m\x05.i\x0B\x18R{\x04\x92\r*%\x1D\x15%\r8M\n\"\xAD\xD4\x0C\xB6\x022\xB5\x05\x1A\xA9\x8D\x06\xA9\x0E,\x92=\x19\x92\x0E<&\r&V\xEA\x10W\n4\xD6\x04\x1E\xB5\xA6\x08\xD5\x06.\xC9\x0E\x1A\x92\x8E\x04\x93\x06(+\x15\x13+\x058[\n Z\xD5\x0Cj\x052U\x0B\x1CI\xB7\x06I\x0B,\x93:\x17\x95\n<-\x05$\xAD\xEA\x0E\xB5\n4\xAA\x05 \xA5\xAB\x08\xA5\r.J\r\x1A\x95\x9A\x04\x95\x0C(.\x15\x13V\x058\xB5\n\"\xB2\xD5\x0C\xD2\x062\xA5\x0E\x1CJ\xBE\x08J\x06,\x97,\x15\xAB\x0C:Z\x05&\xD5\xEA\x0Ei\x0B4R\x07 \xA5\xB6\n%\x0B.K\x06\x18\x97\x94\x02\xAB\x04([\x05\x13\xAD\x058i\x0B$R\xDB\x10\x92\r4%\r\x1EK\xBA\x08U\n.\xADT\x17\xB6\x04<\xB5\x05&\xAA\xED\x12\xC9\x0E6\x92\x0E\"%\xBD\x0C&\r2V\n\x1A\xAE\x94\x04\xD6\x04*\xD5\n\x15\xD5\x068\xC9\x06$\x93\xCE\x0E\x93\x064+\x05\x1CW\xAA\x06[\n,ZU\x19j\x05\xA5\x0E&") } }; + pub const SINGLETON_CALENDAR_DANGICACHE_V1: &'static ::Yokeable = &icu::calendar::provider::chinese_based::ChineseBasedCacheV1 { first_extended_year: 4233i32, data: unsafe { zerovec::ZeroVec::from_bytes_unchecked(b"\xD26\x19R\x07>\xA5\x0E(J\xCE\x14K\x058\x97\n V\xB5\x0Cj\x052U\x0B\x1CRw\x06R\x07,%\xF7\x16%\x0B+\x05([\xEA\x10m\t6j\x0B\"T\xBB\x0E\xA4\x0B2I\x0B\x1C\x93z\x06\x95\n,+\x15\x15-\x05:\xAD\n$j\xD5\x10\xB2\r4\xA4\r I\x9D\nJ\r0\x95:\x19\x96\n>V\x05(\xB5\xEA\x12\xD5\n6\xD2\x06\"\xA5\xAE\x0C\xA5\x0E2J\x0E\x1C\x96\x8C\x06\x9B\n*V\x15\x17j\x05:Y\x0B$R\xD7\x10R\x076%\x07\x1EK\xB6\x08K\n.\xAB2\x19\xAD\x02\xD4\x06(\xC9\xCE\x12I\x078\x93\x06\"'\xB5\n+\x050[\n\x1AZu\x06j\x03*U\x1B\x15\xA4\x0B\xA5\r(J\xDD\x12J\r8\x95\n\"-\xB5\x0CV\x050\xB5\n\x1A\xAAu\x06\xD2\x06,\xA5\xEE\x14\xA5\x0E:J\x0E&\x96\xCC\x10\x9B\x0C2Z\x05\x1E\xD5\x8A\x08i\x0B.R\x97\x19R\x07>%\x0B(K\xF6\x12K\n6\xAB\x04 [\xC5\nm\x050i\x0B\x1AR{\x06\x92\r,%\x1D\x17%\r:M\n$\xAD\xD4\x0E\xB6\x024\xB5\x05\x1C\xA9\x8D\x08\xA9\x0E.\x92=\x1B\x92\x0E>&\r(V\xEA\x12W\n6\xD6\x04 \xB5\xA6\n\xD5\x060\xC9\x0E\x1C\x92\x8E\x06\x93\x06*+\x15\x15+\x05:[\n\"Z\xD5\x0Ej\x054U\x0B\x1EI\xB7\x08I\x0B.\x93:\x19\x95\n>-\x05&\xAD\xEA\x10\xB5\n6\xAA\x05\"\xA5\xAB\n\xA5\r0J\r\x1C\x95\x9A\x06\x95\x0C*.\x15\x15V\x05:\xB5\n$\xB2\xD5\x0E\xD2\x064\xA5\x0E\x1EJ\xBE\nJ\x06.\x97,\x17\xAB\x0C\xB5\x05(\xAA\xED\x14\xC9\x0E8\x92\x0E$%\xBD\x0E&\r4V\n\x1C\xAE\x94\x06\xD6\x04,\xD5\n\x17\xD5\x06:\xC9\x06&\x93\xCE\x10\x93\x066+\x05\x1EW\xAA\x08[\n.ZU\x1Bj\x05>e\x0B(J\xF7\x14I\x0B:\x95\n\"+\xD5\x0C-\x052\xAD\n\x1Cju\x06\xAA\x05,\xA5\x0B\x17\xA5\r for $provider { diff --git a/provider/datagen/tests/data/baked/macros/calendar_islamicobservationalcache_v1.rs.data b/provider/datagen/tests/data/baked/macros/calendar_islamicobservationalcache_v1.rs.data index 3b40463a0cd..a0d71539b16 100644 --- a/provider/datagen/tests/data/baked/macros/calendar_islamicobservationalcache_v1.rs.data +++ b/provider/datagen/tests/data/baked/macros/calendar_islamicobservationalcache_v1.rs.data @@ -11,7 +11,7 @@ macro_rules! __impl_calendar_islamicobservationalcache_v1 { #[clippy::msrv = "1.67"] impl $provider { #[doc(hidden)] - pub const SINGLETON_CALENDAR_ISLAMICOBSERVATIONALCACHE_V1: &'static ::Yokeable = &icu::calendar::provider::islamic::IslamicCacheV1 { first_extended_year: 1317i32, data: unsafe { zerovec::ZeroVec::from_bytes_unchecked(b"/9\xAE\x02\xAD\x05\xAA\r\x92-%-\x8D\n-\x05m\x05j\x0BT'I\x0F\x92.&+V\x05\xAE\n\xAC#i\x07T/\xA4.L-\x9C*\\\x05\xBA\x06\xB4%\xA9\rT-\xAA*6\tv\x02u5\xDA\n\xB4&\x99\x06+\x05;\n\x9E\x04^\n\\\x05Y\x0B*+U\n+\n[\x02;5\xD9\n\xD2&\xA5\x0EJ.\x96\x0C-\x05m\nj\rX'I/\x92.)-U*\xB5\x0C\xB4%\xB1\r\xA4+I+\x95\n\xB5\x04m\t\xEC\x02\xE9\x06\xD2\x0Ed-\xAA,V\tv\x04\xF5\x04\xEA\n\xD4*i*S\tk\x04\xBB8v\x02u\t\xAA\x05S\r&-N\n\xAE\x04m\t\xEA\x02\xD5\n\xA5\x06K\x06\xA5\x0C+\t\xAB\x02k\x05\xA5\x0BQ+\xA3\nG\x05\xA7\x02W5\xE6\n\xD4%\xC9\r\x92-\xA5*U\x05\xAD\x01\xEB2\xE9\t\xD2%\xA5\x05\xCB\x02W\t\xB6\x02v\t\xF4\x02i\x0BJ+\x96\n.\x05^\x02\xDD4\xDA\n\xD4%\xA5\x05K\x05\x8F:\xAE\x04^\tZ\x03M\x0B&'\x8B\x06\x17\x05O\n\xAE\x04\xAD\x06\xAA\r\x94-I-\x95\n-\x05\xAD\nj\x03U\x07J\x0F\x94+&+V\x05\xAE\nt#j\x07T')/T-\xAC*\\\x05\xBA\x02\xB9\x05\xB2\rT-*+V\t\xAE\x02]\x05\xBA\n\xB4&\x99\x06+\x06[\x0C\x1E\t^\x02]\x05Y\r2-\x15\r+\n\x9B\x04[9\xDA\n\xD4&\xA9\x0EJ.\x95,-\x05\xAD\nj\rh'Q/\xA2.I-U*\xD5\x04\xB5\t\xB2\r\xA8+Q+\xA5\nU\x05m\n\xEC\x04\xE9\x06\xD2-d-\xAA,V\nv\x04\xF5\x08\xEA\x02\xE5\n\xAA*U\t\xAB\x04W\x01\xB74\xB5\t\xAA\x05\xA5\r*-V\n\xAE\x08k\t\xEA\x04\xD3\n\xA5\x06S\x0E#-K\n\xAB\x02\xAB\x05\xA5\x0B\xA2'E'\x8B\x06\xAB\x04k9\xEA\x02\xD5\x05\xC9\r\xA2-\xC5*U\t\xAD\x01\xED\x02\xEA\t\xD4#\xA9\x03K\x03") } }; + pub const SINGLETON_CALENDAR_ISLAMICOBSERVATIONALCACHE_V1: &'static ::Yokeable = &icu::calendar::provider::islamic::IslamicCacheV1 { first_extended_year: 1317i32, data: unsafe { zerovec::ZeroVec::from_bytes_unchecked(b"/9\xAE\x02\xAD\x05\xAA\r\x92-%-\x8D\n-\x05m\x05j\x0BT'I\x0F\x92.&+V\x05\xAE\n\xAC#i\x07T/\xA4.L-\x9C*\\\x05\xBA\x06\xB4%\xA9\rT-\xAA*6\tv\x02u5\xDA\n\xB4&\x99\x06+\x05;\n\x9E\x04^\n\\\x05Y\x0B*+U\n+\n[\x02;5\xD9\n\xD2&\xA5\x0EJ.\x96\x0C-\x05m\nj\rX'I/\x92.)-U*\xB5\x0C\xB4%\xB1\r\xA4+I+\x95\n\xB5\x04m\t\xEC\x02\xE9\x06\xD2\x0Ed-\xAA,V\tv\x04\xF5\x04\xEA\n\xD4*i*S\tk\x04\xBB8v\x02u\t\xAA\x05S\r&-N\n\xAE\x04m\t\xEA\x02\xD5\n\xA5\x06K\x06\xA7\x0C+\t\xAB\x02k\x05\xA5\x0BQ+\xA3\nG\x05\xA7\x02W5\xE6\n\xD4%\xC9\r\x92-\xA5*U\x05\xAD\x01\xEB2\xE9\t\xD2%\xA5\x05\xCB\x02W\t\xB6\x02v\t\xF4\x02i\x0BJ+\x96\n.\x05^\x02\xDD4\xDA\n\xD4%\xA5\x05K\x05\x8F:\xAE\x04^\tZ\x03M\x0B&'\x8B\x06\x17\x05O\n\xAE\x04\xAD\x06\xAA\r\x94-I-\x95\n-\x05\xAD\nj\x03U\x07J\x0F\x94+&+V\x05\xAE\nt#j\x07T')/T-\xAC*\\\x05\xBA\x02\xB9\x05\xB2\rT-*+V\t\xAE\x02]\x05\xBA\n\xB4&\x99\x06+\x06[\x0C\x1E\t^\x02]\x05Y\r2-\x15\r+\n\x9B\x04[9\xDA\n\xD4&\xA9\x0EJ.\x95,-\x05\xAD\nj\rh'Q/\xA2.I-U*\xD5\x04\xB5\t\xB2\r\xA8+Q+\xA5\nU\x05m\n\xEC\x04\xE9\x06\xD2-d-\xAA,V\nv\x04\xF5\x08\xEA\x02\xE5\n\xAA*U\t\xAB\x04W\x01\xB74\xB5\t\xAA\x05\xA5\r*-V\n\xAE\x08k\t\xEA\x04\xD3\n\xA5\x06S\x0E#-K\n\xAB\x02\xAB\x05\xA5\x0B\xA2'E'\x8B\x06\xAB\x04k9\xEA\x02\xD5\x05\xC9\r\xA2-\xC5*U\t\xAD\x01\xED\x02\xEA\t\xD4#\xA9\x03K\x03") } }; } #[clippy::msrv = "1.67"] impl icu_provider::DataProvider for $provider { diff --git a/provider/datagen/tests/data/json/calendar/chinesecache@1/und.json b/provider/datagen/tests/data/json/calendar/chinesecache@1/und.json index a6bd0e2cfae..88feedc9188 100644 --- a/provider/datagen/tests/data/json/calendar/chinesecache@1/und.json +++ b/provider/datagen/tests/data/json/calendar/chinesecache@1/und.json @@ -2,7 +2,7 @@ "first_extended_year": 4537, "data": [ { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ false, true, @@ -21,7 +21,7 @@ "leap_month_idx": 9 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ false, true, @@ -40,7 +40,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ true, false, @@ -59,7 +59,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ false, true, @@ -78,7 +78,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 27, + "ny_offset": 28, "month_has_30_days": [ true, true, @@ -97,7 +97,7 @@ "leap_month_idx": null }, { - "ny_offset": 15, + "ny_offset": 16, "month_has_30_days": [ true, true, @@ -116,7 +116,7 @@ "leap_month_idx": null }, { - "ny_offset": 5, + "ny_offset": 6, "month_has_30_days": [ false, true, @@ -135,7 +135,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 24, + "ny_offset": 25, "month_has_30_days": [ false, true, @@ -154,7 +154,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ true, false, @@ -173,7 +173,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ false, true, @@ -192,7 +192,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ false, true, @@ -211,7 +211,7 @@ "leap_month_idx": null }, { - "ny_offset": 10, + "ny_offset": 11, "month_has_30_days": [ true, false, @@ -230,7 +230,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 29, + "ny_offset": 30, "month_has_30_days": [ true, false, @@ -249,7 +249,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ true, true, @@ -268,7 +268,7 @@ "leap_month_idx": null }, { - "ny_offset": 6, + "ny_offset": 7, "month_has_30_days": [ true, true, @@ -287,7 +287,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 25, + "ny_offset": 26, "month_has_30_days": [ true, false, @@ -306,7 +306,7 @@ "leap_month_idx": null }, { - "ny_offset": 14, + "ny_offset": 15, "month_has_30_days": [ true, true, @@ -325,7 +325,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ true, false, @@ -344,7 +344,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ true, false, @@ -363,7 +363,7 @@ "leap_month_idx": null }, { - "ny_offset": 12, + "ny_offset": 13, "month_has_30_days": [ false, true, @@ -382,7 +382,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 31, + "ny_offset": 32, "month_has_30_days": [ false, true, @@ -401,7 +401,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ true, false, @@ -420,7 +420,7 @@ "leap_month_idx": null }, { - "ny_offset": 8, + "ny_offset": 9, "month_has_30_days": [ true, false, @@ -439,7 +439,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 27, + "ny_offset": 28, "month_has_30_days": [ false, true, @@ -458,7 +458,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ false, true, @@ -477,7 +477,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ true, false, @@ -496,7 +496,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 24, + "ny_offset": 25, "month_has_30_days": [ false, false, @@ -515,7 +515,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ true, false, @@ -534,7 +534,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ false, true, @@ -553,7 +553,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ false, true, @@ -572,7 +572,7 @@ "leap_month_idx": null }, { - "ny_offset": 10, + "ny_offset": 11, "month_has_30_days": [ false, true, @@ -591,7 +591,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ true, true, @@ -610,7 +610,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ true, true, @@ -629,7 +629,7 @@ "leap_month_idx": null }, { - "ny_offset": 6, + "ny_offset": 7, "month_has_30_days": [ false, true, @@ -648,7 +648,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 25, + "ny_offset": 26, "month_has_30_days": [ false, true, @@ -667,7 +667,7 @@ "leap_month_idx": null }, { - "ny_offset": 15, + "ny_offset": 16, "month_has_30_days": [ false, false, @@ -686,7 +686,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ true, false, @@ -705,7 +705,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ true, false, @@ -724,7 +724,7 @@ "leap_month_idx": null }, { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ true, true, @@ -743,7 +743,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ true, true, @@ -762,7 +762,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ true, true, @@ -781,7 +781,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ true, true, @@ -800,7 +800,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ true, false, @@ -819,7 +819,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ false, true, @@ -838,7 +838,7 @@ "leap_month_idx": null }, { - "ny_offset": 5, + "ny_offset": 6, "month_has_30_days": [ true, false, @@ -857,7 +857,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 24, + "ny_offset": 25, "month_has_30_days": [ false, false, @@ -876,7 +876,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ true, false, @@ -895,7 +895,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ true, true, @@ -914,7 +914,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ true, false, @@ -933,7 +933,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ true, false, @@ -952,7 +952,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ false, true, @@ -971,7 +971,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ true, false, @@ -990,7 +990,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ false, true, @@ -1009,7 +1009,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 25, + "ny_offset": 26, "month_has_30_days": [ false, true, @@ -1028,7 +1028,7 @@ "leap_month_idx": null }, { - "ny_offset": 14, + "ny_offset": 15, "month_has_30_days": [ true, false, @@ -1047,7 +1047,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ false, true, @@ -1066,7 +1066,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 23, + "ny_offset": 24, "month_has_30_days": [ false, true, @@ -1085,7 +1085,7 @@ "leap_month_idx": null }, { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ true, false, @@ -1104,7 +1104,7 @@ "leap_month_idx": 9 }, { - "ny_offset": 29, + "ny_offset": 30, "month_has_30_days": [ true, true, @@ -1123,7 +1123,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ false, true, @@ -1142,7 +1142,7 @@ "leap_month_idx": null }, { - "ny_offset": 8, + "ny_offset": 9, "month_has_30_days": [ true, false, @@ -1161,7 +1161,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ true, false, @@ -1180,7 +1180,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ false, true, @@ -1199,7 +1199,7 @@ "leap_month_idx": null }, { - "ny_offset": 5, + "ny_offset": 6, "month_has_30_days": [ true, false, @@ -1218,7 +1218,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 24, + "ny_offset": 25, "month_has_30_days": [ true, false, @@ -1237,7 +1237,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ false, true, @@ -1256,7 +1256,7 @@ "leap_month_idx": null }, { - "ny_offset": 1, + "ny_offset": 2, "month_has_30_days": [ true, true, @@ -1275,7 +1275,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 20, + "ny_offset": 21, "month_has_30_days": [ true, true, @@ -1294,7 +1294,7 @@ "leap_month_idx": null }, { - "ny_offset": 10, + "ny_offset": 11, "month_has_30_days": [ false, true, @@ -1313,7 +1313,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ false, true, @@ -1332,7 +1332,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ true, false, @@ -1351,7 +1351,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ false, true, @@ -1370,7 +1370,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ false, true, @@ -1389,7 +1389,7 @@ "leap_month_idx": null }, { - "ny_offset": 14, + "ny_offset": 15, "month_has_30_days": [ true, false, @@ -1408,7 +1408,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ true, true, @@ -1427,7 +1427,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ true, true, @@ -1446,7 +1446,7 @@ "leap_month_idx": null }, { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ true, true, @@ -1465,7 +1465,7 @@ "leap_month_idx": 9 }, { - "ny_offset": 29, + "ny_offset": 30, "month_has_30_days": [ true, false, @@ -1484,7 +1484,7 @@ "leap_month_idx": null }, { - "ny_offset": 18, + "ny_offset": 19, "month_has_30_days": [ true, false, @@ -1503,7 +1503,7 @@ "leap_month_idx": null }, { - "ny_offset": 8, + "ny_offset": 9, "month_has_30_days": [ true, false, @@ -1522,7 +1522,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 27, + "ny_offset": 28, "month_has_30_days": [ true, false, @@ -1541,7 +1541,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ false, true, @@ -1560,7 +1560,7 @@ "leap_month_idx": null }, { - "ny_offset": 5, + "ny_offset": 6, "month_has_30_days": [ true, false, @@ -1579,7 +1579,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 24, + "ny_offset": 25, "month_has_30_days": [ true, false, @@ -1598,7 +1598,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ true, false, @@ -1617,7 +1617,7 @@ "leap_month_idx": 11 }, { - "ny_offset": 31, + "ny_offset": 32, "month_has_30_days": [ false, true, @@ -1636,7 +1636,7 @@ "leap_month_idx": null }, { - "ny_offset": 20, + "ny_offset": 21, "month_has_30_days": [ false, true, @@ -1655,7 +1655,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ true, false, @@ -1674,7 +1674,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ true, false, @@ -1693,7 +1693,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ true, false, @@ -1712,7 +1712,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ false, true, @@ -1731,7 +1731,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ false, true, @@ -1750,7 +1750,7 @@ "leap_month_idx": null }, { - "ny_offset": 15, + "ny_offset": 16, "month_has_30_days": [ false, true, @@ -1769,7 +1769,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ false, true, @@ -1788,7 +1788,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ true, true, @@ -1807,7 +1807,7 @@ "leap_month_idx": null }, { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ false, true, @@ -1826,7 +1826,7 @@ "leap_month_idx": 9 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ false, true, @@ -1845,7 +1845,7 @@ "leap_month_idx": null }, { - "ny_offset": 18, + "ny_offset": 19, "month_has_30_days": [ true, false, @@ -1864,7 +1864,7 @@ "leap_month_idx": null }, { - "ny_offset": 8, + "ny_offset": 9, "month_has_30_days": [ true, false, @@ -1883,7 +1883,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 27, + "ny_offset": 28, "month_has_30_days": [ true, false, @@ -1902,7 +1902,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ true, true, @@ -1921,7 +1921,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ true, true, @@ -1940,7 +1940,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 23, + "ny_offset": 24, "month_has_30_days": [ true, true, @@ -1959,7 +1959,7 @@ "leap_month_idx": null }, { - "ny_offset": 12, + "ny_offset": 13, "month_has_30_days": [ true, true, @@ -1978,7 +1978,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ false, true, @@ -1997,7 +1997,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 20, + "ny_offset": 21, "month_has_30_days": [ false, true, @@ -2016,7 +2016,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ true, false, @@ -2035,7 +2035,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 29, + "ny_offset": 30, "month_has_30_days": [ false, false, @@ -2054,7 +2054,7 @@ "leap_month_idx": null }, { - "ny_offset": 18, + "ny_offset": 19, "month_has_30_days": [ true, false, @@ -2073,7 +2073,7 @@ "leap_month_idx": null }, { - "ny_offset": 6, + "ny_offset": 7, "month_has_30_days": [ true, true, @@ -2092,7 +2092,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 25, + "ny_offset": 26, "month_has_30_days": [ true, false, @@ -2111,7 +2111,7 @@ "leap_month_idx": null }, { - "ny_offset": 14, + "ny_offset": 15, "month_has_30_days": [ true, false, @@ -2130,7 +2130,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ true, false, @@ -2149,7 +2149,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ true, false, @@ -2168,7 +2168,7 @@ "leap_month_idx": null }, { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ false, true, @@ -2187,7 +2187,7 @@ "leap_month_idx": 10 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ false, true, @@ -2206,7 +2206,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ true, false, @@ -2225,7 +2225,7 @@ "leap_month_idx": null }, { - "ny_offset": 8, + "ny_offset": 9, "month_has_30_days": [ false, true, @@ -2244,7 +2244,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 27, + "ny_offset": 28, "month_has_30_days": [ false, true, @@ -2263,7 +2263,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ true, false, @@ -2282,7 +2282,7 @@ "leap_month_idx": null }, { - "ny_offset": 5, + "ny_offset": 6, "month_has_30_days": [ false, true, @@ -2301,7 +2301,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 23, + "ny_offset": 24, "month_has_30_days": [ false, true, @@ -2320,7 +2320,7 @@ "leap_month_idx": null }, { - "ny_offset": 12, + "ny_offset": 13, "month_has_30_days": [ true, false, @@ -2339,7 +2339,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ false, true, @@ -2358,7 +2358,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ false, true, @@ -2377,7 +2377,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ true, false, @@ -2396,7 +2396,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ true, false, @@ -2415,7 +2415,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ true, true, @@ -2434,7 +2434,7 @@ "leap_month_idx": null }, { - "ny_offset": 6, + "ny_offset": 7, "month_has_30_days": [ true, true, @@ -2453,7 +2453,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 24, + "ny_offset": 25, "month_has_30_days": [ true, true, @@ -2472,7 +2472,7 @@ "leap_month_idx": null }, { - "ny_offset": 14, + "ny_offset": 15, "month_has_30_days": [ false, true, @@ -2491,7 +2491,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ false, true, @@ -2510,7 +2510,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ true, false, @@ -2529,7 +2529,7 @@ "leap_month_idx": null }, { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ false, true, @@ -2548,7 +2548,7 @@ "leap_month_idx": 12 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ false, true, @@ -2567,7 +2567,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ true, false, @@ -2586,7 +2586,7 @@ "leap_month_idx": null }, { - "ny_offset": 8, + "ny_offset": 9, "month_has_30_days": [ true, true, @@ -2605,7 +2605,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ true, true, @@ -2624,7 +2624,7 @@ "leap_month_idx": null }, { - "ny_offset": 15, + "ny_offset": 16, "month_has_30_days": [ true, true, @@ -2643,7 +2643,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ true, true, @@ -2662,7 +2662,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 23, + "ny_offset": 24, "month_has_30_days": [ true, false, @@ -2681,7 +2681,7 @@ "leap_month_idx": null }, { - "ny_offset": 12, + "ny_offset": 13, "month_has_30_days": [ false, true, @@ -2700,7 +2700,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ false, true, @@ -2719,7 +2719,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ false, true, @@ -2738,7 +2738,7 @@ "leap_month_idx": null }, { - "ny_offset": 10, + "ny_offset": 11, "month_has_30_days": [ true, false, @@ -2757,7 +2757,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ true, false, @@ -2776,7 +2776,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ true, false, @@ -2795,7 +2795,7 @@ "leap_month_idx": null }, { - "ny_offset": 6, + "ny_offset": 7, "month_has_30_days": [ true, false, @@ -2814,7 +2814,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 25, + "ny_offset": 26, "month_has_30_days": [ false, true, @@ -2833,7 +2833,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ true, false, @@ -2852,7 +2852,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ false, true, @@ -2871,7 +2871,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ true, false, @@ -2890,7 +2890,7 @@ "leap_month_idx": null }, { - "ny_offset": 12, + "ny_offset": 13, "month_has_30_days": [ false, true, @@ -2909,7 +2909,7 @@ "leap_month_idx": 9 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ false, true, @@ -2928,7 +2928,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ false, true, @@ -2947,7 +2947,7 @@ "leap_month_idx": null }, { - "ny_offset": 8, + "ny_offset": 9, "month_has_30_days": [ false, true, @@ -2966,7 +2966,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ true, true, @@ -2985,7 +2985,7 @@ "leap_month_idx": null }, { - "ny_offset": 15, + "ny_offset": 16, "month_has_30_days": [ false, true, @@ -3004,7 +3004,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ true, false, @@ -3023,7 +3023,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 23, + "ny_offset": 24, "month_has_30_days": [ true, false, @@ -3042,7 +3042,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ true, false, @@ -3061,7 +3061,7 @@ "leap_month_idx": null }, { - "ny_offset": 1, + "ny_offset": 2, "month_has_30_days": [ true, true, @@ -3080,7 +3080,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 20, + "ny_offset": 21, "month_has_30_days": [ true, true, @@ -3099,7 +3099,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ true, true, @@ -3118,7 +3118,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ true, true, @@ -3137,7 +3137,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ true, true, @@ -3156,7 +3156,7 @@ "leap_month_idx": null }, { - "ny_offset": 6, + "ny_offset": 7, "month_has_30_days": [ false, true, @@ -3175,7 +3175,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 25, + "ny_offset": 26, "month_has_30_days": [ false, true, @@ -3194,7 +3194,7 @@ "leap_month_idx": null }, { - "ny_offset": 14, + "ny_offset": 15, "month_has_30_days": [ true, false, @@ -3213,7 +3213,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ false, true, @@ -3232,7 +3232,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ false, true, @@ -3251,7 +3251,7 @@ "leap_month_idx": null }, { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ true, false, @@ -3270,7 +3270,7 @@ "leap_month_idx": 9 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ true, false, @@ -3289,7 +3289,7 @@ "leap_month_idx": null }, { - "ny_offset": 18, + "ny_offset": 19, "month_has_30_days": [ true, false, @@ -3308,7 +3308,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ true, false, @@ -3327,7 +3327,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ true, false, @@ -3346,7 +3346,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ false, true, @@ -3365,7 +3365,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ true, false, @@ -3384,7 +3384,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 23, + "ny_offset": 24, "month_has_30_days": [ true, false, @@ -3403,7 +3403,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ false, true, @@ -3422,7 +3422,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ true, false, @@ -3441,7 +3441,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 20, + "ny_offset": 21, "month_has_30_days": [ false, true, @@ -3460,7 +3460,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ false, true, @@ -3479,7 +3479,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ false, true, @@ -3498,7 +3498,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ true, false, @@ -3517,7 +3517,7 @@ "leap_month_idx": null }, { - "ny_offset": 6, + "ny_offset": 7, "month_has_30_days": [ false, true, @@ -3536,7 +3536,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 25, + "ny_offset": 26, "month_has_30_days": [ false, true, @@ -3555,7 +3555,7 @@ "leap_month_idx": null }, { - "ny_offset": 14, + "ny_offset": 15, "month_has_30_days": [ true, false, @@ -3574,7 +3574,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ false, true, @@ -3593,7 +3593,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ true, true, @@ -3612,7 +3612,7 @@ "leap_month_idx": null }, { - "ny_offset": 10, + "ny_offset": 11, "month_has_30_days": [ true, true, @@ -3631,7 +3631,7 @@ "leap_month_idx": 9 }, { - "ny_offset": 29, + "ny_offset": 30, "month_has_30_days": [ true, true, @@ -3650,7 +3650,7 @@ "leap_month_idx": null }, { - "ny_offset": 18, + "ny_offset": 19, "month_has_30_days": [ true, true, @@ -3669,7 +3669,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ false, true, @@ -3688,7 +3688,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ false, true, @@ -3707,7 +3707,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ false, true, @@ -3726,7 +3726,7 @@ "leap_month_idx": null }, { - "ny_offset": 5, + "ny_offset": 6, "month_has_30_days": [ true, false, @@ -3745,7 +3745,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 23, + "ny_offset": 24, "month_has_30_days": [ true, false, @@ -3764,7 +3764,7 @@ "leap_month_idx": null }, { - "ny_offset": 12, + "ny_offset": 13, "month_has_30_days": [ true, true, @@ -3783,7 +3783,7 @@ "leap_month_idx": null }, { - "ny_offset": 1, + "ny_offset": 2, "month_has_30_days": [ true, true, @@ -3802,7 +3802,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 20, + "ny_offset": 21, "month_has_30_days": [ true, true, @@ -3821,7 +3821,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ true, true, @@ -3840,7 +3840,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ true, false, @@ -3859,7 +3859,7 @@ "leap_month_idx": null }, { - "ny_offset": 18, + "ny_offset": 19, "month_has_30_days": [ false, true, @@ -3878,7 +3878,7 @@ "leap_month_idx": null }, { - "ny_offset": 8, + "ny_offset": 9, "month_has_30_days": [ false, true, @@ -3897,7 +3897,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ false, true, @@ -3916,7 +3916,7 @@ "leap_month_idx": null }, { - "ny_offset": 15, + "ny_offset": 16, "month_has_30_days": [ true, false, @@ -3935,7 +3935,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ true, true, @@ -3954,7 +3954,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 23, + "ny_offset": 24, "month_has_30_days": [ true, false, @@ -3973,7 +3973,7 @@ "leap_month_idx": null }, { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ true, false, @@ -3992,7 +3992,7 @@ "leap_month_idx": 10 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ false, true, @@ -4011,7 +4011,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ true, false, @@ -4030,7 +4030,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ false, true, @@ -4049,7 +4049,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 27, + "ny_offset": 28, "month_has_30_days": [ true, false, @@ -4068,7 +4068,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ false, true, @@ -4087,7 +4087,7 @@ "leap_month_idx": null }, { - "ny_offset": 6, + "ny_offset": 7, "month_has_30_days": [ false, true, @@ -4106,7 +4106,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 25, + "ny_offset": 26, "month_has_30_days": [ false, true, @@ -4125,7 +4125,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ false, true, @@ -4144,7 +4144,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ false, true, @@ -4163,7 +4163,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ false, true, @@ -4182,7 +4182,7 @@ "leap_month_idx": null }, { - "ny_offset": 10, + "ny_offset": 11, "month_has_30_days": [ true, false, @@ -4201,7 +4201,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ true, false, @@ -4220,7 +4220,7 @@ "leap_month_idx": null }, { - "ny_offset": 18, + "ny_offset": 19, "month_has_30_days": [ false, true, @@ -4239,7 +4239,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ true, true, @@ -4258,7 +4258,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ true, false, @@ -4277,7 +4277,7 @@ "leap_month_idx": null }, { - "ny_offset": 14, + "ny_offset": 15, "month_has_30_days": [ true, true, @@ -4296,7 +4296,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ true, true, @@ -4315,7 +4315,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ true, true, @@ -4334,7 +4334,7 @@ "leap_month_idx": null }, { - "ny_offset": 12, + "ny_offset": 13, "month_has_30_days": [ false, true, @@ -4353,7 +4353,7 @@ "leap_month_idx": 12 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ false, true, @@ -4372,7 +4372,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ true, false, @@ -4391,7 +4391,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ false, true, @@ -4410,7 +4410,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ false, true, @@ -4429,7 +4429,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ true, false, @@ -4448,7 +4448,7 @@ "leap_month_idx": null }, { - "ny_offset": 5, + "ny_offset": 6, "month_has_30_days": [ true, true, @@ -4467,7 +4467,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 24, + "ny_offset": 25, "month_has_30_days": [ true, false, @@ -4486,7 +4486,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ true, false, @@ -4505,7 +4505,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ false, true, @@ -4524,7 +4524,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ false, true, @@ -4543,7 +4543,7 @@ "leap_month_idx": null }, { - "ny_offset": 10, + "ny_offset": 11, "month_has_30_days": [ true, false, @@ -4562,7 +4562,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 29, + "ny_offset": 30, "month_has_30_days": [ true, false, @@ -4581,7 +4581,7 @@ "leap_month_idx": null }, { - "ny_offset": 18, + "ny_offset": 19, "month_has_30_days": [ false, true, @@ -4600,7 +4600,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ true, false, @@ -4619,7 +4619,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ false, true, @@ -4638,7 +4638,7 @@ "leap_month_idx": null }, { - "ny_offset": 15, + "ny_offset": 16, "month_has_30_days": [ false, true, @@ -4657,7 +4657,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ true, false, @@ -4676,7 +4676,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ false, true, @@ -4695,7 +4695,7 @@ "leap_month_idx": null }, { - "ny_offset": 12, + "ny_offset": 13, "month_has_30_days": [ false, false, @@ -4714,7 +4714,7 @@ "leap_month_idx": 12 }, { - "ny_offset": 31, + "ny_offset": 32, "month_has_30_days": [ false, true, @@ -4733,7 +4733,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ true, false, diff --git a/provider/datagen/tests/data/json/calendar/dangicache@1/und.json b/provider/datagen/tests/data/json/calendar/dangicache@1/und.json index 0c1836cb07a..d56df17d1b6 100644 --- a/provider/datagen/tests/data/json/calendar/dangicache@1/und.json +++ b/provider/datagen/tests/data/json/calendar/dangicache@1/und.json @@ -2,7 +2,7 @@ "first_extended_year": 4233, "data": [ { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ false, true, @@ -21,7 +21,7 @@ "leap_month_idx": 9 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ false, true, @@ -40,7 +40,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ true, false, @@ -59,7 +59,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ false, true, @@ -78,7 +78,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 27, + "ny_offset": 28, "month_has_30_days": [ true, true, @@ -97,7 +97,7 @@ "leap_month_idx": null }, { - "ny_offset": 15, + "ny_offset": 16, "month_has_30_days": [ true, true, @@ -116,7 +116,7 @@ "leap_month_idx": null }, { - "ny_offset": 5, + "ny_offset": 6, "month_has_30_days": [ false, true, @@ -135,7 +135,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 24, + "ny_offset": 25, "month_has_30_days": [ false, true, @@ -154,7 +154,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ true, false, @@ -173,7 +173,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ false, true, @@ -192,7 +192,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ false, true, @@ -211,7 +211,7 @@ "leap_month_idx": null }, { - "ny_offset": 10, + "ny_offset": 11, "month_has_30_days": [ true, false, @@ -230,7 +230,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 29, + "ny_offset": 30, "month_has_30_days": [ true, false, @@ -249,7 +249,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ true, true, @@ -268,7 +268,7 @@ "leap_month_idx": null }, { - "ny_offset": 6, + "ny_offset": 7, "month_has_30_days": [ true, true, @@ -287,7 +287,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 25, + "ny_offset": 26, "month_has_30_days": [ true, false, @@ -306,7 +306,7 @@ "leap_month_idx": null }, { - "ny_offset": 15, + "ny_offset": 16, "month_has_30_days": [ false, true, @@ -325,7 +325,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ true, false, @@ -344,7 +344,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ true, false, @@ -363,7 +363,7 @@ "leap_month_idx": null }, { - "ny_offset": 12, + "ny_offset": 13, "month_has_30_days": [ false, true, @@ -382,7 +382,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 31, + "ny_offset": 32, "month_has_30_days": [ false, true, @@ -401,7 +401,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ true, false, @@ -420,7 +420,7 @@ "leap_month_idx": null }, { - "ny_offset": 8, + "ny_offset": 9, "month_has_30_days": [ true, false, @@ -439,7 +439,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 27, + "ny_offset": 28, "month_has_30_days": [ false, true, @@ -458,7 +458,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ true, false, @@ -477,7 +477,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ true, false, @@ -496,7 +496,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 24, + "ny_offset": 25, "month_has_30_days": [ false, false, @@ -515,7 +515,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ true, false, @@ -534,7 +534,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ false, true, @@ -553,7 +553,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ false, true, @@ -572,7 +572,7 @@ "leap_month_idx": null }, { - "ny_offset": 10, + "ny_offset": 11, "month_has_30_days": [ false, true, @@ -591,7 +591,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ true, true, @@ -610,7 +610,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ true, true, @@ -629,7 +629,7 @@ "leap_month_idx": null }, { - "ny_offset": 6, + "ny_offset": 7, "month_has_30_days": [ false, true, @@ -648,7 +648,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 25, + "ny_offset": 26, "month_has_30_days": [ false, true, @@ -667,7 +667,7 @@ "leap_month_idx": null }, { - "ny_offset": 15, + "ny_offset": 16, "month_has_30_days": [ false, false, @@ -686,7 +686,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ true, false, @@ -705,7 +705,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ true, false, @@ -724,7 +724,7 @@ "leap_month_idx": null }, { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ true, true, @@ -743,7 +743,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ true, true, @@ -762,7 +762,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ true, true, @@ -781,7 +781,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ true, true, @@ -800,7 +800,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ true, false, @@ -819,7 +819,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ false, true, @@ -838,7 +838,7 @@ "leap_month_idx": null }, { - "ny_offset": 6, + "ny_offset": 7, "month_has_30_days": [ false, false, @@ -857,7 +857,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 24, + "ny_offset": 25, "month_has_30_days": [ false, false, @@ -876,7 +876,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ true, false, @@ -895,7 +895,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ true, true, @@ -914,7 +914,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ true, false, @@ -933,7 +933,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ true, true, @@ -952,7 +952,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ true, false, @@ -971,7 +971,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ true, false, @@ -990,7 +990,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ false, true, @@ -1009,7 +1009,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 25, + "ny_offset": 26, "month_has_30_days": [ false, true, @@ -1028,7 +1028,7 @@ "leap_month_idx": null }, { - "ny_offset": 15, + "ny_offset": 16, "month_has_30_days": [ false, false, @@ -1047,7 +1047,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ true, false, @@ -1066,7 +1066,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 23, + "ny_offset": 24, "month_has_30_days": [ false, true, @@ -1085,7 +1085,7 @@ "leap_month_idx": null }, { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ true, false, @@ -1104,7 +1104,7 @@ "leap_month_idx": 9 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ false, true, @@ -1123,7 +1123,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ false, true, @@ -1142,7 +1142,7 @@ "leap_month_idx": null }, { - "ny_offset": 8, + "ny_offset": 9, "month_has_30_days": [ true, false, @@ -1161,7 +1161,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ true, false, @@ -1180,7 +1180,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ false, true, @@ -1199,7 +1199,7 @@ "leap_month_idx": null }, { - "ny_offset": 5, + "ny_offset": 6, "month_has_30_days": [ true, false, @@ -1218,7 +1218,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 24, + "ny_offset": 25, "month_has_30_days": [ true, false, @@ -1237,7 +1237,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ false, true, @@ -1256,7 +1256,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ false, true, @@ -1275,7 +1275,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 20, + "ny_offset": 21, "month_has_30_days": [ true, true, @@ -1294,7 +1294,7 @@ "leap_month_idx": null }, { - "ny_offset": 10, + "ny_offset": 11, "month_has_30_days": [ false, true, @@ -1313,7 +1313,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ false, true, @@ -1332,7 +1332,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ true, false, @@ -1351,7 +1351,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ false, true, @@ -1370,7 +1370,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ false, true, @@ -1389,7 +1389,7 @@ "leap_month_idx": null }, { - "ny_offset": 14, + "ny_offset": 15, "month_has_30_days": [ true, false, @@ -1408,7 +1408,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ true, true, @@ -1427,7 +1427,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ true, true, @@ -1446,7 +1446,7 @@ "leap_month_idx": null }, { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ true, true, @@ -1465,7 +1465,7 @@ "leap_month_idx": 9 }, { - "ny_offset": 29, + "ny_offset": 30, "month_has_30_days": [ true, false, @@ -1484,7 +1484,7 @@ "leap_month_idx": null }, { - "ny_offset": 18, + "ny_offset": 19, "month_has_30_days": [ true, true, @@ -1503,7 +1503,7 @@ "leap_month_idx": null }, { - "ny_offset": 8, + "ny_offset": 9, "month_has_30_days": [ true, false, @@ -1522,7 +1522,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 27, + "ny_offset": 28, "month_has_30_days": [ true, false, @@ -1541,7 +1541,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ false, true, @@ -1560,7 +1560,7 @@ "leap_month_idx": null }, { - "ny_offset": 5, + "ny_offset": 6, "month_has_30_days": [ true, false, @@ -1579,7 +1579,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 24, + "ny_offset": 25, "month_has_30_days": [ true, false, @@ -1598,7 +1598,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ true, false, @@ -1617,7 +1617,7 @@ "leap_month_idx": 11 }, { - "ny_offset": 31, + "ny_offset": 32, "month_has_30_days": [ false, true, @@ -1636,7 +1636,7 @@ "leap_month_idx": null }, { - "ny_offset": 20, + "ny_offset": 21, "month_has_30_days": [ false, true, @@ -1655,7 +1655,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ true, false, @@ -1674,7 +1674,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 29, + "ny_offset": 30, "month_has_30_days": [ false, false, @@ -1693,7 +1693,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ true, false, @@ -1712,7 +1712,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ false, true, @@ -1731,7 +1731,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ false, true, @@ -1750,7 +1750,7 @@ "leap_month_idx": null }, { - "ny_offset": 15, + "ny_offset": 16, "month_has_30_days": [ false, true, @@ -1769,7 +1769,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ false, true, @@ -1788,7 +1788,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ true, true, @@ -1807,7 +1807,7 @@ "leap_month_idx": null }, { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ false, true, @@ -1826,7 +1826,7 @@ "leap_month_idx": 9 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ false, true, @@ -1845,7 +1845,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ false, false, @@ -1864,7 +1864,7 @@ "leap_month_idx": null }, { - "ny_offset": 8, + "ny_offset": 9, "month_has_30_days": [ true, false, @@ -1883,7 +1883,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 27, + "ny_offset": 28, "month_has_30_days": [ true, false, @@ -1902,7 +1902,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ true, true, @@ -1921,7 +1921,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ true, true, @@ -1940,7 +1940,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 23, + "ny_offset": 24, "month_has_30_days": [ true, true, @@ -1959,7 +1959,7 @@ "leap_month_idx": null }, { - "ny_offset": 12, + "ny_offset": 13, "month_has_30_days": [ true, true, @@ -1978,7 +1978,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ false, true, @@ -1997,7 +1997,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 20, + "ny_offset": 21, "month_has_30_days": [ false, true, @@ -2016,7 +2016,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ true, false, @@ -2035,7 +2035,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 29, + "ny_offset": 30, "month_has_30_days": [ false, false, @@ -2054,7 +2054,7 @@ "leap_month_idx": null }, { - "ny_offset": 18, + "ny_offset": 19, "month_has_30_days": [ true, false, @@ -2073,7 +2073,7 @@ "leap_month_idx": null }, { - "ny_offset": 6, + "ny_offset": 7, "month_has_30_days": [ true, true, @@ -2092,7 +2092,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 25, + "ny_offset": 26, "month_has_30_days": [ true, false, @@ -2111,7 +2111,7 @@ "leap_month_idx": null }, { - "ny_offset": 14, + "ny_offset": 15, "month_has_30_days": [ true, false, @@ -2130,7 +2130,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ true, false, @@ -2149,7 +2149,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ true, false, @@ -2168,7 +2168,7 @@ "leap_month_idx": null }, { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ false, true, @@ -2187,7 +2187,7 @@ "leap_month_idx": 10 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ false, true, @@ -2206,7 +2206,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ true, false, @@ -2225,7 +2225,7 @@ "leap_month_idx": null }, { - "ny_offset": 8, + "ny_offset": 9, "month_has_30_days": [ false, true, @@ -2244,7 +2244,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 27, + "ny_offset": 28, "month_has_30_days": [ false, true, @@ -2263,7 +2263,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ true, false, @@ -2282,7 +2282,7 @@ "leap_month_idx": null }, { - "ny_offset": 5, + "ny_offset": 6, "month_has_30_days": [ true, false, @@ -2301,7 +2301,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 23, + "ny_offset": 24, "month_has_30_days": [ false, true, @@ -2320,7 +2320,7 @@ "leap_month_idx": null }, { - "ny_offset": 12, + "ny_offset": 13, "month_has_30_days": [ true, false, @@ -2339,7 +2339,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ false, true, @@ -2358,7 +2358,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ false, true, @@ -2377,7 +2377,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ true, false, @@ -2396,7 +2396,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ true, false, @@ -2415,7 +2415,7 @@ "leap_month_idx": null }, { - "ny_offset": 18, + "ny_offset": 19, "month_has_30_days": [ false, true, @@ -2434,7 +2434,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ false, true, @@ -2453,7 +2453,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 24, + "ny_offset": 25, "month_has_30_days": [ true, true, @@ -2472,7 +2472,7 @@ "leap_month_idx": null }, { - "ny_offset": 14, + "ny_offset": 15, "month_has_30_days": [ false, true, @@ -2491,7 +2491,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ true, false, @@ -2510,7 +2510,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ true, false, @@ -2529,7 +2529,7 @@ "leap_month_idx": null }, { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ false, true, @@ -2548,7 +2548,7 @@ "leap_month_idx": 12 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ false, true, @@ -2567,7 +2567,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ true, false, @@ -2586,7 +2586,7 @@ "leap_month_idx": null }, { - "ny_offset": 8, + "ny_offset": 9, "month_has_30_days": [ true, true, @@ -2605,7 +2605,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ true, true, @@ -2624,7 +2624,7 @@ "leap_month_idx": null }, { - "ny_offset": 15, + "ny_offset": 16, "month_has_30_days": [ true, true, @@ -2643,7 +2643,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ true, true, @@ -2662,7 +2662,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 23, + "ny_offset": 24, "month_has_30_days": [ true, false, @@ -2681,7 +2681,7 @@ "leap_month_idx": null }, { - "ny_offset": 12, + "ny_offset": 13, "month_has_30_days": [ true, false, @@ -2700,7 +2700,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ false, true, @@ -2719,7 +2719,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ false, true, @@ -2738,7 +2738,7 @@ "leap_month_idx": null }, { - "ny_offset": 10, + "ny_offset": 11, "month_has_30_days": [ true, false, @@ -2757,7 +2757,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ true, false, @@ -2776,7 +2776,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ true, false, @@ -2795,7 +2795,7 @@ "leap_month_idx": null }, { - "ny_offset": 6, + "ny_offset": 7, "month_has_30_days": [ true, false, @@ -2814,7 +2814,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 25, + "ny_offset": 26, "month_has_30_days": [ false, true, @@ -2833,7 +2833,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ true, false, @@ -2852,7 +2852,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ true, false, @@ -2871,7 +2871,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ true, false, @@ -2890,7 +2890,7 @@ "leap_month_idx": null }, { - "ny_offset": 12, + "ny_offset": 13, "month_has_30_days": [ false, true, @@ -2909,7 +2909,7 @@ "leap_month_idx": 9 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ false, true, @@ -2928,7 +2928,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ false, true, @@ -2947,7 +2947,7 @@ "leap_month_idx": null }, { - "ny_offset": 8, + "ny_offset": 9, "month_has_30_days": [ false, true, @@ -2966,7 +2966,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ true, true, @@ -2985,7 +2985,7 @@ "leap_month_idx": null }, { - "ny_offset": 15, + "ny_offset": 16, "month_has_30_days": [ false, true, @@ -3004,7 +3004,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ true, false, @@ -3023,7 +3023,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 23, + "ny_offset": 24, "month_has_30_days": [ true, false, @@ -3042,7 +3042,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ true, false, @@ -3061,7 +3061,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ false, true, @@ -3080,7 +3080,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 20, + "ny_offset": 21, "month_has_30_days": [ true, true, @@ -3099,7 +3099,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ true, true, @@ -3118,7 +3118,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ true, true, @@ -3137,7 +3137,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ true, true, @@ -3156,7 +3156,7 @@ "leap_month_idx": null }, { - "ny_offset": 6, + "ny_offset": 7, "month_has_30_days": [ false, true, @@ -3175,7 +3175,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 25, + "ny_offset": 26, "month_has_30_days": [ false, true, @@ -3194,7 +3194,7 @@ "leap_month_idx": null }, { - "ny_offset": 14, + "ny_offset": 15, "month_has_30_days": [ true, false, @@ -3213,7 +3213,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ true, false, @@ -3232,7 +3232,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ true, false, @@ -3251,7 +3251,7 @@ "leap_month_idx": null }, { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ true, true, @@ -3270,7 +3270,7 @@ "leap_month_idx": 9 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ true, false, @@ -3289,7 +3289,7 @@ "leap_month_idx": null }, { - "ny_offset": 18, + "ny_offset": 19, "month_has_30_days": [ true, false, @@ -3308,7 +3308,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ true, false, @@ -3327,7 +3327,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ true, false, @@ -3346,7 +3346,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ false, true, @@ -3365,7 +3365,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ true, false, @@ -3384,7 +3384,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 23, + "ny_offset": 24, "month_has_30_days": [ true, false, @@ -3403,7 +3403,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ false, true, @@ -3422,7 +3422,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ true, false, @@ -3441,7 +3441,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 20, + "ny_offset": 21, "month_has_30_days": [ true, false, @@ -3460,7 +3460,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ false, true, @@ -3479,7 +3479,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ false, true, @@ -3498,7 +3498,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ true, false, @@ -3517,7 +3517,7 @@ "leap_month_idx": null }, { - "ny_offset": 6, + "ny_offset": 7, "month_has_30_days": [ false, true, @@ -3536,7 +3536,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 25, + "ny_offset": 26, "month_has_30_days": [ false, true, @@ -3555,7 +3555,7 @@ "leap_month_idx": null }, { - "ny_offset": 14, + "ny_offset": 15, "month_has_30_days": [ true, false, @@ -3574,7 +3574,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ false, true, @@ -3593,7 +3593,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ false, true, @@ -3612,7 +3612,7 @@ "leap_month_idx": null }, { - "ny_offset": 10, + "ny_offset": 11, "month_has_30_days": [ true, true, @@ -3631,7 +3631,7 @@ "leap_month_idx": 9 }, { - "ny_offset": 29, + "ny_offset": 30, "month_has_30_days": [ true, true, @@ -3650,7 +3650,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ false, true, @@ -3669,7 +3669,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ true, false, @@ -3688,7 +3688,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ true, false, @@ -3707,7 +3707,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ false, true, @@ -3726,7 +3726,7 @@ "leap_month_idx": null }, { - "ny_offset": 5, + "ny_offset": 6, "month_has_30_days": [ true, false, @@ -3745,7 +3745,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 23, + "ny_offset": 24, "month_has_30_days": [ true, false, @@ -3764,7 +3764,7 @@ "leap_month_idx": null }, { - "ny_offset": 12, + "ny_offset": 13, "month_has_30_days": [ true, true, @@ -3783,7 +3783,7 @@ "leap_month_idx": null }, { - "ny_offset": 1, + "ny_offset": 2, "month_has_30_days": [ true, true, @@ -3802,7 +3802,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 20, + "ny_offset": 21, "month_has_30_days": [ true, true, @@ -3821,7 +3821,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ true, true, @@ -3840,7 +3840,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ true, false, @@ -3859,7 +3859,7 @@ "leap_month_idx": null }, { - "ny_offset": 18, + "ny_offset": 19, "month_has_30_days": [ true, false, @@ -3878,7 +3878,7 @@ "leap_month_idx": null }, { - "ny_offset": 8, + "ny_offset": 9, "month_has_30_days": [ false, true, @@ -3897,7 +3897,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ false, true, @@ -3916,7 +3916,7 @@ "leap_month_idx": null }, { - "ny_offset": 15, + "ny_offset": 16, "month_has_30_days": [ true, false, @@ -3935,7 +3935,7 @@ "leap_month_idx": null }, { - "ny_offset": 4, + "ny_offset": 5, "month_has_30_days": [ true, true, @@ -3954,7 +3954,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 23, + "ny_offset": 24, "month_has_30_days": [ true, false, @@ -3973,7 +3973,7 @@ "leap_month_idx": null }, { - "ny_offset": 11, + "ny_offset": 12, "month_has_30_days": [ true, false, @@ -3992,7 +3992,7 @@ "leap_month_idx": 10 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ false, true, @@ -4011,7 +4011,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ true, false, @@ -4030,7 +4030,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ false, true, @@ -4049,7 +4049,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 27, + "ny_offset": 28, "month_has_30_days": [ true, false, @@ -4068,7 +4068,7 @@ "leap_month_idx": null }, { - "ny_offset": 17, + "ny_offset": 18, "month_has_30_days": [ false, true, @@ -4087,7 +4087,7 @@ "leap_month_idx": null }, { - "ny_offset": 6, + "ny_offset": 7, "month_has_30_days": [ true, false, @@ -4106,7 +4106,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 25, + "ny_offset": 26, "month_has_30_days": [ false, true, @@ -4125,7 +4125,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ false, true, @@ -4144,7 +4144,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ false, true, @@ -4163,7 +4163,7 @@ "leap_month_idx": 4 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ false, true, @@ -4182,7 +4182,7 @@ "leap_month_idx": null }, { - "ny_offset": 10, + "ny_offset": 11, "month_has_30_days": [ true, false, @@ -4201,7 +4201,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ true, false, @@ -4220,7 +4220,7 @@ "leap_month_idx": null }, { - "ny_offset": 18, + "ny_offset": 19, "month_has_30_days": [ true, false, @@ -4239,7 +4239,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ true, true, @@ -4258,7 +4258,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ true, true, @@ -4277,7 +4277,7 @@ "leap_month_idx": null }, { - "ny_offset": 14, + "ny_offset": 15, "month_has_30_days": [ true, true, @@ -4296,7 +4296,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ true, true, @@ -4315,7 +4315,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ true, true, @@ -4334,7 +4334,7 @@ "leap_month_idx": null }, { - "ny_offset": 12, + "ny_offset": 13, "month_has_30_days": [ false, true, @@ -4353,7 +4353,7 @@ "leap_month_idx": 10 }, { - "ny_offset": 30, + "ny_offset": 31, "month_has_30_days": [ false, true, @@ -4372,7 +4372,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ true, false, @@ -4391,7 +4391,7 @@ "leap_month_idx": null }, { - "ny_offset": 9, + "ny_offset": 10, "month_has_30_days": [ false, true, @@ -4410,7 +4410,7 @@ "leap_month_idx": 7 }, { - "ny_offset": 28, + "ny_offset": 29, "month_has_30_days": [ true, false, @@ -4429,7 +4429,7 @@ "leap_month_idx": null }, { - "ny_offset": 16, + "ny_offset": 17, "month_has_30_days": [ true, false, @@ -4448,7 +4448,7 @@ "leap_month_idx": null }, { - "ny_offset": 5, + "ny_offset": 6, "month_has_30_days": [ true, true, @@ -4467,7 +4467,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 24, + "ny_offset": 25, "month_has_30_days": [ true, false, @@ -4486,7 +4486,7 @@ "leap_month_idx": null }, { - "ny_offset": 13, + "ny_offset": 14, "month_has_30_days": [ true, false, @@ -4505,7 +4505,7 @@ "leap_month_idx": null }, { - "ny_offset": 2, + "ny_offset": 3, "month_has_30_days": [ false, true, @@ -4524,7 +4524,7 @@ "leap_month_idx": 3 }, { - "ny_offset": 21, + "ny_offset": 22, "month_has_30_days": [ false, true, @@ -4543,7 +4543,7 @@ "leap_month_idx": null }, { - "ny_offset": 10, + "ny_offset": 11, "month_has_30_days": [ true, false, @@ -4562,7 +4562,7 @@ "leap_month_idx": 8 }, { - "ny_offset": 29, + "ny_offset": 30, "month_has_30_days": [ true, false, @@ -4581,7 +4581,7 @@ "leap_month_idx": null }, { - "ny_offset": 18, + "ny_offset": 19, "month_has_30_days": [ false, true, @@ -4600,7 +4600,7 @@ "leap_month_idx": null }, { - "ny_offset": 7, + "ny_offset": 8, "month_has_30_days": [ true, false, @@ -4619,7 +4619,7 @@ "leap_month_idx": 6 }, { - "ny_offset": 26, + "ny_offset": 27, "month_has_30_days": [ false, true, @@ -4638,7 +4638,7 @@ "leap_month_idx": null }, { - "ny_offset": 15, + "ny_offset": 16, "month_has_30_days": [ false, true, @@ -4657,7 +4657,7 @@ "leap_month_idx": null }, { - "ny_offset": 3, + "ny_offset": 4, "month_has_30_days": [ true, false, @@ -4676,7 +4676,7 @@ "leap_month_idx": 5 }, { - "ny_offset": 22, + "ny_offset": 23, "month_has_30_days": [ true, false, @@ -4695,7 +4695,7 @@ "leap_month_idx": null }, { - "ny_offset": 12, + "ny_offset": 13, "month_has_30_days": [ false, true, @@ -4714,7 +4714,7 @@ "leap_month_idx": 12 }, { - "ny_offset": 31, + "ny_offset": 32, "month_has_30_days": [ false, true, @@ -4733,7 +4733,7 @@ "leap_month_idx": null }, { - "ny_offset": 19, + "ny_offset": 20, "month_has_30_days": [ true, false, diff --git a/provider/datagen/tests/data/json/calendar/islamicobservationalcache@1/und.json b/provider/datagen/tests/data/json/calendar/islamicobservationalcache@1/und.json index 111d8e815a3..c320c8e87d0 100644 --- a/provider/datagen/tests/data/json/calendar/islamicobservationalcache@1/und.json +++ b/provider/datagen/tests/data/json/calendar/islamicobservationalcache@1/und.json @@ -370,7 +370,7 @@ 6 ], [ - 165, + 167, 12 ], [ diff --git a/provider/datagen/tests/data/postcard/fingerprints.csv b/provider/datagen/tests/data/postcard/fingerprints.csv index 42979f8cbbf..d89ffef9cfd 100644 --- a/provider/datagen/tests/data/postcard/fingerprints.csv +++ b/provider/datagen/tests/data/postcard/fingerprints.csv @@ -1,6 +1,6 @@ -calendar/chinesecache@1, und, 754B, c116ab2a7479b26d -calendar/dangicache@1, und, 754B, d7565838cc8c6aa6 -calendar/islamicobservationalcache@1, und, 504B, 31c8968bfd922ede +calendar/chinesecache@1, und, 754B, 134f5ec7c9bdc494 +calendar/dangicache@1, und, 754B, 79d5d32449956411 +calendar/islamicobservationalcache@1, und, 504B, 18af87d272c76f14 calendar/islamicummalquracache@1, und, 504B, ef6ac9ff14fd3f3 calendar/japanese@1, und, 111B, b31e52deaf52706f calendar/japanext@1, und, 5216B, 6c20e216c8cd6e41 diff --git a/utils/calendrical_calculations/Cargo.toml b/utils/calendrical_calculations/Cargo.toml index 2da8ce53bc7..33ae9e001c4 100644 --- a/utils/calendrical_calculations/Cargo.toml +++ b/utils/calendrical_calculations/Cargo.toml @@ -34,8 +34,10 @@ all-features = true [dependencies] core_maths = { workspace = true } displaydoc = { workspace = true } +log = { workspace = true, optional = true } [features] +logging = ["dep:log"] std = [] [package.metadata.cargo-all-features] diff --git a/utils/calendrical_calculations/src/astronomy.rs b/utils/calendrical_calculations/src/astronomy.rs index 828dbcbcc28..f6566550c51 100644 --- a/utils/calendrical_calculations/src/astronomy.rs +++ b/utils/calendrical_calculations/src/astronomy.rs @@ -234,6 +234,7 @@ impl Astronomical { pub fn ephemeris_correction(moment: Moment) -> f64 { // TODO: Change this to directly convert from moment to Gregorian year through a separate fn let year = moment.inner() / 365.2425; + // Note: Converting to int handles negative number Euclidean division skew. let year_int = (if year > 0.0 { year + 1.0 } else { year }) as i32; let fixed_mid_year = crate::iso::fixed_from_iso(year_int, 7, 1); let c = ((fixed_mid_year.to_i64_date() as f64) - 693596.0) / 36525.0; diff --git a/utils/calendrical_calculations/src/chinese_based.rs b/utils/calendrical_calculations/src/chinese_based.rs index 36fc15408f1..cf39e76ba90 100644 --- a/utils/calendrical_calculations/src/chinese_based.rs +++ b/utils/calendrical_calculations/src/chinese_based.rs @@ -1,5 +1,6 @@ use crate::astronomy::{self, Astronomical, Location, MEAN_SYNODIC_MONTH, MEAN_TROPICAL_YEAR}; use crate::helpers::i64_to_i32; +use crate::iso::{fixed_from_iso, iso_from_fixed}; use crate::rata_die::{Moment, RataDie}; use core::num::NonZeroU8; #[allow(unused_imports)] @@ -28,8 +29,11 @@ pub trait ChineseBased { /// The ISO year that corresponds to year 1 const EPOCH_ISO: i32; - /// Given an ISO year, return the extended year + /// The name of the calendar for debugging. + const DEBUG_NAME: &'static str; + + /// Given an ISO year, return the extended year fn extended_from_iso(iso_year: i32) -> i32 { iso_year - Self::EPOCH_ISO + 1 } @@ -137,6 +141,7 @@ impl ChineseBased for Chinese { const EPOCH: RataDie = CHINESE_EPOCH; const EPOCH_ISO: i32 = CHINESE_EPOCH_ISO; + const DEBUG_NAME: &'static str = "chinese"; } impl ChineseBased for Dangi { @@ -156,6 +161,7 @@ impl ChineseBased for Dangi { const EPOCH: RataDie = KOREAN_EPOCH; const EPOCH_ISO: i32 = KOREAN_EPOCH_ISO; + const DEBUG_NAME: &'static str = "dangi"; } /// Marks the bounds of a lunar year @@ -261,10 +267,17 @@ pub(crate) fn midnight(moment: Moment) -> Moment { pub(crate) fn new_year_in_sui(prior_solstice: RataDie) -> (RataDie, RataDie) { // s1 is prior_solstice // Using 370 here since solstices are ~365 days apart - let following_solstice = winter_solstice_on_or_before::(prior_solstice + 370); // s2 + // Both solstices should fall on December 20, 21, 22, or 23. The calendrical calculations + // drift away from this for large positive and negative years, so we artifically bind them + // to this range in order for other code invariants to be upheld. + let prior_solstice = bind_winter_solstice::(prior_solstice); + let following_solstice = + bind_winter_solstice::(winter_solstice_on_or_before::(prior_solstice + 370)); // s2 let month_after_eleventh = new_moon_on_or_after::((prior_solstice + 1).as_moment()); // m12 + debug_assert!(month_after_eleventh - prior_solstice >= 0); let month_after_twelfth = new_moon_on_or_after::((month_after_eleventh + 1).as_moment()); // m13 let month_after_thirteenth = new_moon_on_or_after::((month_after_twelfth + 1).as_moment()); + debug_assert!(month_after_twelfth - month_after_eleventh >= 29); let next_eleventh_month = new_moon_before::((following_solstice + 1).as_moment()); // next-m11 let lhs_argument = ((next_eleventh_month - month_after_eleventh) as f64 / MEAN_SYNODIC_MONTH).round() as i64; @@ -278,7 +291,45 @@ pub(crate) fn new_year_in_sui(prior_solstice: RataDie) -> (Rata } } -/// Get the moment of the nearest winter solstice on or before a given fixed date +/// This function forces the RataDie to be on December 20, 21, 22, or 23. It was +/// created for practical considerations and is not in the text. +/// +/// See: +fn bind_winter_solstice(solstice: RataDie) -> RataDie { + let (iso_year, iso_month, iso_day) = match iso_from_fixed(solstice) { + Ok(ymd) => ymd, + Err(_) => { + debug_assert!(false, "Solstice REALLY out of bounds: {solstice:?}"); + return solstice; + } + }; + let resolved_solstice = if iso_month < 12 || iso_day < 20 { + fixed_from_iso(iso_year, 12, 20) + } else if iso_day > 23 { + fixed_from_iso(iso_year, 12, 23) + } else { + solstice + }; + if resolved_solstice != solstice { + if !(0..=4000).contains(&iso_year) { + #[cfg(feature = "logging")] + log::trace!("({}) Solstice out of bounds: {solstice:?}", C::DEBUG_NAME); + } else { + debug_assert!( + false, + "({}) Solstice out of bounds: {solstice:?}", + C::DEBUG_NAME + ); + } + } + resolved_solstice +} + +/// Get the fixed date of the nearest winter solstice, in the Chinese time zone, +/// on or before a given fixed date. +/// +/// This is valid for several thousand years, but it drifts for large positive +/// and negative years. See [`bind_winter_solstice`]. /// /// Based on functions from _Calendrical Calculations_ by Reingold & Dershowitz. /// Lisp reference code: https://github.com/EdReingold/calendar-code2/blob/main/calendar.l#L5359-L5368 diff --git a/utils/calendrical_calculations/src/hebrew_keviyah.rs b/utils/calendrical_calculations/src/hebrew_keviyah.rs index db6a97ec53c..5fab889d23e 100644 --- a/utils/calendrical_calculations/src/hebrew_keviyah.rs +++ b/utils/calendrical_calculations/src/hebrew_keviyah.rs @@ -124,7 +124,7 @@ fn months_preceding_molad(h_year: i32) -> i64 { // This math essentially comes from the Metonic cycle of 19 years containing // 235 months: 12 months per year, plus an extra month for each of the 7 leap years. - (235 * (i64::from(h_year) - 1) + 1) / 19 + (235 * (i64::from(h_year) - 1) + 1).div_euclid(19) } /// Conveniently create a constant for a Ḽalakim (by default in 1-indexed notation). Produces a constant @@ -180,7 +180,7 @@ const HEBREW_CALENDAR_EPOCH: RataDie = crate::julian::fixed_from_julian_book_ver pub const HEBREW_MIN_YEAR: i32 = i32::MIN; /// The minumum R.D. supported by this code (this code will clamp outside of it) // (this constant is verified by tests) -pub const HEBREW_MIN_RD: RataDie = RataDie::new(-784362951949); +pub const HEBREW_MIN_RD: RataDie = RataDie::new(-784362951979); /// The maximum hebrew year supported by this code (this is the maximum alue for i32) // (this constant is verified by tests) pub const HEBREW_MAX_YEAR: i32 = i32::MAX; @@ -256,9 +256,6 @@ impl YearInfo { let days_since_epoch = (date - HEBREW_CALENDAR_EPOCH) as f64; let maybe_approx = i64_to_i32(1 + days_since_epoch.div_euclid(HEBREW_APPROX_YEAR_LENGTH) as i64); - debug_assert!(maybe_approx.is_ok(), - "year_containing_rd should have clamped {date:?} between {HEBREW_MIN_RD:?} and {HEBREW_MAX_RD:?} \ - and thus be well in bounds for year calculation math"); let approx = maybe_approx.unwrap_or_else(|e| e.saturate()); let yi = Self::compute_for(approx); @@ -1027,4 +1024,19 @@ mod test { assert_eq!(recomputed_y, HEBREW_MAX_YEAR); assert_eq!(recomputed_yi, max); } + + #[test] + fn test_leap_agreement() { + for year0 in -1000..1000 { + let year1 = year0 + 1; + let info0 = YearInfo::compute_for(year0); + let info1 = YearInfo::compute_for(year1); + let num_months = (info1.new_year() - info0.new_year()) / 29; + if info0.keviyah.is_leap() { + assert_eq!(num_months, 13, "{year0}"); + } else { + assert_eq!(num_months, 12, "{year0}"); + } + } + } } diff --git a/utils/calendrical_calculations/src/islamic.rs b/utils/calendrical_calculations/src/islamic.rs index 515f8e98899..3077adec732 100644 --- a/utils/calendrical_calculations/src/islamic.rs +++ b/utils/calendrical_calculations/src/islamic.rs @@ -21,6 +21,11 @@ const CAIRO: Location = Location { pub trait IslamicBasedMarker { /// The epoch of the calendar. Different calendars use a different epoch (Thu or Fri) due to disagreement on the exact date of Mohammed's migration to Mecca. const EPOCH: RataDie; + /// The name of the calendar for debugging. + const DEBUG_NAME: &'static str; + /// Whether this calendar is known to have 353-day years. + /// This is probably a bug; see + const HAS_353_DAY_YEARS: bool; /// Given the extended year, calculate the approximate new year using the mean synodic month fn mean_synodic_ny(extended_year: i32) -> RataDie { Self::EPOCH + (f64::from((extended_year - 1) * 12) * MEAN_SYNODIC_MONTH).floor() as i64 @@ -39,33 +44,74 @@ pub trait IslamicBasedMarker { /// Given an extended year, calculate whether each month is 29 or 30 days long fn month_lengths_for_year(extended_year: i32, ny: RataDie) -> [bool; 12] { + let next_ny = Self::fixed_from_islamic(extended_year + 1, 1, 1); + match next_ny - ny { + 355 | 354 => (), + 353 if Self::HAS_353_DAY_YEARS => { + #[cfg(feature = "logging")] + log::trace!( + "({}) Found year {extended_year} AH with length {}. See ", + Self::DEBUG_NAME, + next_ny - ny + ); + } + other => { + debug_assert!( + false, + "({}) Found year {extended_year} AH with length {}!", + Self::DEBUG_NAME, + other + ) + } + } let mut prev_rd = ny; - let mut lengths = [false; 12]; - - for month_idx in 0..11 { - let new_rd = Self::fixed_from_islamic(extended_year, month_idx + 2, 1); + let mut excess_days = 0; + let mut lengths = core::array::from_fn(|month_idx| { + let month_idx = month_idx as u8; + let new_rd = if month_idx < 11 { + Self::fixed_from_islamic(extended_year, month_idx + 2, 1) + } else { + next_ny + }; let diff = new_rd - prev_rd; - debug_assert!( - // TODO: year 1409 has a 31-length month 1 - diff == 29 || diff == 30 || diff == 31, - "Found extended year {extended_year} with month length {diff} for month {}", - month_idx + 1 - ); - if new_rd - prev_rd >= 30 { - if let Some(l) = lengths.get_mut(usize::from(month_idx)) { - *l = true; + prev_rd = new_rd; + match diff { + 29 => false, + 30 => true, + 31 => { + #[cfg(feature = "logging")] + log::trace!( + "({}) Found year {extended_year} AH with month length {diff} for month {}.", + Self::DEBUG_NAME, + month_idx + 1 + ); + excess_days += 1; + true + } + _ => { + debug_assert!( + false, + "({}) Found year {extended_year} AH with month length {diff} for month {}!", + Self::DEBUG_NAME, + month_idx + 1 + ); + false } } - prev_rd = new_rd - } - let new_rd = Self::fixed_from_islamic(extended_year + 1, 1, 1); - let diff = new_rd - prev_rd; - debug_assert!( - diff == 29 || diff == 30, - "Found extended year {extended_year} with month length {diff} for month 12" - ); - if new_rd - prev_rd == 30 { - lengths[11] = true; + }); + // To maintain invariants for calendar arithmetic, if astronomy finds + // a 31-day month, "move" the day to the first 29-day month in the + // same year to maintain all months at 29 or 30 days. + if excess_days != 0 { + debug_assert_eq!( + excess_days, + 1, + "({}) Found year {extended_year} AH with more than one excess day!", + Self::DEBUG_NAME + ); + if let Some(l) = lengths.iter_mut().find(|l| !(**l)) { + *l = true; + } } lengths } @@ -93,6 +139,8 @@ pub struct TabularIslamicMarker; impl IslamicBasedMarker for ObservationalIslamicMarker { const EPOCH: RataDie = FIXED_ISLAMIC_EPOCH_FRIDAY; + const DEBUG_NAME: &'static str = "ObservationalIslamic"; + const HAS_353_DAY_YEARS: bool = true; fn fixed_from_islamic(year: i32, month: u8, day: u8) -> RataDie { fixed_from_islamic_observational(year, month, day) } @@ -103,6 +151,8 @@ impl IslamicBasedMarker for ObservationalIslamicMarker { impl IslamicBasedMarker for SaudiIslamicMarker { const EPOCH: RataDie = FIXED_ISLAMIC_EPOCH_FRIDAY; + const DEBUG_NAME: &'static str = "SaudiIslamic"; + const HAS_353_DAY_YEARS: bool = true; fn fixed_from_islamic(year: i32, month: u8, day: u8) -> RataDie { fixed_from_saudi_islamic(year, month, day) } @@ -113,6 +163,8 @@ impl IslamicBasedMarker for SaudiIslamicMarker { impl IslamicBasedMarker for CivilIslamicMarker { const EPOCH: RataDie = FIXED_ISLAMIC_EPOCH_FRIDAY; + const DEBUG_NAME: &'static str = "CivilIslamic"; + const HAS_353_DAY_YEARS: bool = false; fn fixed_from_islamic(year: i32, month: u8, day: u8) -> RataDie { fixed_from_islamic_civil(year, month, day) } @@ -123,6 +175,8 @@ impl IslamicBasedMarker for CivilIslamicMarker { impl IslamicBasedMarker for TabularIslamicMarker { const EPOCH: RataDie = FIXED_ISLAMIC_EPOCH_THURSDAY; + const DEBUG_NAME: &'static str = "TabularIslamic"; + const HAS_353_DAY_YEARS: bool = false; fn fixed_from_islamic(year: i32, month: u8, day: u8) -> RataDie { fixed_from_islamic_tabular(year, month, day) }