(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)})
  ]
)