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

4
Cargo.lock generated
View file

@ -69,9 +69,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]] [[package]]
name = "chrono" name = "chrono"
version = "0.4.22" version = "0.4.23"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f"
dependencies = [ dependencies = [
"iana-time-zone", "iana-time-zone",
"js-sys", "js-sys",

View file

@ -4,7 +4,7 @@ version = "0.2.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
chrono = "0.4.22" chrono = "0.4.23"
clap = { version = "4.0.18", features = ["derive"] } clap = { version = "4.0.18", features = ["derive"] }
codespan-reporting = "0.11.1" codespan-reporting = "0.11.1"
colored = "2.0.0" colored = "2.0.0"

View file

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

View file

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

View file

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

View file

@ -75,7 +75,7 @@ impl DateRange {
pub fn days(&self) -> impl Iterator<Item = NaiveDate> { pub fn days(&self) -> impl Iterator<Item = NaiveDate> {
(self.from.num_days_from_ce()..=self.until.num_days_from_ce()) (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> { 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 { 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 { pub fn month_length(year: i32, month: u32) -> u32 {
NaiveDate::from_ymd_opt(year, month + 1, 1) NaiveDate::from_ymd_opt(year, month + 1, 1)
.unwrap_or_else(|| NaiveDate::from_ymd(year + 1, 1, 1)) .unwrap_or_else(|| NaiveDate::from_ymd_opt(year + 1, 1, 1).unwrap())
.pred() .pred_opt()
.unwrap()
.day() .day()
} }

View file

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