#!/bin/sh global test_description := ''test date parsing and printing'' source ./test-lib.sh # arbitrary reference time: 2009-08-30 19:20:00 global TEST_DATE_NOW := '1251660000'; export TEST_DATE_NOW proc check_relative { global t := $($TEST_DATE_NOW - $1) echo "$t -> $2" >expect test_expect_$(3:-success) "relative date ($2)" " test-date relative $t >actual && test_i18ncmp expect actual " } check_relative 5 '5 seconds ago' check_relative 300 '5 minutes ago' check_relative 18000 '5 hours ago' check_relative 432000 '5 days ago' check_relative 1728000 '3 weeks ago' check_relative 13000000 '5 months ago' check_relative 37500000 '1 year, 2 months ago' check_relative 55188000 '1 year, 9 months ago' check_relative 630000000 '20 years ago' check_relative 31449600 '12 months ago' check_relative 62985600 '2 years ago' proc check_show { global format := $1 global time := $2 global expect := $3 test_expect_success $4 "show date ($format:$time)" ' echo "$time -> $expect" >expect && test-date show:$format "$time" >actual && test_cmp expect actual ' } # arbitrary but sensible time for examples global TIME := ''1466000000 +0200'' check_show iso8601 $TIME '2016-06-15 16:13:20 +0200' check_show iso8601-strict $TIME '2016-06-15T16:13:20+02:00' check_show rfc2822 $TIME 'Wed, 15 Jun 2016 16:13:20 +0200' check_show short $TIME '2016-06-15' check_show default $TIME 'Wed Jun 15 16:13:20 2016 +0200' check_show raw $TIME '1466000000 +0200' check_show unix $TIME '1466000000' check_show iso-local $TIME '2016-06-15 14:13:20 +0000' check_show raw-local $TIME '1466000000 +0000' check_show unix-local $TIME '1466000000' # arbitrary time absurdly far in the future global FUTURE := '"5758122296 -0400'" check_show iso $FUTURE "2152-06-19 18:24:56 -0400" LONG_IS_64BIT check_show iso-local $FUTURE "2152-06-19 22:24:56 +0000" LONG_IS_64BIT proc check_parse { echo "$1 -> $2" >expect test_expect_$(4:-success) "parse date ($1$(3:+ TZ=$3))" " TZ=$(3:-$TZ) test-date parse '$1' >actual && test_cmp expect actual " } check_parse 2008 bad check_parse 2008-02 bad check_parse 2008-02-14 bad check_parse '2008-02-14 20:30:45' '2008-02-14 20:30:45 +0000' check_parse '2008-02-14 20:30:45 -0500' '2008-02-14 20:30:45 -0500' check_parse '2008-02-14 20:30:45 -0015' '2008-02-14 20:30:45 -0015' check_parse '2008-02-14 20:30:45 -5' '2008-02-14 20:30:45 +0000' check_parse '2008-02-14 20:30:45 -5:' '2008-02-14 20:30:45 +0000' check_parse '2008-02-14 20:30:45 -05' '2008-02-14 20:30:45 -0500' check_parse '2008-02-14 20:30:45 -:30' '2008-02-14 20:30:45 +0000' check_parse '2008-02-14 20:30:45 -05:00' '2008-02-14 20:30:45 -0500' check_parse '2008-02-14 20:30:45' '2008-02-14 20:30:45 -0500' EST5 proc check_approxidate { echo "$1 -> $2 +0000" >expect test_expect_$(3:-success) "parse approxidate ($1)" " test-date approxidate '$1' >actual && test_cmp expect actual " } check_approxidate now '2009-08-30 19:20:00' check_approxidate '5 seconds ago' '2009-08-30 19:19:55' check_approxidate 5.seconds.ago '2009-08-30 19:19:55' check_approxidate 10.minutes.ago '2009-08-30 19:10:00' check_approxidate yesterday '2009-08-29 19:20:00' check_approxidate 3.days.ago '2009-08-27 19:20:00' check_approxidate 3.weeks.ago '2009-08-09 19:20:00' check_approxidate 3.months.ago '2009-05-30 19:20:00' check_approxidate 2.years.3.months.ago '2007-05-30 19:20:00' check_approxidate '6am yesterday' '2009-08-29 06:00:00' check_approxidate '6pm yesterday' '2009-08-29 18:00:00' check_approxidate '3:00' '2009-08-30 03:00:00' check_approxidate '15:00' '2009-08-30 15:00:00' check_approxidate 'noon today' '2009-08-30 12:00:00' check_approxidate 'noon yesterday' '2009-08-29 12:00:00' check_approxidate 'last tuesday' '2009-08-25 19:20:00' check_approxidate 'July 5th' '2009-07-05 19:20:00' check_approxidate '06/05/2009' '2009-06-05 19:20:00' check_approxidate '06.05.2009' '2009-05-06 19:20:00' check_approxidate 'Jun 6, 5AM' '2009-06-06 05:00:00' check_approxidate '5AM Jun 6' '2009-06-06 05:00:00' check_approxidate '6AM, June 7, 2009' '2009-06-07 06:00:00' check_approxidate '2008-12-01' '2008-12-01 19:20:00' check_approxidate '2009-12-01' '2009-12-01 19:20:00' test_done (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"test date parsing and printing">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (Sentence child: (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:TEST_DATE_NOW) op: Equal rhs: {(1251660000)} spids: [17] ) ] spids: [17] ) terminator: ) (C {(export)} {(TEST_DATE_NOW)}) (FuncDef name: check_relative body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:t) op: Equal rhs: { (ArithSubPart anode: (ArithBinary op_id: Arith_Minus left: (ArithWord w:{($ VSub_Name "$TEST_DATE_NOW")}) right: (ArithWord w:{($ VSub_Number "$1")}) ) spids: [34 41] ) } spids: [33] ) ] spids: [33] ) (SimpleCommand words: [{(echo)} {(DQ ($ VSub_Name "$t") (" -> ") ($ VSub_Number "$2"))}] redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(expect)} spids:[52])] ) (C {(test_expect_) (BracedVarSub token: suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{(success)}) spids: [57 61] ) } {(DQ ("relative date (") ($ VSub_Number "$2") (")"))} { (DQ ("\n") ("\ttest-date relative ") ($ VSub_Name "$t") (" >actual &&\n") ("\ttest_i18ncmp expect actual\n") ("\t") ) } ) ] spids: [30] ) spids: [26 29] ) (C {(check_relative)} {(5)} {(SQ <"5 seconds ago">)}) (C {(check_relative)} {(300)} {(SQ <"5 minutes ago">)}) (C {(check_relative)} {(18000)} {(SQ <"5 hours ago">)}) (C {(check_relative)} {(432000)} {(SQ <"5 days ago">)}) (C {(check_relative)} {(1728000)} {(SQ <"3 weeks ago">)}) (C {(check_relative)} {(13000000)} {(SQ <"5 months ago">)}) (C {(check_relative)} {(37500000)} {(SQ <"1 year, 2 months ago">)}) (C {(check_relative)} {(55188000)} {(SQ <"1 year, 9 months ago">)}) (C {(check_relative)} {(630000000)} {(SQ <"20 years ago">)}) (C {(check_relative)} {(31449600)} {(SQ <"12 months ago">)}) (C {(check_relative)} {(62985600)} {(SQ <"2 years ago">)}) (FuncDef name: check_show body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:format) op: Equal rhs: {($ VSub_Number "$1")} spids: [178] ) ] spids: [178] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:time) op: Equal rhs: {($ VSub_Number "$2")} spids: [182] ) ] spids: [182] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:expect) op: Equal rhs: {($ VSub_Number "$3")} spids: [186] ) ] spids: [186] ) (C {(test_expect_success)} {($ VSub_Number "$4")} {(DQ ("show date (") ($ VSub_Name "$format") (":") ($ VSub_Name "$time") (")"))} { (SQ <"\n"> <"\t\techo \"$time -> $expect\" >expect &&\n"> <"\t\ttest-date show:$format \"$time\" >actual &&\n"> <"\t\ttest_cmp expect actual\n"> <"\t"> ) } ) ] spids: [175] ) spids: [170 174] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:TIME) op: Equal rhs: {(SQ <"1466000000 +0200">)} spids: [216] ) ] spids: [216] ) (C {(check_show)} {(iso8601)} {(DQ ($ VSub_Name "$TIME"))} {(SQ <"2016-06-15 16:13:20 +0200">)}) (C {(check_show)} {(iso8601-strict)} {(DQ ($ VSub_Name "$TIME"))} {(SQ <"2016-06-15T16:13:20+02:00">)}) (C {(check_show)} {(rfc2822)} {(DQ ($ VSub_Name "$TIME"))} {(SQ <"Wed, 15 Jun 2016 16:13:20 +0200">)}) (C {(check_show)} {(short)} {(DQ ($ VSub_Name "$TIME"))} {(SQ <2016-06-15>)}) (C {(check_show)} {(default)} {(DQ ($ VSub_Name "$TIME"))} {(SQ <"Wed Jun 15 16:13:20 2016 +0200">)}) (C {(check_show)} {(raw)} {(DQ ($ VSub_Name "$TIME"))} {(SQ <"1466000000 +0200">)}) (C {(check_show)} {(unix)} {(DQ ($ VSub_Name "$TIME"))} {(SQ <1466000000>)}) (C {(check_show)} {(iso-local)} {(DQ ($ VSub_Name "$TIME"))} {(SQ <"2016-06-15 14:13:20 +0000">)}) (C {(check_show)} {(raw-local)} {(DQ ($ VSub_Name "$TIME"))} {(SQ <"1466000000 +0000">)}) (C {(check_show)} {(unix-local)} {(DQ ($ VSub_Name "$TIME"))} {(SQ <1466000000>)}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:FUTURE) op: Equal rhs: {(DQ ("5758122296 -0400"))} spids: [345] ) ] spids: [345] ) (C {(check_show)} {(iso)} {(DQ ($ VSub_Name "$FUTURE"))} {(DQ ("2152-06-19 18:24:56 -0400"))} {(LONG_IS_64BIT)} ) (C {(check_show)} {(iso-local)} {(DQ ($ VSub_Name "$FUTURE"))} {(DQ ("2152-06-19 22:24:56 +0000"))} {(LONG_IS_64BIT)} ) (FuncDef name: check_parse body: (BraceGroup children: [ (SimpleCommand words: [{(echo)} {(DQ ($ VSub_Number "$1") (" -> ") ($ VSub_Number "$2"))}] redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(expect)} spids:[394])] ) (C {(test_expect_) (BracedVarSub token: suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{(success)}) spids: [399 403] ) } { (DQ ("parse date (") ($ VSub_Number "$1") (BracedVarSub token: suffix_op: (StringUnary op_id: VTest_ColonPlus arg_word: {(" TZ=") ($ VSub_Number "$3")} ) spids: [408 413] ) (")") ) } { (DQ ("\n") ("\tTZ=") (BracedVarSub token: suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{($ VSub_Name "$TZ")}) spids: [420 424] ) (" test-date parse '") ($ VSub_Number "$1") ("' >actual &&\n") ("\ttest_cmp expect actual\n") ("\t") ) } ) ] spids: [383] ) spids: [379 382] ) (C {(check_parse)} {(2008)} {(bad)}) (C {(check_parse)} {(2008-02)} {(bad)}) (C {(check_parse)} {(2008-02-14)} {(bad)}) (C {(check_parse)} {(SQ <"2008-02-14 20:30:45">)} {(SQ <"2008-02-14 20:30:45 +0000">)}) (C {(check_parse)} {(SQ <"2008-02-14 20:30:45 -0500">)} {(SQ <"2008-02-14 20:30:45 -0500">)}) (C {(check_parse)} {(SQ <"2008-02-14 20:30:45 -0015">)} {(SQ <"2008-02-14 20:30:45 -0015">)}) (C {(check_parse)} {(SQ <"2008-02-14 20:30:45 -5">)} {(SQ <"2008-02-14 20:30:45 +0000">)}) (C {(check_parse)} {(SQ <"2008-02-14 20:30:45 -5:">)} {(SQ <"2008-02-14 20:30:45 +0000">)}) (C {(check_parse)} {(SQ <"2008-02-14 20:30:45 -05">)} {(SQ <"2008-02-14 20:30:45 -0500">)}) (C {(check_parse)} {(SQ <"2008-02-14 20:30:45 -:30">)} {(SQ <"2008-02-14 20:30:45 +0000">)}) (C {(check_parse)} {(SQ <"2008-02-14 20:30:45 -05:00">)} {(SQ <"2008-02-14 20:30:45 -0500">)}) (C {(check_parse)} {(SQ <"2008-02-14 20:30:45">)} {(SQ <"2008-02-14 20:30:45 -0500">)} {(EST5)}) (FuncDef name: check_approxidate body: (BraceGroup children: [ (SimpleCommand words: [{(echo)} {(DQ ($ VSub_Number "$1") (" -> ") ($ VSub_Number "$2") (" +0000"))}] redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(expect)} spids:[562])] ) (C {(test_expect_) (BracedVarSub token: suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{(success)}) spids: [567 571] ) } {(DQ ("parse approxidate (") ($ VSub_Number "$1") (")"))} { (DQ ("\n") ("\ttest-date approxidate '") ($ VSub_Number "$1") ("' >actual &&\n") ("\ttest_cmp expect actual\n") ("\t") ) } ) ] spids: [550] ) spids: [546 549] ) (C {(check_approxidate)} {(now)} {(SQ <"2009-08-30 19:20:00">)}) (C {(check_approxidate)} {(SQ <"5 seconds ago">)} {(SQ <"2009-08-30 19:19:55">)}) (C {(check_approxidate)} {(5.seconds.ago)} {(SQ <"2009-08-30 19:19:55">)}) (C {(check_approxidate)} {(10.minutes.ago)} {(SQ <"2009-08-30 19:10:00">)}) (C {(check_approxidate)} {(yesterday)} {(SQ <"2009-08-29 19:20:00">)}) (C {(check_approxidate)} {(3.days.ago)} {(SQ <"2009-08-27 19:20:00">)}) (C {(check_approxidate)} {(3.weeks.ago)} {(SQ <"2009-08-09 19:20:00">)}) (C {(check_approxidate)} {(3.months.ago)} {(SQ <"2009-05-30 19:20:00">)}) (C {(check_approxidate)} {(2.years.3.months.ago)} {(SQ <"2007-05-30 19:20:00">)}) (C {(check_approxidate)} {(SQ <"6am yesterday">)} {(SQ <"2009-08-29 06:00:00">)}) (C {(check_approxidate)} {(SQ <"6pm yesterday">)} {(SQ <"2009-08-29 18:00:00">)}) (C {(check_approxidate)} {(SQ <"3:00">)} {(SQ <"2009-08-30 03:00:00">)}) (C {(check_approxidate)} {(SQ <"15:00">)} {(SQ <"2009-08-30 15:00:00">)}) (C {(check_approxidate)} {(SQ <"noon today">)} {(SQ <"2009-08-30 12:00:00">)}) (C {(check_approxidate)} {(SQ <"noon yesterday">)} {(SQ <"2009-08-29 12:00:00">)}) (C {(check_approxidate)} {(SQ <"last tuesday">)} {(SQ <"2009-08-25 19:20:00">)}) (C {(check_approxidate)} {(SQ <"July 5th">)} {(SQ <"2009-07-05 19:20:00">)}) (C {(check_approxidate)} {(SQ <06/05/2009>)} {(SQ <"2009-06-05 19:20:00">)}) (C {(check_approxidate)} {(SQ <06.05.2009>)} {(SQ <"2009-05-06 19:20:00">)}) (C {(check_approxidate)} {(SQ <"Jun 6, 5AM">)} {(SQ <"2009-06-06 05:00:00">)}) (C {(check_approxidate)} {(SQ <"5AM Jun 6">)} {(SQ <"2009-06-06 05:00:00">)}) (C {(check_approxidate)} {(SQ <"6AM, June 7, 2009">)} {(SQ <"2009-06-07 06:00:00">)}) (C {(check_approxidate)} {(SQ <2008-12-01>)} {(SQ <"2008-12-01 19:20:00">)}) (C {(check_approxidate)} {(SQ <2009-12-01>)} {(SQ <"2009-12-01 19:20:00">)}) (C {(test_done)}) ] )