Skip to content

Commit

Permalink
fix bug in naivedatetime_from_mwd and improve regression test
Browse files Browse the repository at this point in the history
  • Loading branch information
esheppa committed Apr 9, 2022
1 parent 7025cd5 commit e885884
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 77 deletions.
16 changes: 8 additions & 8 deletions src/offset/local.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ mod tz_localtime {
// also its not clear whether the given `local` includes or doesn't include leap seconds?
// get the last transition time
let last = tz.as_ref().transitions().last();

// if there is no transitions, or if we are later than the last transition,
// then we must try to use the extra rule(s)
if last
Expand All @@ -127,8 +126,9 @@ mod tz_localtime {
timezone::RuleDay::MonthWeekDay(start @ timezone::MonthWeekDay { .. }),
timezone::RuleDay::MonthWeekDay(end @ timezone::MonthWeekDay { .. }),
) => {
let start = naivedatetime_from_mwd(local, start, alt.dst_start_time());
let end = naivedatetime_from_mwd(local, end, alt.dst_end_time());
let start =
naivedatetime_from_mwd(local.year(), start, alt.dst_start_time());
let end = naivedatetime_from_mwd(local.year(), end, alt.dst_end_time());

use std::cmp::Ordering;
match start.cmp(&end) {
Expand Down Expand Up @@ -250,13 +250,13 @@ mod tz_localtime {
}

fn naivedatetime_from_mwd(
local: NaiveDateTime,
local_year: i32,
mwd: &timezone::MonthWeekDay,
start_time: i32,
) -> NaiveDateTime {
naive_date_from_mwd_parts(
local.year(),
local.month(),
local_year,
mwd.month().into(),
mwd.week().into(),
mwd.week_day().into(),
)
Expand Down Expand Up @@ -540,7 +540,7 @@ mod tests {

#[test]
fn verify_correct_offsets_distant_past() {
let distant_past = Local::now() - Duration::days(365 * 10000);
let distant_past = Local::now() - Duration::days(365 * 100);
let from_local = Local.from_local_datetime(&distant_past.naive_local()).unwrap();
let from_utc = Local.from_utc_datetime(&distant_past.naive_utc());
assert_eq!(distant_past.offset().local_minus_utc(), from_local.offset().local_minus_utc());
Expand All @@ -552,7 +552,7 @@ mod tests {

#[test]
fn verify_correct_offsets_distant_future() {
let distant_future = Local::now() + Duration::days(365 * 10000);
let distant_future = Local::now() + Duration::days(365 * 100);
let from_local = Local.from_local_datetime(&distant_future.naive_local()).unwrap();
let from_utc = Local.from_utc_datetime(&distant_future.naive_utc());
assert_eq!(
Expand Down
91 changes: 22 additions & 69 deletions tests/regression.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,81 +3,34 @@ mod test {

#[test]
fn verify_regression() {
let current_utc = chrono::Utc::now();
let current_utc_base = chrono::Utc::now();

let old_utc = old_chrono::DateTime::parse_from_rfc3339(&current_utc.to_rfc3339()).unwrap();
for diff in (-400000..400000).filter(|d| d % 25 == 0) {
let current_utc = current_utc_base + chrono::Duration::days(diff);

assert_eq!(current_utc.timestamp_millis(), old_utc.timestamp_millis());
let old_utc =
old_chrono::DateTime::parse_from_rfc3339(&current_utc.to_rfc3339()).unwrap();

let old_from_utc: old_chrono::DateTime<old_chrono::Local> =
old_chrono::TimeZone::from_utc_datetime(&old_chrono::Local, &old_utc.naive_local());
let current_from_utc: chrono::DateTime<chrono::Local> =
chrono::TimeZone::from_utc_datetime(&chrono::Local, &current_utc.naive_local());
assert_eq!(current_utc.timestamp_millis(), old_utc.timestamp_millis());

assert_eq!(current_from_utc.timestamp_millis(), old_from_utc.timestamp_millis());
let old_from_utc: old_chrono::DateTime<old_chrono::Local> =
old_chrono::TimeZone::from_utc_datetime(&old_chrono::Local, &old_utc.naive_local());
let current_from_utc: chrono::DateTime<chrono::Local> =
chrono::TimeZone::from_utc_datetime(&chrono::Local, &current_utc.naive_local());

let old_from_local: old_chrono::DateTime<old_chrono::Local> =
old_chrono::TimeZone::from_local_datetime(&old_chrono::Local, &old_utc.naive_local())
.unwrap();
let current_from_local: chrono::DateTime<chrono::Local> =
chrono::TimeZone::from_local_datetime(&chrono::Local, &current_utc.naive_local())
assert_eq!(current_from_utc.timestamp_millis(), old_from_utc.timestamp_millis());

let old_from_local: old_chrono::DateTime<old_chrono::Local> =
old_chrono::TimeZone::from_local_datetime(
&old_chrono::Local,
&old_utc.naive_local(),
)
.unwrap();
let current_from_local: chrono::DateTime<chrono::Local> =
chrono::TimeZone::from_local_datetime(&chrono::Local, &current_utc.naive_local())
.unwrap();

assert_eq!(current_from_local.timestamp_millis(), old_from_local.timestamp_millis());
assert_eq!(current_from_local.timestamp_millis(), old_from_local.timestamp_millis());
}
}

// #[test]
// fn verify_regression_distant_future() {
// let distant_future_utc = chrono::Utc::now() + chrono::Duration::days(365 * 1000);

// let old_utc =
// old_chrono::DateTime::parse_from_rfc3339(&distant_future_utc.to_rfc3339()).unwrap();

// assert_eq!(distant_future_utc.timestamp_millis(), old_utc.timestamp_millis());

// let old_from_utc: old_chrono::DateTime<old_chrono::Local> =
// old_chrono::TimeZone::from_utc_datetime(&old_chrono::Local, &old_utc.naive_local());
// let current_from_utc: chrono::DateTime<chrono::Local> =
// chrono::TimeZone::from_utc_datetime(&chrono::Local, &distant_future_utc.naive_local());

// assert_eq!(current_from_utc.timestamp_millis(), old_from_utc.timestamp_millis());

// let old_from_local: old_chrono::DateTime<old_chrono::Local> =
// old_chrono::TimeZone::from_local_datetime(&old_chrono::Local, &old_utc.naive_local())
// .unwrap();
// let current_from_local: chrono::DateTime<chrono::Local> =
// chrono::TimeZone::from_local_datetime(
// &chrono::Local,
// &distant_future_utc.naive_local(),
// )
// .unwrap();

// assert_eq!(current_from_local.timestamp_millis(), old_from_local.timestamp_millis());
// }

// #[test]
// fn verify_regression_distant_past() {
// let distant_past_utc = chrono::Utc::now() - chrono::Duration::days(365 * 1000);

// let old_utc =
// old_chrono::DateTime::parse_from_rfc3339(&distant_past_utc.to_rfc3339()).unwrap();

// assert_eq!(distant_past_utc.timestamp_millis(), old_utc.timestamp_millis());

// let old_from_utc: old_chrono::DateTime<old_chrono::Local> =
// old_chrono::TimeZone::from_utc_datetime(&old_chrono::Local, &old_utc.naive_local());
// let current_from_utc: chrono::DateTime<chrono::Local> =
// chrono::TimeZone::from_utc_datetime(&chrono::Local, &distant_past_utc.naive_local());

// assert_eq!(current_from_utc.timestamp_millis(), old_from_utc.timestamp_millis());

// let old_from_local: old_chrono::DateTime<old_chrono::Local> =
// old_chrono::TimeZone::from_local_datetime(&old_chrono::Local, &old_utc.naive_local())
// .unwrap();
// let current_from_local: chrono::DateTime<chrono::Local> =
// chrono::TimeZone::from_local_datetime(&chrono::Local, &distant_past_utc.naive_local())
// .unwrap();

// assert_eq!(current_from_local.timestamp_millis(), old_from_local.timestamp_millis());
// }
}

0 comments on commit e885884

Please sign in to comment.