Update chrono

This commit is contained in:
Joscha 2023-02-11 22:12:58 +01:00
parent 64c41b1073
commit 4529f383fe
9 changed files with 409 additions and 395 deletions

View file

@ -35,8 +35,8 @@ impl CommandState<'_> {
assert_eq!(spec.date.month(), 2);
assert_eq!(spec.date.day(), 29);
let first = NaiveDate::from_ymd(year, 2, 28);
let second = NaiveDate::from_ymd(year, 3, 1);
let first = NaiveDate::from_ymd_opt(year, 2, 28).unwrap();
let second = NaiveDate::from_ymd_opt(year, 3, 1).unwrap();
self.add(self.entry_with_remind(kind, Some(Dates::new(first, second)))?);
}
}

View file

@ -85,7 +85,7 @@ impl DateSpec {
let range_from = s
.command
.last_done_root()
.map(|date| date.succ())
.map(|date| date.succ_opt().unwrap())
.unwrap_or(self.start);
let range = s
.range_with_remind()

View file

@ -89,7 +89,10 @@ impl Var {
date,
msg: e,
})?;
NaiveDate::from_ymd(e.year, e.month, e.day).ordinal().into()
NaiveDate::from_ymd_opt(e.year, e.month, e.day)
.unwrap()
.ordinal()
.into()
}
Self::IsWeekday => {
let wd: Weekday = date.weekday().into();
@ -332,7 +335,7 @@ impl FormulaSpec {
if let EvalCommand::Task(_) = s.command {
if let Some(last_done_root) = s.command.last_done_root() {
range = range.with_from(last_done_root.succ())?;
range = range.with_from(last_done_root.succ_opt().unwrap())?;
} else if let Some(from) = s.from {
range = range.with_from(from)?;
} else if matches!(s.command, EvalCommand::Task(_)) {
@ -395,12 +398,22 @@ mod tests {
}
}
fn expr_ymd(e: &Expr, ymd: (i32, u32, u32), target: i64) {
let (y, m, d) = ymd;
expr(e, NaiveDate::from_ymd_opt(y, m, d).unwrap(), target);
}
fn expr_yo(e: &Expr, yo: (i32, u32), target: i64) {
let (y, o) = yo;
expr(e, NaiveDate::from_yo_opt(y, o).unwrap(), target);
}
#[test]
fn julian_day() {
let e = Expr::Var(Var::JulianDay);
for delta in -1000..1000 {
let d1 = NaiveDate::from_ymd(2021, 12, 19);
let d1 = NaiveDate::from_ymd_opt(2021, 12, 19).unwrap();
let d2 = d1 + Duration::days(delta);
assert_eq!(e.eval((), d2).unwrap() - e.eval((), d1).unwrap(), delta);
}
@ -411,21 +424,21 @@ mod tests {
let e = Expr::Var(Var::Year);
for y in -3000..=3000 {
expr(&e, NaiveDate::from_ymd(y, 2, 19), y.into());
expr_ymd(&e, (y, 2, 19), y.into());
}
expr(&e, NaiveDate::from_ymd(2021, 1, 1), 2021);
expr(&e, NaiveDate::from_ymd(2021, 12, 31), 2021);
expr_ymd(&e, (2021, 1, 1), 2021);
expr_ymd(&e, (2021, 12, 31), 2021);
}
#[test]
fn year_length() {
let e = Expr::Var(Var::YearLength);
expr(&e, NaiveDate::from_ymd(2000, 12, 19), 366);
expr(&e, NaiveDate::from_ymd(2019, 12, 19), 365);
expr(&e, NaiveDate::from_ymd(2020, 12, 19), 366);
expr(&e, NaiveDate::from_ymd(2021, 12, 19), 365);
expr_ymd(&e, (2000, 12, 19), 366);
expr_ymd(&e, (2019, 12, 19), 365);
expr_ymd(&e, (2020, 12, 19), 366);
expr_ymd(&e, (2021, 12, 19), 365);
}
#[test]
@ -433,11 +446,11 @@ mod tests {
let e = Expr::Var(Var::YearDay);
for i in 1..=365 {
expr(&e, NaiveDate::from_yo(2020, i), i.into());
expr(&e, NaiveDate::from_yo(2021, i), i.into());
expr_yo(&e, (2020, i), i.into());
expr_yo(&e, (2021, i), i.into());
}
expr(&e, NaiveDate::from_yo(2020, 366), 366);
expr_yo(&e, (2020, 366), 366);
}
#[test]
@ -445,14 +458,14 @@ mod tests {
let e = Expr::Var(Var::YearDayReverse);
for i in 1..=365 {
expr(&e, NaiveDate::from_yo(2020, i), (366 - i + 1).into());
expr(&e, NaiveDate::from_yo(2021, i), (365 - i + 1).into());
expr_yo(&e, (2020, i), (366 - i + 1).into());
expr_yo(&e, (2021, i), (365 - i + 1).into());
}
expr(&e, NaiveDate::from_ymd(2020, 1, 1), 366);
expr(&e, NaiveDate::from_ymd(2021, 1, 1), 365);
expr(&e, NaiveDate::from_ymd(2020, 12, 31), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 31), 1);
expr_ymd(&e, (2020, 1, 1), 366);
expr_ymd(&e, (2021, 1, 1), 365);
expr_ymd(&e, (2020, 12, 31), 1);
expr_ymd(&e, (2021, 12, 31), 1);
}
#[test]
@ -460,32 +473,32 @@ mod tests {
let e = Expr::Var(Var::YearWeek);
for y in 1000..3000 {
expr(&e, NaiveDate::from_ymd(y, 1, 1), 1);
expr(&e, NaiveDate::from_ymd(y, 1, 2), 1);
expr(&e, NaiveDate::from_ymd(y, 1, 3), 1);
expr(&e, NaiveDate::from_ymd(y, 1, 4), 1);
expr(&e, NaiveDate::from_ymd(y, 1, 5), 1);
expr(&e, NaiveDate::from_ymd(y, 1, 6), 1);
expr(&e, NaiveDate::from_ymd(y, 1, 7), 1);
expr(&e, NaiveDate::from_ymd(y, 1, 8), 2);
expr(&e, NaiveDate::from_ymd(y, 1, 9), 2);
expr(&e, NaiveDate::from_ymd(y, 1, 10), 2);
expr(&e, NaiveDate::from_ymd(y, 1, 11), 2);
expr(&e, NaiveDate::from_ymd(y, 1, 12), 2);
expr(&e, NaiveDate::from_ymd(y, 1, 13), 2);
expr(&e, NaiveDate::from_ymd(y, 1, 14), 2);
expr(&e, NaiveDate::from_ymd(y, 1, 15), 3);
expr_ymd(&e, (y, 1, 1), 1);
expr_ymd(&e, (y, 1, 2), 1);
expr_ymd(&e, (y, 1, 3), 1);
expr_ymd(&e, (y, 1, 4), 1);
expr_ymd(&e, (y, 1, 5), 1);
expr_ymd(&e, (y, 1, 6), 1);
expr_ymd(&e, (y, 1, 7), 1);
expr_ymd(&e, (y, 1, 8), 2);
expr_ymd(&e, (y, 1, 9), 2);
expr_ymd(&e, (y, 1, 10), 2);
expr_ymd(&e, (y, 1, 11), 2);
expr_ymd(&e, (y, 1, 12), 2);
expr_ymd(&e, (y, 1, 13), 2);
expr_ymd(&e, (y, 1, 14), 2);
expr_ymd(&e, (y, 1, 15), 3);
}
expr(&e, NaiveDate::from_ymd(2020, 12, 28), 52);
expr(&e, NaiveDate::from_ymd(2020, 12, 29), 52);
expr(&e, NaiveDate::from_ymd(2020, 12, 30), 53);
expr(&e, NaiveDate::from_ymd(2020, 12, 31), 53);
expr_ymd(&e, (2020, 12, 28), 52);
expr_ymd(&e, (2020, 12, 29), 52);
expr_ymd(&e, (2020, 12, 30), 53);
expr_ymd(&e, (2020, 12, 31), 53);
expr(&e, NaiveDate::from_ymd(2021, 12, 28), 52);
expr(&e, NaiveDate::from_ymd(2021, 12, 29), 52);
expr(&e, NaiveDate::from_ymd(2021, 12, 30), 52);
expr(&e, NaiveDate::from_ymd(2021, 12, 31), 53);
expr_ymd(&e, (2021, 12, 28), 52);
expr_ymd(&e, (2021, 12, 29), 52);
expr_ymd(&e, (2021, 12, 30), 52);
expr_ymd(&e, (2021, 12, 31), 53);
}
#[test]
@ -493,32 +506,32 @@ mod tests {
let e = Expr::Var(Var::YearWeekReverse);
for y in 1000..3000 {
expr(&e, NaiveDate::from_ymd(y, 12, 31), 1);
expr(&e, NaiveDate::from_ymd(y, 12, 30), 1);
expr(&e, NaiveDate::from_ymd(y, 12, 29), 1);
expr(&e, NaiveDate::from_ymd(y, 12, 28), 1);
expr(&e, NaiveDate::from_ymd(y, 12, 27), 1);
expr(&e, NaiveDate::from_ymd(y, 12, 26), 1);
expr(&e, NaiveDate::from_ymd(y, 12, 25), 1);
expr(&e, NaiveDate::from_ymd(y, 12, 24), 2);
expr(&e, NaiveDate::from_ymd(y, 12, 23), 2);
expr(&e, NaiveDate::from_ymd(y, 12, 22), 2);
expr(&e, NaiveDate::from_ymd(y, 12, 21), 2);
expr(&e, NaiveDate::from_ymd(y, 12, 20), 2);
expr(&e, NaiveDate::from_ymd(y, 12, 19), 2);
expr(&e, NaiveDate::from_ymd(y, 12, 18), 2);
expr(&e, NaiveDate::from_ymd(y, 12, 17), 3);
expr_ymd(&e, (y, 12, 31), 1);
expr_ymd(&e, (y, 12, 30), 1);
expr_ymd(&e, (y, 12, 29), 1);
expr_ymd(&e, (y, 12, 28), 1);
expr_ymd(&e, (y, 12, 27), 1);
expr_ymd(&e, (y, 12, 26), 1);
expr_ymd(&e, (y, 12, 25), 1);
expr_ymd(&e, (y, 12, 24), 2);
expr_ymd(&e, (y, 12, 23), 2);
expr_ymd(&e, (y, 12, 22), 2);
expr_ymd(&e, (y, 12, 21), 2);
expr_ymd(&e, (y, 12, 20), 2);
expr_ymd(&e, (y, 12, 19), 2);
expr_ymd(&e, (y, 12, 18), 2);
expr_ymd(&e, (y, 12, 17), 3);
}
expr(&e, NaiveDate::from_ymd(2020, 1, 1), 53);
expr(&e, NaiveDate::from_ymd(2020, 1, 2), 53);
expr(&e, NaiveDate::from_ymd(2020, 1, 3), 52);
expr(&e, NaiveDate::from_ymd(2020, 1, 4), 52);
expr_ymd(&e, (2020, 1, 1), 53);
expr_ymd(&e, (2020, 1, 2), 53);
expr_ymd(&e, (2020, 1, 3), 52);
expr_ymd(&e, (2020, 1, 4), 52);
expr(&e, NaiveDate::from_ymd(2021, 1, 1), 53);
expr(&e, NaiveDate::from_ymd(2021, 1, 2), 52);
expr(&e, NaiveDate::from_ymd(2021, 1, 3), 52);
expr(&e, NaiveDate::from_ymd(2021, 1, 4), 52);
expr_ymd(&e, (2021, 1, 1), 53);
expr_ymd(&e, (2021, 1, 2), 52);
expr_ymd(&e, (2021, 1, 3), 52);
expr_ymd(&e, (2021, 1, 4), 52);
}
#[test]
@ -526,7 +539,7 @@ mod tests {
let e = Expr::Var(Var::Month);
for y in -1000..=3000 {
for m in 1..=12 {
expr(&e, NaiveDate::from_ymd(y, m, 13), m.into());
expr_ymd(&e, (y, m, 13), m.into());
}
}
}
@ -535,96 +548,96 @@ mod tests {
fn month_length() {
let e = Expr::Var(Var::MonthLength);
expr(&e, NaiveDate::from_ymd(2021, 1, 5), 31);
expr(&e, NaiveDate::from_ymd(2021, 2, 5), 28);
expr(&e, NaiveDate::from_ymd(2021, 3, 5), 31);
expr(&e, NaiveDate::from_ymd(2021, 4, 5), 30);
expr(&e, NaiveDate::from_ymd(2021, 5, 5), 31);
expr(&e, NaiveDate::from_ymd(2021, 6, 5), 30);
expr(&e, NaiveDate::from_ymd(2021, 7, 5), 31);
expr(&e, NaiveDate::from_ymd(2021, 8, 5), 31);
expr(&e, NaiveDate::from_ymd(2021, 9, 5), 30);
expr(&e, NaiveDate::from_ymd(2021, 10, 5), 31);
expr(&e, NaiveDate::from_ymd(2021, 11, 5), 30);
expr(&e, NaiveDate::from_ymd(2021, 12, 5), 31);
expr_ymd(&e, (2021, 1, 5), 31);
expr_ymd(&e, (2021, 2, 5), 28);
expr_ymd(&e, (2021, 3, 5), 31);
expr_ymd(&e, (2021, 4, 5), 30);
expr_ymd(&e, (2021, 5, 5), 31);
expr_ymd(&e, (2021, 6, 5), 30);
expr_ymd(&e, (2021, 7, 5), 31);
expr_ymd(&e, (2021, 8, 5), 31);
expr_ymd(&e, (2021, 9, 5), 30);
expr_ymd(&e, (2021, 10, 5), 31);
expr_ymd(&e, (2021, 11, 5), 30);
expr_ymd(&e, (2021, 12, 5), 31);
expr(&e, NaiveDate::from_ymd(2020, 2, 5), 29);
expr(&e, NaiveDate::from_ymd(2019, 2, 5), 28);
expr(&e, NaiveDate::from_ymd(2000, 2, 5), 29);
expr_ymd(&e, (2020, 2, 5), 29);
expr_ymd(&e, (2019, 2, 5), 28);
expr_ymd(&e, (2000, 2, 5), 29);
}
#[test]
fn month_week() {
let e = Expr::Var(Var::MonthWeek);
expr(&e, NaiveDate::from_ymd(2021, 12, 1), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 2), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 3), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 4), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 5), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 6), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 7), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 8), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 9), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 10), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 11), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 12), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 13), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 14), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 15), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 16), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 17), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 18), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 19), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 20), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 21), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 22), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 23), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 24), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 25), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 26), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 27), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 28), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 29), 5);
expr(&e, NaiveDate::from_ymd(2021, 12, 30), 5);
expr(&e, NaiveDate::from_ymd(2021, 12, 31), 5);
expr_ymd(&e, (2021, 12, 1), 1);
expr_ymd(&e, (2021, 12, 2), 1);
expr_ymd(&e, (2021, 12, 3), 1);
expr_ymd(&e, (2021, 12, 4), 1);
expr_ymd(&e, (2021, 12, 5), 1);
expr_ymd(&e, (2021, 12, 6), 1);
expr_ymd(&e, (2021, 12, 7), 1);
expr_ymd(&e, (2021, 12, 8), 2);
expr_ymd(&e, (2021, 12, 9), 2);
expr_ymd(&e, (2021, 12, 10), 2);
expr_ymd(&e, (2021, 12, 11), 2);
expr_ymd(&e, (2021, 12, 12), 2);
expr_ymd(&e, (2021, 12, 13), 2);
expr_ymd(&e, (2021, 12, 14), 2);
expr_ymd(&e, (2021, 12, 15), 3);
expr_ymd(&e, (2021, 12, 16), 3);
expr_ymd(&e, (2021, 12, 17), 3);
expr_ymd(&e, (2021, 12, 18), 3);
expr_ymd(&e, (2021, 12, 19), 3);
expr_ymd(&e, (2021, 12, 20), 3);
expr_ymd(&e, (2021, 12, 21), 3);
expr_ymd(&e, (2021, 12, 22), 4);
expr_ymd(&e, (2021, 12, 23), 4);
expr_ymd(&e, (2021, 12, 24), 4);
expr_ymd(&e, (2021, 12, 25), 4);
expr_ymd(&e, (2021, 12, 26), 4);
expr_ymd(&e, (2021, 12, 27), 4);
expr_ymd(&e, (2021, 12, 28), 4);
expr_ymd(&e, (2021, 12, 29), 5);
expr_ymd(&e, (2021, 12, 30), 5);
expr_ymd(&e, (2021, 12, 31), 5);
}
#[test]
fn month_week_reverse() {
let e = Expr::Var(Var::MonthWeekReverse);
expr(&e, NaiveDate::from_ymd(2021, 12, 1), 5);
expr(&e, NaiveDate::from_ymd(2021, 12, 2), 5);
expr(&e, NaiveDate::from_ymd(2021, 12, 3), 5);
expr(&e, NaiveDate::from_ymd(2021, 12, 4), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 5), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 6), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 7), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 8), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 9), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 10), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 11), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 12), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 13), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 14), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 15), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 16), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 17), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 18), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 19), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 20), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 21), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 22), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 23), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 24), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 25), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 26), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 27), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 28), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 29), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 30), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 31), 1);
expr_ymd(&e, (2021, 12, 1), 5);
expr_ymd(&e, (2021, 12, 2), 5);
expr_ymd(&e, (2021, 12, 3), 5);
expr_ymd(&e, (2021, 12, 4), 4);
expr_ymd(&e, (2021, 12, 5), 4);
expr_ymd(&e, (2021, 12, 6), 4);
expr_ymd(&e, (2021, 12, 7), 4);
expr_ymd(&e, (2021, 12, 8), 4);
expr_ymd(&e, (2021, 12, 9), 4);
expr_ymd(&e, (2021, 12, 10), 4);
expr_ymd(&e, (2021, 12, 11), 3);
expr_ymd(&e, (2021, 12, 12), 3);
expr_ymd(&e, (2021, 12, 13), 3);
expr_ymd(&e, (2021, 12, 14), 3);
expr_ymd(&e, (2021, 12, 15), 3);
expr_ymd(&e, (2021, 12, 16), 3);
expr_ymd(&e, (2021, 12, 17), 3);
expr_ymd(&e, (2021, 12, 18), 2);
expr_ymd(&e, (2021, 12, 19), 2);
expr_ymd(&e, (2021, 12, 20), 2);
expr_ymd(&e, (2021, 12, 21), 2);
expr_ymd(&e, (2021, 12, 22), 2);
expr_ymd(&e, (2021, 12, 23), 2);
expr_ymd(&e, (2021, 12, 24), 2);
expr_ymd(&e, (2021, 12, 25), 1);
expr_ymd(&e, (2021, 12, 26), 1);
expr_ymd(&e, (2021, 12, 27), 1);
expr_ymd(&e, (2021, 12, 28), 1);
expr_ymd(&e, (2021, 12, 29), 1);
expr_ymd(&e, (2021, 12, 30), 1);
expr_ymd(&e, (2021, 12, 31), 1);
}
#[test]
@ -632,78 +645,78 @@ mod tests {
let e = Expr::Var(Var::Day);
for d in 1..=31 {
expr(&e, NaiveDate::from_ymd(2020, 1, d), d.into());
expr(&e, NaiveDate::from_ymd(2020, 3, d), d.into());
expr(&e, NaiveDate::from_ymd(2020, 5, d), d.into());
expr(&e, NaiveDate::from_ymd(2020, 7, d), d.into());
expr(&e, NaiveDate::from_ymd(2020, 8, d), d.into());
expr(&e, NaiveDate::from_ymd(2020, 10, d), d.into());
expr(&e, NaiveDate::from_ymd(2020, 12, d), d.into());
expr_ymd(&e, (2020, 1, d), d.into());
expr_ymd(&e, (2020, 3, d), d.into());
expr_ymd(&e, (2020, 5, d), d.into());
expr_ymd(&e, (2020, 7, d), d.into());
expr_ymd(&e, (2020, 8, d), d.into());
expr_ymd(&e, (2020, 10, d), d.into());
expr_ymd(&e, (2020, 12, d), d.into());
expr(&e, NaiveDate::from_ymd(2021, 1, d), d.into());
expr(&e, NaiveDate::from_ymd(2021, 3, d), d.into());
expr(&e, NaiveDate::from_ymd(2021, 5, d), d.into());
expr(&e, NaiveDate::from_ymd(2021, 7, d), d.into());
expr(&e, NaiveDate::from_ymd(2021, 8, d), d.into());
expr(&e, NaiveDate::from_ymd(2021, 10, d), d.into());
expr(&e, NaiveDate::from_ymd(2021, 12, d), d.into());
expr_ymd(&e, (2021, 1, d), d.into());
expr_ymd(&e, (2021, 3, d), d.into());
expr_ymd(&e, (2021, 5, d), d.into());
expr_ymd(&e, (2021, 7, d), d.into());
expr_ymd(&e, (2021, 8, d), d.into());
expr_ymd(&e, (2021, 10, d), d.into());
expr_ymd(&e, (2021, 12, d), d.into());
}
for d in 1..=30 {
expr(&e, NaiveDate::from_ymd(2020, 4, d), d.into());
expr(&e, NaiveDate::from_ymd(2020, 6, d), d.into());
expr(&e, NaiveDate::from_ymd(2020, 9, d), d.into());
expr(&e, NaiveDate::from_ymd(2020, 11, d), d.into());
expr_ymd(&e, (2020, 4, d), d.into());
expr_ymd(&e, (2020, 6, d), d.into());
expr_ymd(&e, (2020, 9, d), d.into());
expr_ymd(&e, (2020, 11, d), d.into());
expr(&e, NaiveDate::from_ymd(2021, 4, d), d.into());
expr(&e, NaiveDate::from_ymd(2021, 6, d), d.into());
expr(&e, NaiveDate::from_ymd(2021, 9, d), d.into());
expr(&e, NaiveDate::from_ymd(2021, 11, d), d.into());
expr_ymd(&e, (2021, 4, d), d.into());
expr_ymd(&e, (2021, 6, d), d.into());
expr_ymd(&e, (2021, 9, d), d.into());
expr_ymd(&e, (2021, 11, d), d.into());
}
for d in 1..=28 {
expr(&e, NaiveDate::from_ymd(2020, 2, d), d.into());
expr(&e, NaiveDate::from_ymd(2021, 2, d), d.into());
expr_ymd(&e, (2020, 2, d), d.into());
expr_ymd(&e, (2021, 2, d), d.into());
}
expr(&e, NaiveDate::from_ymd(2020, 2, 29), 29);
expr_ymd(&e, (2020, 2, 29), 29);
}
#[test]
fn day_reverse() {
let e = Expr::Var(Var::DayReverse);
expr(&e, NaiveDate::from_ymd(2021, 12, 1), 31);
expr(&e, NaiveDate::from_ymd(2021, 12, 2), 30);
expr(&e, NaiveDate::from_ymd(2021, 12, 3), 29);
expr(&e, NaiveDate::from_ymd(2021, 12, 4), 28);
expr(&e, NaiveDate::from_ymd(2021, 12, 5), 27);
expr(&e, NaiveDate::from_ymd(2021, 12, 6), 26);
expr(&e, NaiveDate::from_ymd(2021, 12, 7), 25);
expr(&e, NaiveDate::from_ymd(2021, 12, 8), 24);
expr(&e, NaiveDate::from_ymd(2021, 12, 9), 23);
expr(&e, NaiveDate::from_ymd(2021, 12, 10), 22);
expr(&e, NaiveDate::from_ymd(2021, 12, 11), 21);
expr(&e, NaiveDate::from_ymd(2021, 12, 12), 20);
expr(&e, NaiveDate::from_ymd(2021, 12, 13), 19);
expr(&e, NaiveDate::from_ymd(2021, 12, 14), 18);
expr(&e, NaiveDate::from_ymd(2021, 12, 15), 17);
expr(&e, NaiveDate::from_ymd(2021, 12, 16), 16);
expr(&e, NaiveDate::from_ymd(2021, 12, 17), 15);
expr(&e, NaiveDate::from_ymd(2021, 12, 18), 14);
expr(&e, NaiveDate::from_ymd(2021, 12, 19), 13);
expr(&e, NaiveDate::from_ymd(2021, 12, 20), 12);
expr(&e, NaiveDate::from_ymd(2021, 12, 21), 11);
expr(&e, NaiveDate::from_ymd(2021, 12, 22), 10);
expr(&e, NaiveDate::from_ymd(2021, 12, 23), 9);
expr(&e, NaiveDate::from_ymd(2021, 12, 24), 8);
expr(&e, NaiveDate::from_ymd(2021, 12, 25), 7);
expr(&e, NaiveDate::from_ymd(2021, 12, 26), 6);
expr(&e, NaiveDate::from_ymd(2021, 12, 27), 5);
expr(&e, NaiveDate::from_ymd(2021, 12, 28), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 29), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 30), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 31), 1);
expr_ymd(&e, (2021, 12, 1), 31);
expr_ymd(&e, (2021, 12, 2), 30);
expr_ymd(&e, (2021, 12, 3), 29);
expr_ymd(&e, (2021, 12, 4), 28);
expr_ymd(&e, (2021, 12, 5), 27);
expr_ymd(&e, (2021, 12, 6), 26);
expr_ymd(&e, (2021, 12, 7), 25);
expr_ymd(&e, (2021, 12, 8), 24);
expr_ymd(&e, (2021, 12, 9), 23);
expr_ymd(&e, (2021, 12, 10), 22);
expr_ymd(&e, (2021, 12, 11), 21);
expr_ymd(&e, (2021, 12, 12), 20);
expr_ymd(&e, (2021, 12, 13), 19);
expr_ymd(&e, (2021, 12, 14), 18);
expr_ymd(&e, (2021, 12, 15), 17);
expr_ymd(&e, (2021, 12, 16), 16);
expr_ymd(&e, (2021, 12, 17), 15);
expr_ymd(&e, (2021, 12, 18), 14);
expr_ymd(&e, (2021, 12, 19), 13);
expr_ymd(&e, (2021, 12, 20), 12);
expr_ymd(&e, (2021, 12, 21), 11);
expr_ymd(&e, (2021, 12, 22), 10);
expr_ymd(&e, (2021, 12, 23), 9);
expr_ymd(&e, (2021, 12, 24), 8);
expr_ymd(&e, (2021, 12, 25), 7);
expr_ymd(&e, (2021, 12, 26), 6);
expr_ymd(&e, (2021, 12, 27), 5);
expr_ymd(&e, (2021, 12, 28), 4);
expr_ymd(&e, (2021, 12, 29), 3);
expr_ymd(&e, (2021, 12, 30), 2);
expr_ymd(&e, (2021, 12, 31), 1);
}
#[test]
@ -712,32 +725,32 @@ mod tests {
// From https://en.wikipedia.org/wiki/ISO_week_date
expr(&e, NaiveDate::from_ymd(1977, 1, 1), 1976);
expr(&e, NaiveDate::from_ymd(1977, 1, 2), 1976);
expr(&e, NaiveDate::from_ymd(1977, 1, 3), 1977);
expr_ymd(&e, (1977, 1, 1), 1976);
expr_ymd(&e, (1977, 1, 2), 1976);
expr_ymd(&e, (1977, 1, 3), 1977);
expr(&e, NaiveDate::from_ymd(1977, 12, 31), 1977);
expr(&e, NaiveDate::from_ymd(1978, 1, 1), 1977);
expr(&e, NaiveDate::from_ymd(1978, 1, 2), 1978);
expr_ymd(&e, (1977, 12, 31), 1977);
expr_ymd(&e, (1978, 1, 1), 1977);
expr_ymd(&e, (1978, 1, 2), 1978);
expr(&e, NaiveDate::from_ymd(1978, 12, 31), 1978);
expr(&e, NaiveDate::from_ymd(1979, 1, 1), 1979);
expr_ymd(&e, (1978, 12, 31), 1978);
expr_ymd(&e, (1979, 1, 1), 1979);
expr(&e, NaiveDate::from_ymd(1979, 12, 30), 1979);
expr(&e, NaiveDate::from_ymd(1979, 12, 31), 1980);
expr(&e, NaiveDate::from_ymd(1980, 1, 1), 1980);
expr_ymd(&e, (1979, 12, 30), 1979);
expr_ymd(&e, (1979, 12, 31), 1980);
expr_ymd(&e, (1980, 1, 1), 1980);
expr(&e, NaiveDate::from_ymd(1980, 12, 28), 1980);
expr(&e, NaiveDate::from_ymd(1980, 12, 29), 1981);
expr(&e, NaiveDate::from_ymd(1980, 12, 30), 1981);
expr(&e, NaiveDate::from_ymd(1980, 12, 31), 1981);
expr(&e, NaiveDate::from_ymd(1981, 1, 1), 1981);
expr_ymd(&e, (1980, 12, 28), 1980);
expr_ymd(&e, (1980, 12, 29), 1981);
expr_ymd(&e, (1980, 12, 30), 1981);
expr_ymd(&e, (1980, 12, 31), 1981);
expr_ymd(&e, (1981, 1, 1), 1981);
expr(&e, NaiveDate::from_ymd(1981, 12, 31), 1981);
expr(&e, NaiveDate::from_ymd(1982, 1, 1), 1981);
expr(&e, NaiveDate::from_ymd(1982, 1, 2), 1981);
expr(&e, NaiveDate::from_ymd(1982, 1, 3), 1981);
expr(&e, NaiveDate::from_ymd(1982, 1, 4), 1982);
expr_ymd(&e, (1981, 12, 31), 1981);
expr_ymd(&e, (1982, 1, 1), 1981);
expr_ymd(&e, (1982, 1, 2), 1981);
expr_ymd(&e, (1982, 1, 3), 1981);
expr_ymd(&e, (1982, 1, 4), 1982);
}
#[test]
@ -745,37 +758,37 @@ mod tests {
let e = Expr::Var(Var::IsoYearLength);
// August 1st is definitely in the same year in both systems
expr(&e, NaiveDate::from_ymd(2000, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2001, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2002, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2003, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2004, 8, 1), 52 * 7 + 7);
expr(&e, NaiveDate::from_ymd(2005, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2006, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2007, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2008, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2009, 8, 1), 52 * 7 + 7);
expr(&e, NaiveDate::from_ymd(2010, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2011, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2012, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2013, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2014, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2015, 8, 1), 52 * 7 + 7);
expr(&e, NaiveDate::from_ymd(2016, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2017, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2018, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2019, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2020, 8, 1), 52 * 7 + 7);
expr(&e, NaiveDate::from_ymd(2021, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2022, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2023, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2024, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2025, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2026, 8, 1), 52 * 7 + 7);
expr(&e, NaiveDate::from_ymd(2027, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2028, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2029, 8, 1), 52 * 7);
expr(&e, NaiveDate::from_ymd(2030, 8, 1), 52 * 7);
expr_ymd(&e, (2000, 8, 1), 52 * 7);
expr_ymd(&e, (2001, 8, 1), 52 * 7);
expr_ymd(&e, (2002, 8, 1), 52 * 7);
expr_ymd(&e, (2003, 8, 1), 52 * 7);
expr_ymd(&e, (2004, 8, 1), 52 * 7 + 7);
expr_ymd(&e, (2005, 8, 1), 52 * 7);
expr_ymd(&e, (2006, 8, 1), 52 * 7);
expr_ymd(&e, (2007, 8, 1), 52 * 7);
expr_ymd(&e, (2008, 8, 1), 52 * 7);
expr_ymd(&e, (2009, 8, 1), 52 * 7 + 7);
expr_ymd(&e, (2010, 8, 1), 52 * 7);
expr_ymd(&e, (2011, 8, 1), 52 * 7);
expr_ymd(&e, (2012, 8, 1), 52 * 7);
expr_ymd(&e, (2013, 8, 1), 52 * 7);
expr_ymd(&e, (2014, 8, 1), 52 * 7);
expr_ymd(&e, (2015, 8, 1), 52 * 7 + 7);
expr_ymd(&e, (2016, 8, 1), 52 * 7);
expr_ymd(&e, (2017, 8, 1), 52 * 7);
expr_ymd(&e, (2018, 8, 1), 52 * 7);
expr_ymd(&e, (2019, 8, 1), 52 * 7);
expr_ymd(&e, (2020, 8, 1), 52 * 7 + 7);
expr_ymd(&e, (2021, 8, 1), 52 * 7);
expr_ymd(&e, (2022, 8, 1), 52 * 7);
expr_ymd(&e, (2023, 8, 1), 52 * 7);
expr_ymd(&e, (2024, 8, 1), 52 * 7);
expr_ymd(&e, (2025, 8, 1), 52 * 7);
expr_ymd(&e, (2026, 8, 1), 52 * 7 + 7);
expr_ymd(&e, (2027, 8, 1), 52 * 7);
expr_ymd(&e, (2028, 8, 1), 52 * 7);
expr_ymd(&e, (2029, 8, 1), 52 * 7);
expr_ymd(&e, (2030, 8, 1), 52 * 7);
}
#[test]
@ -784,52 +797,52 @@ mod tests {
// From https://en.wikipedia.org/wiki/ISO_week_date
expr(&e, NaiveDate::from_ymd(1977, 1, 1), 53);
expr(&e, NaiveDate::from_ymd(1977, 1, 2), 53);
expr(&e, NaiveDate::from_ymd(1977, 1, 3), 1);
expr_ymd(&e, (1977, 1, 1), 53);
expr_ymd(&e, (1977, 1, 2), 53);
expr_ymd(&e, (1977, 1, 3), 1);
expr(&e, NaiveDate::from_ymd(1977, 12, 31), 52);
expr(&e, NaiveDate::from_ymd(1978, 1, 1), 52);
expr(&e, NaiveDate::from_ymd(1978, 1, 2), 1);
expr_ymd(&e, (1977, 12, 31), 52);
expr_ymd(&e, (1978, 1, 1), 52);
expr_ymd(&e, (1978, 1, 2), 1);
expr(&e, NaiveDate::from_ymd(1978, 12, 31), 52);
expr(&e, NaiveDate::from_ymd(1979, 1, 1), 1);
expr_ymd(&e, (1978, 12, 31), 52);
expr_ymd(&e, (1979, 1, 1), 1);
expr(&e, NaiveDate::from_ymd(1979, 12, 30), 52);
expr(&e, NaiveDate::from_ymd(1979, 12, 31), 1);
expr(&e, NaiveDate::from_ymd(1980, 1, 1), 1);
expr_ymd(&e, (1979, 12, 30), 52);
expr_ymd(&e, (1979, 12, 31), 1);
expr_ymd(&e, (1980, 1, 1), 1);
expr(&e, NaiveDate::from_ymd(1980, 12, 28), 52);
expr(&e, NaiveDate::from_ymd(1980, 12, 29), 1);
expr(&e, NaiveDate::from_ymd(1980, 12, 30), 1);
expr(&e, NaiveDate::from_ymd(1980, 12, 31), 1);
expr(&e, NaiveDate::from_ymd(1981, 1, 1), 1);
expr_ymd(&e, (1980, 12, 28), 52);
expr_ymd(&e, (1980, 12, 29), 1);
expr_ymd(&e, (1980, 12, 30), 1);
expr_ymd(&e, (1980, 12, 31), 1);
expr_ymd(&e, (1981, 1, 1), 1);
expr(&e, NaiveDate::from_ymd(1981, 12, 31), 53);
expr(&e, NaiveDate::from_ymd(1982, 1, 1), 53);
expr(&e, NaiveDate::from_ymd(1982, 1, 2), 53);
expr(&e, NaiveDate::from_ymd(1982, 1, 3), 53);
expr(&e, NaiveDate::from_ymd(1982, 1, 4), 1);
expr_ymd(&e, (1981, 12, 31), 53);
expr_ymd(&e, (1982, 1, 1), 53);
expr_ymd(&e, (1982, 1, 2), 53);
expr_ymd(&e, (1982, 1, 3), 53);
expr_ymd(&e, (1982, 1, 4), 1);
}
#[test]
fn weekday() {
let e = Expr::Var(Var::Weekday);
expr(&e, NaiveDate::from_ymd(2021, 12, 18), 6);
expr(&e, NaiveDate::from_ymd(2021, 12, 19), 7);
expr(&e, NaiveDate::from_ymd(2021, 12, 20), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 21), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 22), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 23), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 24), 5);
expr(&e, NaiveDate::from_ymd(2021, 12, 25), 6);
expr(&e, NaiveDate::from_ymd(2021, 12, 26), 7);
expr(&e, NaiveDate::from_ymd(2021, 12, 27), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 28), 2);
expr(&e, NaiveDate::from_ymd(2021, 12, 29), 3);
expr(&e, NaiveDate::from_ymd(2021, 12, 30), 4);
expr(&e, NaiveDate::from_ymd(2021, 12, 31), 5);
expr_ymd(&e, (2021, 12, 18), 6);
expr_ymd(&e, (2021, 12, 19), 7);
expr_ymd(&e, (2021, 12, 20), 1);
expr_ymd(&e, (2021, 12, 21), 2);
expr_ymd(&e, (2021, 12, 22), 3);
expr_ymd(&e, (2021, 12, 23), 4);
expr_ymd(&e, (2021, 12, 24), 5);
expr_ymd(&e, (2021, 12, 25), 6);
expr_ymd(&e, (2021, 12, 26), 7);
expr_ymd(&e, (2021, 12, 27), 1);
expr_ymd(&e, (2021, 12, 28), 2);
expr_ymd(&e, (2021, 12, 29), 3);
expr_ymd(&e, (2021, 12, 30), 4);
expr_ymd(&e, (2021, 12, 31), 5);
}
#[test]
@ -889,10 +902,10 @@ mod tests {
];
for (y, m, d) in dates {
expr(
expr_ymd(
&e,
NaiveDate::from_ymd(y, 1, 1),
NaiveDate::from_ymd(y, m, d).ordinal().into(),
(y, 1, 1),
NaiveDate::from_ymd_opt(y, m, d).unwrap().ordinal().into(),
);
}
}
@ -901,77 +914,77 @@ mod tests {
fn is_weekday() {
let e = Expr::Var(Var::IsWeekday);
expr(&e, NaiveDate::from_ymd(2021, 12, 18), 0);
expr(&e, NaiveDate::from_ymd(2021, 12, 19), 0);
expr(&e, NaiveDate::from_ymd(2021, 12, 20), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 21), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 22), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 23), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 24), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 25), 0);
expr(&e, NaiveDate::from_ymd(2021, 12, 26), 0);
expr(&e, NaiveDate::from_ymd(2021, 12, 27), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 28), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 29), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 30), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 31), 1);
expr_ymd(&e, (2021, 12, 18), 0);
expr_ymd(&e, (2021, 12, 19), 0);
expr_ymd(&e, (2021, 12, 20), 1);
expr_ymd(&e, (2021, 12, 21), 1);
expr_ymd(&e, (2021, 12, 22), 1);
expr_ymd(&e, (2021, 12, 23), 1);
expr_ymd(&e, (2021, 12, 24), 1);
expr_ymd(&e, (2021, 12, 25), 0);
expr_ymd(&e, (2021, 12, 26), 0);
expr_ymd(&e, (2021, 12, 27), 1);
expr_ymd(&e, (2021, 12, 28), 1);
expr_ymd(&e, (2021, 12, 29), 1);
expr_ymd(&e, (2021, 12, 30), 1);
expr_ymd(&e, (2021, 12, 31), 1);
}
#[test]
fn is_weekend() {
let e = Expr::Var(Var::IsWeekend);
expr(&e, NaiveDate::from_ymd(2021, 12, 18), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 19), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 20), 0);
expr(&e, NaiveDate::from_ymd(2021, 12, 21), 0);
expr(&e, NaiveDate::from_ymd(2021, 12, 22), 0);
expr(&e, NaiveDate::from_ymd(2021, 12, 23), 0);
expr(&e, NaiveDate::from_ymd(2021, 12, 24), 0);
expr(&e, NaiveDate::from_ymd(2021, 12, 25), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 26), 1);
expr(&e, NaiveDate::from_ymd(2021, 12, 27), 0);
expr(&e, NaiveDate::from_ymd(2021, 12, 28), 0);
expr(&e, NaiveDate::from_ymd(2021, 12, 29), 0);
expr(&e, NaiveDate::from_ymd(2021, 12, 30), 0);
expr(&e, NaiveDate::from_ymd(2021, 12, 31), 0);
expr_ymd(&e, (2021, 12, 18), 1);
expr_ymd(&e, (2021, 12, 19), 1);
expr_ymd(&e, (2021, 12, 20), 0);
expr_ymd(&e, (2021, 12, 21), 0);
expr_ymd(&e, (2021, 12, 22), 0);
expr_ymd(&e, (2021, 12, 23), 0);
expr_ymd(&e, (2021, 12, 24), 0);
expr_ymd(&e, (2021, 12, 25), 1);
expr_ymd(&e, (2021, 12, 26), 1);
expr_ymd(&e, (2021, 12, 27), 0);
expr_ymd(&e, (2021, 12, 28), 0);
expr_ymd(&e, (2021, 12, 29), 0);
expr_ymd(&e, (2021, 12, 30), 0);
expr_ymd(&e, (2021, 12, 31), 0);
}
#[test]
fn is_leap_year() {
let e = Expr::Var(Var::IsLeapYear);
expr(&e, NaiveDate::from_ymd(2000, 1, 1), 1);
expr(&e, NaiveDate::from_ymd(2001, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2002, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2003, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2004, 1, 1), 1);
expr(&e, NaiveDate::from_ymd(2005, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2006, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2007, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2008, 1, 1), 1);
expr(&e, NaiveDate::from_ymd(2009, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2010, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2011, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2012, 1, 1), 1);
expr(&e, NaiveDate::from_ymd(2013, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2014, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2015, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2016, 1, 1), 1);
expr(&e, NaiveDate::from_ymd(2017, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2018, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2019, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2020, 1, 1), 1);
expr(&e, NaiveDate::from_ymd(2021, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2022, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2023, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2024, 1, 1), 1);
expr(&e, NaiveDate::from_ymd(2025, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2026, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2027, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2028, 1, 1), 1);
expr(&e, NaiveDate::from_ymd(2029, 1, 1), 0);
expr(&e, NaiveDate::from_ymd(2030, 1, 1), 0);
expr_ymd(&e, (2000, 1, 1), 1);
expr_ymd(&e, (2001, 1, 1), 0);
expr_ymd(&e, (2002, 1, 1), 0);
expr_ymd(&e, (2003, 1, 1), 0);
expr_ymd(&e, (2004, 1, 1), 1);
expr_ymd(&e, (2005, 1, 1), 0);
expr_ymd(&e, (2006, 1, 1), 0);
expr_ymd(&e, (2007, 1, 1), 0);
expr_ymd(&e, (2008, 1, 1), 1);
expr_ymd(&e, (2009, 1, 1), 0);
expr_ymd(&e, (2010, 1, 1), 0);
expr_ymd(&e, (2011, 1, 1), 0);
expr_ymd(&e, (2012, 1, 1), 1);
expr_ymd(&e, (2013, 1, 1), 0);
expr_ymd(&e, (2014, 1, 1), 0);
expr_ymd(&e, (2015, 1, 1), 0);
expr_ymd(&e, (2016, 1, 1), 1);
expr_ymd(&e, (2017, 1, 1), 0);
expr_ymd(&e, (2018, 1, 1), 0);
expr_ymd(&e, (2019, 1, 1), 0);
expr_ymd(&e, (2020, 1, 1), 1);
expr_ymd(&e, (2021, 1, 1), 0);
expr_ymd(&e, (2022, 1, 1), 0);
expr_ymd(&e, (2023, 1, 1), 0);
expr_ymd(&e, (2024, 1, 1), 1);
expr_ymd(&e, (2025, 1, 1), 0);
expr_ymd(&e, (2026, 1, 1), 0);
expr_ymd(&e, (2027, 1, 1), 0);
expr_ymd(&e, (2028, 1, 1), 1);
expr_ymd(&e, (2029, 1, 1), 0);
expr_ymd(&e, (2030, 1, 1), 0);
}
#[test]
@ -979,36 +992,36 @@ mod tests {
let e = Expr::Var(Var::IsIsoLeapYear);
// August 1st is definitely in the same year in both systems
expr(&e, NaiveDate::from_ymd(2000, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2001, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2002, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2003, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2004, 8, 1), 1);
expr(&e, NaiveDate::from_ymd(2005, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2006, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2007, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2008, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2009, 8, 1), 1);
expr(&e, NaiveDate::from_ymd(2010, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2011, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2012, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2013, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2014, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2015, 8, 1), 1);
expr(&e, NaiveDate::from_ymd(2016, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2017, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2018, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2019, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2020, 8, 1), 1);
expr(&e, NaiveDate::from_ymd(2021, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2022, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2023, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2024, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2025, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2026, 8, 1), 1);
expr(&e, NaiveDate::from_ymd(2027, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2028, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2029, 8, 1), 0);
expr(&e, NaiveDate::from_ymd(2030, 8, 1), 0);
expr_ymd(&e, (2000, 8, 1), 0);
expr_ymd(&e, (2001, 8, 1), 0);
expr_ymd(&e, (2002, 8, 1), 0);
expr_ymd(&e, (2003, 8, 1), 0);
expr_ymd(&e, (2004, 8, 1), 1);
expr_ymd(&e, (2005, 8, 1), 0);
expr_ymd(&e, (2006, 8, 1), 0);
expr_ymd(&e, (2007, 8, 1), 0);
expr_ymd(&e, (2008, 8, 1), 0);
expr_ymd(&e, (2009, 8, 1), 1);
expr_ymd(&e, (2010, 8, 1), 0);
expr_ymd(&e, (2011, 8, 1), 0);
expr_ymd(&e, (2012, 8, 1), 0);
expr_ymd(&e, (2013, 8, 1), 0);
expr_ymd(&e, (2014, 8, 1), 0);
expr_ymd(&e, (2015, 8, 1), 1);
expr_ymd(&e, (2016, 8, 1), 0);
expr_ymd(&e, (2017, 8, 1), 0);
expr_ymd(&e, (2018, 8, 1), 0);
expr_ymd(&e, (2019, 8, 1), 0);
expr_ymd(&e, (2020, 8, 1), 1);
expr_ymd(&e, (2021, 8, 1), 0);
expr_ymd(&e, (2022, 8, 1), 0);
expr_ymd(&e, (2023, 8, 1), 0);
expr_ymd(&e, (2024, 8, 1), 0);
expr_ymd(&e, (2025, 8, 1), 0);
expr_ymd(&e, (2026, 8, 1), 1);
expr_ymd(&e, (2027, 8, 1), 0);
expr_ymd(&e, (2028, 8, 1), 0);
expr_ymd(&e, (2029, 8, 1), 0);
expr_ymd(&e, (2030, 8, 1), 0);
}
}

