diff options
Diffstat (limited to 'Data/Libraries/Penlight/tests/test-date.lua')
-rw-r--r-- | Data/Libraries/Penlight/tests/test-date.lua | 87 |
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') |