diff --git a/api/src/interface/date/mod.rs b/api/src/interface/date/mod.rs index c41bb74..4ed92af 100644 --- a/api/src/interface/date/mod.rs +++ b/api/src/interface/date/mod.rs @@ -118,8 +118,10 @@ impl Date { if !timezone_in_unix_time { let timezone_seconds: u128 = timezone.to_seconds() as u128; - if unix_time < timezone_seconds && timezone.sign == Sign::Signed { - panic!("[ERROR]: Overflow, signed timezone override unix_time!") + if unix_time < timezone_seconds { + panic!("[OVERFLOW]: Overflow type, unix time - time zone < zero!") + } else if unix_time > u128::MAX - timezone_seconds { + panic!("[OVERFLOW]: Overflow type, unix time + time zone > type!") } if timezone.sign == Sign::Signed { diff --git a/api/src/interface/time/mod.rs b/api/src/interface/time/mod.rs index ee21f8a..f4cf735 100644 --- a/api/src/interface/time/mod.rs +++ b/api/src/interface/time/mod.rs @@ -101,8 +101,10 @@ impl Time { if !timezone_in_unix_time { let timezone_seconds: u128 = timezone.to_seconds() as u128; - if unix_time < timezone_seconds && timezone.sign == Sign::Signed { - panic!("[ERROR]: Overflow, signed timezone override unix_time!") + if unix_time < timezone_seconds { + panic!("[OVERFLOW]: Overflow type, unix time - time zone < zero!") + } else if unix_time > u128::MAX - timezone_seconds { + panic!("[OVERFLOW]: Overflow type, unix time + time zone > type!") } if timezone.sign == Sign::Signed { diff --git a/api/src/types/planets/earth/calendar/traits/converter/gregorian.rs b/api/src/types/planets/earth/calendar/traits/converter/gregorian.rs index 4b9c45a..afa0377 100644 --- a/api/src/types/planets/earth/calendar/traits/converter/gregorian.rs +++ b/api/src/types/planets/earth/calendar/traits/converter/gregorian.rs @@ -96,15 +96,84 @@ mod tests { }; use crate::{ - Months, + Sign, Zone, Months, Solar, Julian, Gregorian, functions::{ is_leap_year } }; + use crate::types::{ + counter::{ + unix_time::{ + constants::{ + year::{UNIX_EPOCH_GREGORIAN_START_YEAR} + } + } + }, + }; + + #[test] + fn test_between_date_conversion_to_gregorian() { + let mut date: Date = Date::default(); + + let timezone: Zone = Zone { sign: Sign::Signed, hours: 13_u8, minutes: 20_u8, seconds: 25_u8 }; + + let max_year_to_test: u64 = 10_000_u64; + + for year in 1_u64..=max_year_to_test { + for month in [ + Months::January, Months::February, Months::March, Months::April, Months::May, Months::June, + Months::July, Months::August, Months::September, Months::October, Months::November, Months::December + ] { + for day in 1_u8..=month.days(is_leap_year(CalendarView::Gregorian, year)) { + if timezone.sign == Sign::Signed { + let tz_seconds: u128 = timezone.to_seconds() as u128; + + (date.day, date.month, date.year, date.view) = (day, month.index(), year, CalendarView::Gregorian); + ::to_date(&mut date, true); + + if month.index() == Months::January.index() { + if year == UNIX_EPOCH_GREGORIAN_START_YEAR as u64 { + if date.unix_time < tz_seconds { + continue; + } + } + } + } else if timezone.sign == Sign::Unsigned { + let tz_seconds: u128 = timezone.to_seconds() as u128; + + (date.day, date.month, date.year, date.view) = (day, month.index(), year, CalendarView::Gregorian); + ::to_date(&mut date, true); + + if date.unix_time > u128::MAX - tz_seconds { + continue; + } + } + + (date.day, date.month, date.year, date.timezone, date.view) = (day, month.index(), year, timezone, CalendarView::Gregorian); + ::to_date(&mut date, false); + + let (day_tz, month_tz, year_tz, unix_time): (u8, u8, u64, u128) = (date.day, date.month, date.year, date.unix_time); + + ::to_date(&mut date, true); + + ::to_date(&mut date, true); + assert_eq!((date.day, date.month, date.year, date.timezone, date.unix_time, date.view), (day_tz, month_tz, year_tz, timezone, unix_time, CalendarView::Gregorian)); + + if !(1_u128..=JULIAN_BCE_DAYS_FIRST_YEAR).contains(&(day as u128)) || month.index() != Months::January.index() || year != 1 { + ::to_date(&mut date, true); + + ::to_date(&mut date, true); + assert_eq!((date.day, date.month, date.year, date.timezone, date.unix_time, date.view), (day_tz, month_tz, year_tz, timezone, unix_time, CalendarView::Gregorian)); + } + } + } + } + } + #[test] - fn test_between_presentation_conversion() { + fn test_between_presentation_conversion_to_gregorian() { let mut date: Date = Date::default(); let max_year_to_test: u64 = 10_000_u64; diff --git a/api/src/types/planets/earth/calendar/traits/converter/julian.rs b/api/src/types/planets/earth/calendar/traits/converter/julian.rs index 6424a0c..74c9117 100644 --- a/api/src/types/planets/earth/calendar/traits/converter/julian.rs +++ b/api/src/types/planets/earth/calendar/traits/converter/julian.rs @@ -111,15 +111,85 @@ mod tests { }; use crate::{ - Months, + Sign, Zone, Months, Solar, Julian, Gregorian, functions::{ is_leap_year - } + }, + }; + + use crate::types::{ + counter::{ + unix_time::{ + constants::{ + year::{UNIX_EPOCH_JULIAN_START_YEAR} + } + } + }, }; #[test] - fn test_between_presentation_conversion() { + fn test_between_date_conversion_to_julian() { + let mut date: Date = Date::default(); + + let timezone: Zone = Zone { sign: Sign::Signed, hours: 12_u8, minutes: 30_u8, seconds: 10_u8 }; + + let max_year_to_test: u64 = 10_000_u64; + + for year in 1_u64..=max_year_to_test { + for month in [ + Months::January, Months::February, Months::March, Months::April, Months::May, Months::June, + Months::July, Months::August, Months::September, Months::October, Months::November, Months::December + ] { + for day in 1_u8..=month.days(is_leap_year(CalendarView::Julian, year)) { + if !(1_u128..=JULIAN_BCE_DAYS_FIRST_YEAR).contains(&(day as u128)) || month.index() != Months::January.index() || year != 1 { + + if timezone.sign == Sign::Signed { + let tz_seconds: u128 = timezone.to_seconds() as u128; + + (date.day, date.month, date.year, date.view) = (day, month.index(), year, CalendarView::Julian); + ::to_date(&mut date, true); + + if month.index() == Months::December.index() { + if year == UNIX_EPOCH_JULIAN_START_YEAR as u64 { + if date.unix_time < tz_seconds { + continue; + } + } + } + } else if timezone.sign == Sign::Unsigned { + let tz_seconds: u128 = timezone.to_seconds() as u128; + + (date.day, date.month, date.year, date.view) = (day, month.index(), year, CalendarView::Julian); + ::to_date(&mut date, true); + + if date.unix_time > u128::MAX - tz_seconds { + continue; + } + } + + (date.day, date.month, date.year, date.timezone, date.view) = (day, month.index(), year, timezone, CalendarView::Julian); + ::to_date(&mut date, false); + + let (day_tz, month_tz, year_tz, unix_time): (u8, u8, u64, u128) = (date.day, date.month, date.year, date.unix_time); + + ::to_date(&mut date, true); + + ::to_date(&mut date, true); + assert_eq!((date.day, date.month, date.year, date.timezone, date.unix_time, date.view), (day_tz, month_tz, year_tz, timezone, unix_time, CalendarView::Julian)); + + ::to_date(&mut date, true); + + ::to_date(&mut date, true); + assert_eq!((date.day, date.month, date.year, date.timezone, date.unix_time, date.view), (day_tz, month_tz, year_tz, timezone, unix_time, CalendarView::Julian)); + } + } + } + } + } + + #[test] + fn test_between_presentation_conversion_to_julian() { let mut date: Date = Date::default(); let max_year_to_test: u64 = 10_000_u64; diff --git a/api/src/types/planets/earth/calendar/traits/converter/solar.rs b/api/src/types/planets/earth/calendar/traits/converter/solar.rs index f294e76..e8821ab 100644 --- a/api/src/types/planets/earth/calendar/traits/converter/solar.rs +++ b/api/src/types/planets/earth/calendar/traits/converter/solar.rs @@ -96,15 +96,84 @@ mod tests { }; use crate::{ - Months, + Sign, Zone, Months, Solar, Julian, Gregorian, functions::{ is_leap_year } }; + use crate::types::{ + counter::{ + unix_time::{ + constants::{ + year::{UNIX_EPOCH_SOLAR_START_YEAR} + } + } + }, + }; + + #[test] + fn test_between_date_conversion_to_solar() { + let mut date: Date = Date::default(); + + let timezone: Zone = Zone { sign: Sign::Signed, hours: 0_u8, minutes: 20_u8, seconds: 55_u8 }; + + let max_year_to_test: u64 = 10_000_u64; + + for year in 1_u64..=max_year_to_test { + for month in [ + Months::January, Months::February, Months::March, Months::April, Months::May, Months::June, + Months::July, Months::August, Months::September, Months::October, Months::November, Months::December + ] { + for day in 1_u8..=month.days(is_leap_year(CalendarView::Solar, year)) { + if timezone.sign == Sign::Signed { + let tz_seconds: u128 = timezone.to_seconds() as u128; + + (date.day, date.month, date.year, date.view) = (day, month.index(), year, CalendarView::Solar); + ::to_date(&mut date, true); + + if month.index() == Months::January.index() { + if year == UNIX_EPOCH_SOLAR_START_YEAR as u64 { + if date.unix_time < tz_seconds { + continue; + } + } + } + } else if timezone.sign == Sign::Unsigned { + let tz_seconds: u128 = timezone.to_seconds() as u128; + + (date.day, date.month, date.year, date.view) = (day, month.index(), year, CalendarView::Solar); + ::to_date(&mut date, true); + + if date.unix_time > u128::MAX - tz_seconds { + continue; + } + } + + (date.day, date.month, date.year, date.timezone, date.view) = (day, month.index(), year, timezone, CalendarView::Solar); + ::to_date(&mut date, false); + + let (day_tz, month_tz, year_tz, unix_time): (u8, u8, u64, u128) = (date.day, date.month, date.year, date.unix_time); + + if !(1_u128..=JULIAN_BCE_DAYS_FIRST_YEAR).contains(&(day as u128)) || month.index() != Months::January.index() || year != 1 { + ::to_date(&mut date, true); + + ::to_date(&mut date, true); + assert_eq!((date.day, date.month, date.year, date.timezone, date.unix_time, date.view), (day_tz, month_tz, year_tz, timezone, unix_time, CalendarView::Solar)); + } + + ::to_date(&mut date, true); + + ::to_date(&mut date, true); + assert_eq!((date.day, date.month, date.year, date.timezone, date.unix_time, date.view), (day_tz, month_tz, year_tz, timezone, unix_time, CalendarView::Solar)); + } + } + } + } + #[test] - fn test_between_presentation_conversion() { + fn test_between_presentation_conversion_to_solar() { let mut date: Date = Date::default(); let max_year_to_test: u64 = 10_000_u64; diff --git a/api/src/types/planets/earth/calendar/traits/converter/tz.rs b/api/src/types/planets/earth/calendar/traits/converter/tz.rs index 5ca0b3b..3b42c46 100644 --- a/api/src/types/planets/earth/calendar/traits/converter/tz.rs +++ b/api/src/types/planets/earth/calendar/traits/converter/tz.rs @@ -44,7 +44,7 @@ use crate::types::{ pub fn zone_recalc(timezone: Zone, unix_time: &mut u128, day_seconds: u128, era_days: &mut u128) { let tz_sec: u128 = timezone.to_seconds() as u128; if timezone.sign == Sign::Signed && *unix_time < tz_sec { - panic!("[ERROR]: Overflow, signed timezone override self.unix_time!!") + panic!("[OVERFLOW]: Signed timezone overflow unix_time or also can be that unix time in selected calendar system start from another date!") } else { if timezone.sign == Sign::Signed && tz_sec > 0 { if day_seconds >= tz_sec {