(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:test_description) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'test date parsing and printing' span_id:6))} spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.CommandList children: [ (command.Sentence child: (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:TEST_DATE_NOW) op: assign_op.Equal rhs: {(1251660000)} spids: [17] ) ] ) terminator: (Token id:Id.Op_Semi val:';' span_id:19) ) (C {(export)} {(TEST_DATE_NOW)}) ] ) (command.ShFunction name: check_relative body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:t) op: assign_op.Equal rhs: { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Minus left: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$TEST_DATE_NOW')}) right: (arith_expr.ArithWord w:{($ Id.VSub_Number '$1')}) ) ) } spids: [33] ) ] ) (command.Simple words: [{(echo)} {(DQ ($ Id.VSub_DollarName '$t') (' -> ') ($ Id.VSub_Number '$2'))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:52) fd: -1 arg_word: {(expect)} ) ] ) (C {(test_expect_) (braced_var_sub token: (Token id:Id.VSub_Number val:3 span_id:58) suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonHyphen arg_word:{(success)}) ) } {(DQ ('relative date (') ($ Id.VSub_Number '$2') (')'))} { (DQ ('\n') ('\ttest-date relative ') ($ Id.VSub_DollarName '$t') (' >actual &&\n') ('\ttest_i18ncmp expect actual\n') ('\t') ) } ) ] ) ) (C {(check_relative)} {(5)} {(SQ (Token id:Id.Lit_Chars val:'5 seconds ago' span_id:86))}) (C {(check_relative)} {(300)} {(SQ (Token id:Id.Lit_Chars val:'5 minutes ago' span_id:94))}) (C {(check_relative)} {(18000)} {(SQ (Token id:Id.Lit_Chars val:'5 hours ago' span_id:102))}) (C {(check_relative)} {(432000)} {(SQ (Token id:Id.Lit_Chars val:'5 days ago' span_id:110))}) (C {(check_relative)} {(1728000)} {(SQ (Token id:Id.Lit_Chars val:'3 weeks ago' span_id:118))}) (C {(check_relative)} {(13000000)} {(SQ (Token id:Id.Lit_Chars val:'5 months ago' span_id:126))}) (C {(check_relative)} {(37500000)} {(SQ (Token id:Id.Lit_Chars val:'1 year, 2 months ago' span_id:134))} ) (C {(check_relative)} {(55188000)} {(SQ (Token id:Id.Lit_Chars val:'1 year, 9 months ago' span_id:142))} ) (C {(check_relative)} {(630000000)} {(SQ (Token id:Id.Lit_Chars val:'20 years ago' span_id:150))}) (C {(check_relative)} {(31449600)} {(SQ (Token id:Id.Lit_Chars val:'12 months ago' span_id:158))}) (C {(check_relative)} {(62985600)} {(SQ (Token id:Id.Lit_Chars val:'2 years ago' span_id:166))}) (command.ShFunction name: check_show body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:format) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [178] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:time) op: assign_op.Equal rhs: {($ Id.VSub_Number '$2')} spids: [182] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:expect) op: assign_op.Equal rhs: {($ Id.VSub_Number '$3')} spids: [186] ) ] ) (C {(test_expect_success)} {($ Id.VSub_Number '$4')} { (DQ ('show date (') ($ Id.VSub_DollarName '$format') (':') ($ Id.VSub_DollarName '$time') (')') ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:203) (Token id: Id.Lit_Chars val: '\t\techo "$time -> $expect" >expect &&\n' span_id: 204 ) (Token id:Id.Lit_Chars val:'\t\ttest-date show:$format "$time" >actual &&\n' span_id:205) (Token id: Id.Lit_Chars val: '\t\ttest_cmp expect actual\n' span_id: 206 ) (Token id:Id.Lit_Chars val:'\t' span_id:207) ) } ) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:TIME) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'1466000000 +0200' span_id:218))} spids: [216] ) ] ) (C {(check_show)} {(iso8601)} {(DQ ($ Id.VSub_DollarName '$TIME'))} {(SQ (Token id:Id.Lit_Chars val:'2016-06-15 16:13:20 +0200' span_id:230))} ) (C {(check_show)} {(iso8601-strict)} {(DQ ($ Id.VSub_DollarName '$TIME'))} {(SQ (Token id:Id.Lit_Chars val:'2016-06-15T16:13:20+02:00' span_id:242))} ) (C {(check_show)} {(rfc2822)} {(DQ ($ Id.VSub_DollarName '$TIME'))} {(SQ (Token id:Id.Lit_Chars val:'Wed, 15 Jun 2016 16:13:20 +0200' span_id:254))} ) (C {(check_show)} {(short)} {(DQ ($ Id.VSub_DollarName '$TIME'))} {(SQ (Token id:Id.Lit_Chars val:2016-06-15 span_id:266))} ) (C {(check_show)} {(default)} {(DQ ($ Id.VSub_DollarName '$TIME'))} {(SQ (Token id:Id.Lit_Chars val:'Wed Jun 15 16:13:20 2016 +0200' span_id:278))} ) (C {(check_show)} {(raw)} {(DQ ($ Id.VSub_DollarName '$TIME'))} {(SQ (Token id:Id.Lit_Chars val:'1466000000 +0200' span_id:290))} ) (C {(check_show)} {(unix)} {(DQ ($ Id.VSub_DollarName '$TIME'))} {(SQ (Token id:Id.Lit_Chars val:1466000000 span_id:302))} ) (C {(check_show)} {(iso-local)} {(DQ ($ Id.VSub_DollarName '$TIME'))} {(SQ (Token id:Id.Lit_Chars val:'2016-06-15 14:13:20 +0000' span_id:314))} ) (C {(check_show)} {(raw-local)} {(DQ ($ Id.VSub_DollarName '$TIME'))} {(SQ (Token id:Id.Lit_Chars val:'1466000000 +0000' span_id:326))} ) (C {(check_show)} {(unix-local)} {(DQ ($ Id.VSub_DollarName '$TIME'))} {(SQ (Token id:Id.Lit_Chars val:1466000000 span_id:338))} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:FUTURE) op: assign_op.Equal rhs: {(DQ ('5758122296 -0400'))} spids: [345] ) ] ) (C {(check_show)} {(iso)} {(DQ ($ Id.VSub_DollarName '$FUTURE'))} {(DQ ('2152-06-19 18:24:56 -0400'))} {(LONG_IS_64BIT)} ) (C {(check_show)} {(iso-local)} {(DQ ($ Id.VSub_DollarName '$FUTURE'))} {(DQ ('2152-06-19 22:24:56 +0000'))} {(LONG_IS_64BIT)} ) (command.ShFunction name: check_parse body: (command.BraceGroup children: [ (command.Simple words: [{(echo)} {(DQ ($ Id.VSub_Number '$1') (' -> ') ($ Id.VSub_Number '$2'))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:394) fd: -1 arg_word: {(expect)} ) ] ) (C {(test_expect_) (braced_var_sub token: (Token id:Id.VSub_Number val:4 span_id:400) suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonHyphen arg_word:{(success)}) ) } { (DQ ('parse date (') ($ Id.VSub_Number '$1') (braced_var_sub token: (Token id:Id.VSub_Number val:3 span_id:409) suffix_op: (suffix_op.Unary op_id: Id.VTest_ColonPlus arg_word: {(' TZ=') ($ Id.VSub_Number '$3')} ) ) (')') ) } { (DQ ('\n') ('\tTZ=') (braced_var_sub token: (Token id:Id.VSub_Number val:3 span_id:421) suffix_op: (suffix_op.Unary op_id: Id.VTest_ColonHyphen arg_word: {($ Id.VSub_DollarName '$TZ')} ) ) (" test-date parse '") ($ Id.VSub_Number '$1') ("' >actual &&\n") ('\ttest_cmp expect actual\n') ('\t') ) } ) ] ) ) (C {(check_parse)} {(2008)} {(bad)}) (C {(check_parse)} {(2008-02)} {(bad)}) (C {(check_parse)} {(2008-02-14)} {(bad)}) (C {(check_parse)} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45' span_id:456))} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45 +0000' span_id:460))} ) (C {(check_parse)} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45 -0500' span_id:466))} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45 -0500' span_id:470))} ) (C {(check_parse)} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45 -0015' span_id:476))} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45 -0015' span_id:480))} ) (C {(check_parse)} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45 -5' span_id:486))} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45 +0000' span_id:490))} ) (C {(check_parse)} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45 -5:' span_id:496))} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45 +0000' span_id:500))} ) (C {(check_parse)} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45 -05' span_id:506))} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45 -0500' span_id:510))} ) (C {(check_parse)} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45 -:30' span_id:516))} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45 +0000' span_id:520))} ) (C {(check_parse)} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45 -05:00' span_id:526))} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45 -0500' span_id:530))} ) (C {(check_parse)} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45' span_id:536))} {(SQ (Token id:Id.Lit_Chars val:'2008-02-14 20:30:45 -0500' span_id:540))} {(EST5)} ) (command.ShFunction name: check_approxidate body: (command.BraceGroup children: [ (command.Simple words: [ {(echo)} {(DQ ($ Id.VSub_Number '$1') (' -> ') ($ Id.VSub_Number '$2') (' +0000'))} ] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:562) fd: -1 arg_word: {(expect)} ) ] ) (C {(test_expect_) (braced_var_sub token: (Token id:Id.VSub_Number val:3 span_id:568) suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonHyphen arg_word:{(success)}) ) } {(DQ ('parse approxidate (') ($ Id.VSub_Number '$1') (')'))} { (DQ ('\n') ("\ttest-date approxidate '") ($ Id.VSub_Number '$1') ("' >actual &&\n") ('\ttest_cmp expect actual\n') ('\t') ) } ) ] ) ) (C {(check_approxidate)} {(now)} {(SQ (Token id:Id.Lit_Chars val:'2009-08-30 19:20:00' span_id:596))}) (C {(check_approxidate)} {(SQ (Token id:Id.Lit_Chars val:'5 seconds ago' span_id:602))} {(SQ (Token id:Id.Lit_Chars val:'2009-08-30 19:19:55' span_id:606))} ) (C {(check_approxidate)} {(5.seconds.ago)} {(SQ (Token id:Id.Lit_Chars val:'2009-08-30 19:19:55' span_id:614))} ) (C {(check_approxidate)} {(10.minutes.ago)} {(SQ (Token id:Id.Lit_Chars val:'2009-08-30 19:10:00' span_id:622))} ) (C {(check_approxidate)} {(yesterday)} {(SQ (Token id:Id.Lit_Chars val:'2009-08-29 19:20:00' span_id:630))} ) (C {(check_approxidate)} {(3.days.ago)} {(SQ (Token id:Id.Lit_Chars val:'2009-08-27 19:20:00' span_id:638))} ) (C {(check_approxidate)} {(3.weeks.ago)} {(SQ (Token id:Id.Lit_Chars val:'2009-08-09 19:20:00' span_id:646))} ) (C {(check_approxidate)} {(3.months.ago)} {(SQ (Token id:Id.Lit_Chars val:'2009-05-30 19:20:00' span_id:654))} ) (C {(check_approxidate)} {(2.years.3.months.ago)} {(SQ (Token id:Id.Lit_Chars val:'2007-05-30 19:20:00' span_id:662))} ) (C {(check_approxidate)} {(SQ (Token id:Id.Lit_Chars val:'6am yesterday' span_id:669))} {(SQ (Token id:Id.Lit_Chars val:'2009-08-29 06:00:00' span_id:673))} ) (C {(check_approxidate)} {(SQ (Token id:Id.Lit_Chars val:'6pm yesterday' span_id:679))} {(SQ (Token id:Id.Lit_Chars val:'2009-08-29 18:00:00' span_id:683))} ) (C {(check_approxidate)} {(SQ (Token id:Id.Lit_Chars val:'3:00' span_id:689))} {(SQ (Token id:Id.Lit_Chars val:'2009-08-30 03:00:00' span_id:693))} ) (C {(check_approxidate)} {(SQ (Token id:Id.Lit_Chars val:'15:00' span_id:699))} {(SQ (Token id:Id.Lit_Chars val:'2009-08-30 15:00:00' span_id:703))} ) (C {(check_approxidate)} {(SQ (Token id:Id.Lit_Chars val:'noon today' span_id:709))} {(SQ (Token id:Id.Lit_Chars val:'2009-08-30 12:00:00' span_id:713))} ) (C {(check_approxidate)} {(SQ (Token id:Id.Lit_Chars val:'noon yesterday' span_id:719))} {(SQ (Token id:Id.Lit_Chars val:'2009-08-29 12:00:00' span_id:723))} ) (C {(check_approxidate)} {(SQ (Token id:Id.Lit_Chars val:'last tuesday' span_id:730))} {(SQ (Token id:Id.Lit_Chars val:'2009-08-25 19:20:00' span_id:734))} ) (C {(check_approxidate)} {(SQ (Token id:Id.Lit_Chars val:'July 5th' span_id:740))} {(SQ (Token id:Id.Lit_Chars val:'2009-07-05 19:20:00' span_id:744))} ) (C {(check_approxidate)} {(SQ (Token id:Id.Lit_Chars val:06/05/2009 span_id:750))} {(SQ (Token id:Id.Lit_Chars val:'2009-06-05 19:20:00' span_id:754))} ) (C {(check_approxidate)} {(SQ (Token id:Id.Lit_Chars val:06.05.2009 span_id:760))} {(SQ (Token id:Id.Lit_Chars val:'2009-05-06 19:20:00' span_id:764))} ) (C {(check_approxidate)} {(SQ (Token id:Id.Lit_Chars val:'Jun 6, 5AM' span_id:771))} {(SQ (Token id:Id.Lit_Chars val:'2009-06-06 05:00:00' span_id:775))} ) (C {(check_approxidate)} {(SQ (Token id:Id.Lit_Chars val:'5AM Jun 6' span_id:781))} {(SQ (Token id:Id.Lit_Chars val:'2009-06-06 05:00:00' span_id:785))} ) (C {(check_approxidate)} {(SQ (Token id:Id.Lit_Chars val:'6AM, June 7, 2009' span_id:791))} {(SQ (Token id:Id.Lit_Chars val:'2009-06-07 06:00:00' span_id:795))} ) (C {(check_approxidate)} {(SQ (Token id:Id.Lit_Chars val:2008-12-01 span_id:802))} {(SQ (Token id:Id.Lit_Chars val:'2008-12-01 19:20:00' span_id:806))} ) (C {(check_approxidate)} {(SQ (Token id:Id.Lit_Chars val:2009-12-01 span_id:812))} {(SQ (Token id:Id.Lit_Chars val:'2009-12-01 19:20:00' span_id:816))} ) (C {(test_done)}) ] )