summaryrefslogtreecommitdiff
path: root/Data/Libraries/Penlight/tests/test-date.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Data/Libraries/Penlight/tests/test-date.lua')
-rw-r--r--Data/Libraries/Penlight/tests/test-date.lua87
1 files changed, 87 insertions, 0 deletions
diff --git a/Data/Libraries/Penlight/tests/test-date.lua b/Data/Libraries/Penlight/tests/test-date.lua
new file mode 100644
index 0000000..6a91a09
--- /dev/null
+++ b/Data/Libraries/Penlight/tests/test-date.lua
@@ -0,0 +1,87 @@
+local test = require 'pl.test'
+local asserteq, assertmatch = test.asserteq, test.assertmatch
+local dump = require 'pl.pretty'.dump
+local T = require 'pl.test'.tuple
+
+local Date = require 'pl.Date'
+
+iso = Date.Format 'yyyy-mm-dd' -- ISO date
+d = iso:parse '2010-04-10'
+asserteq(T(d:day(),d:month(),d:year()),T(10,4,2010))
+amer = Date.Format 'mm/dd/yyyy' -- American style
+s = amer:tostring(d)
+dc = amer:parse(s)
+asserteq(d,dc)
+
+d = Date() -- today
+d:add { day = 1 } -- tomorrow
+assert(d > Date())
+
+--------- Time intervals -----
+-- new explicit Date.Interval class; also returned by Date:diff
+d1 = Date.Interval(1202)
+d2 = Date.Interval(1500)
+asserteq(tostring(d2:diff(d1)),"4 min 58 sec ")
+
+-------- testing 'flexible' date parsing ---------
+
+
+local df = Date.Format()
+
+function parse_date (s)
+ return df:parse(s)
+end
+
+-- ISO 8601
+-- specified as UTC plus/minus offset
+
+function parse_utc (s)
+ local d = parse_date(s)
+ return d:toUTC()
+end
+
+asserteq(parse_utc '2010-05-10 12:35:23Z', Date(2010,05,10,12,35,23))
+asserteq(parse_utc '2008-10-03T14:30+02', Date(2008,10,03,12,30))
+asserteq(parse_utc '2008-10-03T14:00-02:00',Date(2008,10,03,16,0))
+
+---- can't do anything before 1970, which is somewhat unfortunate....
+--parse_date '20/03/59'
+
+asserteq(parse_date '15:30', Date {hour=15,min=30})
+asserteq(parse_date '8.05pm', Date {hour=20,min=5})
+asserteq(parse_date '28/10/02', Date {year=2002,month=10,day=28})
+asserteq(parse_date ' 5 Feb 2012 ', Date {year=2012,month=2,day=5})
+asserteq(parse_date '20 Jul ', Date {month=7,day=20})
+asserteq(parse_date '05/04/02 15:30:43', Date{year=2002,month=4,day=5,hour=15,min=30,sec=43})
+asserteq(parse_date 'march', Date {month=3})
+asserteq(parse_date '2010-05-23T0130', Date{year=2010,month=5,day=23,hour=1,min=30})
+asserteq(parse_date '2008-10-03T14:30:45', Date{year=2008,month=10,day=3,hour=14,min=30,sec=45})
+
+-- allow for a comma after the month...
+asserteq(parse_date '18 July, 2013 12:00:00', Date{year=2013,month=07,day=18,hour=12,min=0,sec=0})
+
+-- This ISO format must result in a UTC date
+local d = parse_date '2016-05-01T14:30:00Z'
+asserteq(d:year(),2016)
+asserteq(d:month(),5)
+asserteq(d:day(),1)
+asserteq(d:hour(),14)
+asserteq(d:min(),30)
+asserteq(d:sec(),0)
+
+function err (status,e)
+ return e
+end
+
+assertmatch(err(parse_date('2005-10-40 01:30')),'40 is not between 1 and 31')
+assertmatch(err(parse_date('14.20pm')),'14 is not between 0 and 12')
+
+local d = parse_date '2007-08-10'
+-- '+' works like add, but can also work with intervals
+local nxt = d + {month=1}
+-- '-' is an alias for diff method
+asserteq(tostring(nxt - d), '1 month ')
+
+--- Can explicitly get UTC date; these of course refer to same time
+local now,utc = Date(), Date 'utc'
+asserteq(tostring(now - utc),'zero')