View file

@ -298,7 +298,7 @@ impl<S: Copy> DeltaEval<S> {
};
if time < curr_time {
self.curr = self.curr.succ();
self.curr = self.curr.succ_opt().unwrap();
}
self.curr_time = Some(time);
Ok(())
@ -359,13 +359,13 @@ mod tests {
}
fn apply_d(step: Step, from: (i32, u32, u32)) -> Result<NaiveDate, Error<()>> {
delta(step).apply_date((), NaiveDate::from_ymd(from.0, from.1, from.2))
delta(step).apply_date((), NaiveDate::from_ymd_opt(from.0, from.1, from.2).unwrap())
}
fn test_d(step: Step, from: (i32, u32, u32), expected: (i32, u32, u32)) {
assert_eq!(
apply_d(step, from).unwrap(),
NaiveDate::from_ymd(expected.0, expected.1, expected.2)
NaiveDate::from_ymd_opt(expected.0, expected.1, expected.2).unwrap()
);
}
@ -375,7 +375,7 @@ mod tests {
) -> Result<(NaiveDate, Time), Error<()>> {
delta(step).apply_date_time(
(),
NaiveDate::from_ymd(from.0, from.1, from.2),
NaiveDate::from_ymd_opt(from.0, from.1, from.2).unwrap(),
Time::new(from.3, from.4),
)
}
@ -385,7 +385,7 @@ mod tests {
assert_eq!(
apply_dt(step, from).unwrap(),
(
NaiveDate::from_ymd(expected.0, expected.1, expected.2),
NaiveDate::from_ymd_opt(expected.0, expected.1, expected.2).unwrap(),
Time::new(expected.3, expected.4)
)
);

View file

@ -75,7 +75,7 @@ impl DateRange {
pub fn days(&self) -> impl Iterator<Item = NaiveDate> {
(self.from.num_days_from_ce()..=self.until.num_days_from_ce())
.map(NaiveDate::from_num_days_from_ce)
.map(|days| NaiveDate::from_num_days_from_ce_opt(days).unwrap())
}
pub fn years(&self) -> RangeInclusive<i32> {

View file

@ -9,13 +9,14 @@ pub fn is_iso_leap_year(year: i32) -> bool {
}
pub fn year_length(year: i32) -> u32 {
NaiveDate::from_ymd(year, 12, 31).ordinal()
NaiveDate::from_ymd_opt(year, 12, 31).unwrap().ordinal()
}
pub fn month_length(year: i32, month: u32) -> u32 {
NaiveDate::from_ymd_opt(year, month + 1, 1)
.unwrap_or_else(|| NaiveDate::from_ymd(year + 1, 1, 1))
.pred()
.unwrap_or_else(|| NaiveDate::from_ymd_opt(year + 1, 1, 1).unwrap())
.pred_opt()
.unwrap()
.day()
}

View file

@ -293,7 +293,7 @@ fn parse_date_fixed(p: Pair<'_, Rule>) -> Result<DateSpec> {
assert_eq!(p.as_rule(), Rule::date_fixed);
let mut spec = DateSpec {
start: NaiveDate::from_ymd(0, 1, 1),
start: NaiveDate::from_ymd_opt(0, 1, 1).unwrap(),
start_delta: None,
start_time: None,
end: None,