From fce0671de7b1439bb6b71340b80430e1f0d1a1e7 Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Thu, 16 Apr 2020 17:04:27 -0700 Subject: [PATCH 1/3] fix https://github.com/nim-lang/RFCs/issues/211: `var a: DateTime` works --- lib/pure/times.nim | 4 +++- tests/stdlib/ttimes.nim | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/pure/times.nim b/lib/pure/times.nim index b9410e14c4ec6..81f9bc6840f23 100644 --- a/lib/pure/times.nim +++ b/lib/pure/times.nim @@ -260,6 +260,7 @@ type Month* = enum ## Represents a month. Note that the enum starts at ``1``, ## so ``ord(month)`` will give the month number in the ## range ``1..12``. + # mInvalid = (0, "Invalid") # intentionally left out so `items` works mJan = (1, "January") mFeb = "February" mMar = "March" @@ -296,7 +297,8 @@ when defined(nimHasStyleChecks): {.pop.} type - MonthdayRange* = range[1..31] + MonthdayRange* = range[0..31] + ## 0 represents an invalid month HourRange* = range[0..23] MinuteRange* = range[0..59] SecondRange* = range[0..60] diff --git a/tests/stdlib/ttimes.nim b/tests/stdlib/ttimes.nim index 60e2ffdbe389c..58c56812f6a24 100644 --- a/tests/stdlib/ttimes.nim +++ b/tests/stdlib/ttimes.nim @@ -614,6 +614,16 @@ suite "ttimes": doAssert x + between(x, y) == y doAssert between(x, y) == 1.months + 1.weeks + test "default DateTime": # https://github.com/nim-lang/RFCs/issues/211 + var a: DateTime + doAssert a == DateTime.default + doAssert ($a).len > 0 # no crash + doAssert a.month.Month.ord == 0 + doAssert a.month.Month == cast[Month](0) + var num = 0 + for ai in Month: num.inc + doAssert num == 12 + test "inX procs": doAssert initDuration(seconds = 1).inSeconds == 1 doAssert initDuration(seconds = -1).inSeconds == -1 From 5f8a33b666148c46411ba72a96b10b65b52c13d9 Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Thu, 16 Apr 2020 19:37:07 -0700 Subject: [PATCH 2/3] assertValidDate checks for sentinel month --- lib/pure/times.nim | 9 +++++++-- tests/stdlib/ttimes.nim | 11 ++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/pure/times.nim b/lib/pure/times.nim index 81f9bc6840f23..7060fa69c4116 100644 --- a/lib/pure/times.nim +++ b/lib/pure/times.nim @@ -672,7 +672,7 @@ proc getDaysInYear*(year: int): int = proc assertValidDate(monthday: MonthdayRange, month: Month, year: int) {.inline.} = - assert monthday <= getDaysInMonth(month, year), + assert monthday > 0 and monthday <= getDaysInMonth(month, year), $year & "-" & intToStr(ord(month), 2) & "-" & $monthday & " is not a valid date" @@ -1578,9 +1578,14 @@ proc `<=`*(a, b: DateTime): bool = ## Returns true if ``a`` happened before or at the same time as ``b``. return a.toTime <= b.toTime +proc isDefault[T](a: T): bool = + system.`==`(a, default(T)) + proc `==`*(a, b: DateTime): bool = ## Returns true if ``a`` and ``b`` represent the same point in time. - return a.toTime == b.toTime + if a.isDefault: b.isDefault + elif b.isDefault: false + else: a.toTime == b.toTime proc isStaticInterval(interval: TimeInterval): bool = interval.years == 0 and interval.months == 0 and diff --git a/tests/stdlib/ttimes.nim b/tests/stdlib/ttimes.nim index 58c56812f6a24..a8da15f3d8889 100644 --- a/tests/stdlib/ttimes.nim +++ b/tests/stdlib/ttimes.nim @@ -615,14 +615,19 @@ suite "ttimes": doAssert between(x, y) == 1.months + 1.weeks test "default DateTime": # https://github.com/nim-lang/RFCs/issues/211 + var num = 0 + for ai in Month: num.inc + doAssert num == 12 + var a: DateTime doAssert a == DateTime.default doAssert ($a).len > 0 # no crash doAssert a.month.Month.ord == 0 doAssert a.month.Month == cast[Month](0) - var num = 0 - for ai in Month: num.inc - doAssert num == 12 + doAssert a.monthday == 0 + + doAssertRaises(AssertionError): discard getDayOfWeek(a.monthday, a.month, a.year) + doAssertRaises(AssertionError): discard a.toTime test "inX procs": doAssert initDuration(seconds = 1).inSeconds == 1 From 72c867d3917c6a83eab91a9ca7264d3ffa57b8d3 Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Fri, 17 Apr 2020 06:46:50 -0700 Subject: [PATCH 3/3] fix typo --- lib/pure/times.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pure/times.nim b/lib/pure/times.nim index 7060fa69c4116..2313afbff2f78 100644 --- a/lib/pure/times.nim +++ b/lib/pure/times.nim @@ -298,7 +298,7 @@ when defined(nimHasStyleChecks): type MonthdayRange* = range[0..31] - ## 0 represents an invalid month + ## 0 represents an invalid day of the month HourRange* = range[0..23] MinuteRange* = range[0..59] SecondRange* = range[0..60]