(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: <Op_Semi ';'>
    )
    (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:16777215 arg_word:{(expect)} spids:[52])]
            )
            (C 
              {(test_expect_) 
                (BracedVarSub
                  token: <VSub_Number 3>
                  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:16777215 arg_word:{(expect)} spids:[394])]
            )
            (C 
              {(test_expect_) 
                (BracedVarSub
                  token: <VSub_Number 4>
                  suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{(success)})
                  spids: [399 403]
                )
              } 
              {
                (DQ ('parse date (') ($ VSub_Number '$1') 
                  (BracedVarSub
                    token: <VSub_Number 3>
                    suffix_op: 
                      (StringUnary
                        op_id: VTest_ColonPlus
                        arg_word: {(' TZ=') ($ VSub_Number '$3')}
                      )
                    spids: [408 413]
                  ) (')')
                )
              } 
              {
                (DQ ('\n') ('\tTZ=') 
                  (BracedVarSub
                    token: <VSub_Number 3>
                    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:16777215 arg_word:{(expect)} spids:[562])]
            )
            (C 
              {(test_expect_) 
                (BracedVarSub
                  token: <VSub_Number 3>
                  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)})
  ]
)