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