(command.CommandList
  children: [
    (command.ShAssignment
      left: <Id.Lit_VarLike 'test_description='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'test_description='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'test_description='> name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'log/show --expand-tabs'>)}
        )
      ]
      redirects: []
    )
    (command.Simple
      blame_tok: <.>
      more_env: []
      words: [{<.>} {<'./test-lib.sh'>}]
      redirects: []
      do_fork: T
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'HT='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'HT='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'HT='> name:HT)
          op: assign_op.Equal
          rhs: {(DQ <'\t'>)}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'title='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'title='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'title='> name:title)
          op: assign_op.Equal
          rhs: {(SQ <'tab indent at the beginning of the title line'>)}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'body='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'body='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'body='> name:body)
          op: assign_op.Equal
          rhs: {(SQ <'tab indent on a line in the body'>)}
        )
      ]
      redirects: []
    )
    (command.ShFunction
      name_tok: <count_expand>
      name: count_expand
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike 'expect='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'expect='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'expect='> name:expect)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.Sentence
              child: 
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'count='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'count='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'count='> name:count)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (word_part.ArithSub
                            left: <Id.Left_DollarDParen '$(('>
                            anode: 
                              (arith_expr.Binary
                                op_id: Id.Arith_Plus
                                left: {($ Id.VSub_Number 1)}
                                right: {($ Id.VSub_Number 2)}
                              )
                            right: <Id.Right_DollarDParen _>
                          )
                        }
                    )
                  ]
                  redirects: []
                )
              terminator: <Id.Op_Semi _>
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Simple
                      blame_tok: <test>
                      more_env: []
                      words: [{<test>} {($ Id.VSub_DollarName count)} {<-gt>} {<0>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'expect='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'expect='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'expect='> name:expect)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName expect) <' '>)}
                        )
                      ]
                      redirects: []
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'count='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'count='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'count='> name:count)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (word_part.ArithSub
                                left: <Id.Left_DollarDParen '$(('>
                                anode: 
                                  (arith_expr.Binary
                                    op_id: Id.Arith_Minus
                                    left: {($ Id.VSub_DollarName count)}
                                    right: {<Id.Lit_Digits 1>}
                                  )
                                right: <Id.Right_DollarDParen _>
                              )
                            }
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
            (command.Simple
              blame_tok: <shift>
              more_env: []
              words: [{<shift>} {<2>}]
              redirects: []
              do_fork: T
            )
            (command.Sentence
              child: 
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'count='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'count='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'count='> name:count)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number 1)}
                    )
                  ]
                  redirects: []
                )
              terminator: <Id.Op_Semi _>
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Simple
                      blame_tok: <test>
                      more_env: []
                      words: [{<test>} {($ Id.VSub_DollarName count)} {<-gt>} {<0>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'expect='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'expect='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'expect='> name:expect)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName expect) ($ Id.VSub_DollarName HT))}
                        )
                      ]
                      redirects: []
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'count='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'count='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'count='> name:count)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (word_part.ArithSub
                                left: <Id.Left_DollarDParen '$(('>
                                anode: 
                                  (arith_expr.Binary
                                    op_id: Id.Arith_Minus
                                    left: {($ Id.VSub_DollarName count)}
                                    right: {<Id.Lit_Digits 1>}
                                  )
                                right: <Id.Right_DollarDParen _>
                              )
                            }
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
            (command.Simple
              blame_tok: <shift>
              more_env: []
              words: [{<shift>}]
              redirects: []
              do_fork: T
            )
            (command.Case
              case_kw: <Id.KW_Case case>
              to_match: (case_arg.Word w:{(DQ <' '> ($ Id.VSub_Star '*') <' '>)})
              arms_start: <Id.KW_In in>
              arms: [
                (CaseArm
                  left: <Id.Lit_Star '*'>
                  pattern: 
                    (pat.Words
                      words: [{<Id.Lit_Star '*'> (SQ <' --pretty=short '>) <Id.Lit_Star '*'>}]
                    )
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'line='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'line='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'line='> name:line)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_DollarName title)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <Id.Lit_Star '*'>
                  pattern: (pat.Words words:[{<Id.Lit_Star '*'>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'line='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'line='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'line='> name:line)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_DollarName body)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
              ]
              arms_end: <Id.KW_Esac esac>
              redirects: []
            )
            (command.Pipeline
              children: [
                (BraceGroup
                  left: <Id.Lit_LBrace '{'>
                  children: [
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'git show -s '> ($ Id.VSub_Star '*'))}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ ($ Id.VSub_DollarName expect) ($ Id.VSub_DollarName line))}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  redirects: []
                  right: <Id.Lit_RBrace '}'>
                )
                (command.Simple
                  blame_tok: <sed>
                  more_env: []
                  words: [{<sed>} {<-e>} {(SQ <'s/ /./g'>)}]
                  redirects: [(Redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expect>})]
                  do_fork: T
                )
              ]
              ops: [<Id.Op_Pipe _>]
            )
            (command.Pipeline
              children: [
                (BraceGroup
                  left: <Id.Lit_LBrace '{'>
                  children: [
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'git show -s '> ($ Id.VSub_Star '*'))}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Pipeline
                      children: [
                        (command.Simple
                          blame_tok: <git>
                          more_env: []
                          words: [{<git>} {<show>} {<-s>} {(DQ ($ Id.VSub_At '@'))}]
                          redirects: []
                          do_fork: T
                        )
                        (command.Simple
                          blame_tok: <sed>
                          more_env: []
                          words: [
                            {<sed>}
                            {<-n>}
                            {<-e>}
                            {
                              (DQ <'/'> ($ Id.VSub_DollarName line) 
                                (word_part.EscapedLiteral
                                  token: <Id.Lit_EscapedChar '\\$'>
                                  ch: '$'
                                ) <'/p'>
                              )
                            }
                          ]
                          redirects: []
                          do_fork: T
                        )
                      ]
                      ops: [<Id.Op_Pipe _>]
                    )
                  ]
                  redirects: []
                  right: <Id.Lit_RBrace '}'>
                )
                (command.Simple
                  blame_tok: <sed>
                  more_env: []
                  words: [{<sed>} {<-e>} {(SQ <'s/ /./g'>)}]
                  redirects: [(Redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<actual>})]
                  do_fork: T
                )
              ]
              ops: [<Id.Op_Pipe _>]
            )
            (command.Simple
              blame_tok: <test_cmp>
              more_env: []
              words: [{<test_cmp>} {<expect>} {<actual>}]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <test_expand>
      name: test_expand
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike 'fmt='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'fmt='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'fmt='> name:fmt)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number 1)}
                )
              ]
              redirects: []
            )
            (command.Case
              case_kw: <Id.KW_Case case>
              to_match: (case_arg.Word w:{(DQ ($ Id.VSub_DollarName fmt))})
              arms_start: <Id.KW_In in>
              arms: [
                (CaseArm
                  left: <Id.Lit_Star '*'>
                  pattern: 
                    (pat.Words
                      words: [
                        {<Id.Lit_Star '*'> <Id.Lit_Equals '='> <raw>}
                        {<Id.Lit_Star '*'> <Id.Lit_Equals '='> <short>}
                        {<Id.Lit_Star '*'> <Id.Lit_Equals '='> <email>}
                      ]
                    )
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'default='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'default='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'default='> name:default)
                          op: assign_op.Equal
                          rhs: {(DQ <'0 1'>)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <Id.Lit_Star '*'>
                  pattern: (pat.Words words:[{<Id.Lit_Star '*'>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'default='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'default='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'default='> name:default)
                          op: assign_op.Equal
                          rhs: {(DQ <'8 0'>)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
              ]
              arms_end: <Id.KW_Esac esac>
              redirects: []
            )
            (command.Case
              case_kw: <Id.KW_Case case>
              to_match: (case_arg.Word w:{(DQ ($ Id.VSub_DollarName fmt))})
              arms_start: <Id.KW_In in>
              arms: [
                (CaseArm
                  left: <Id.Lit_Star '*'>
                  pattern: (pat.Words words:[{<Id.Lit_Star '*'> <Id.Lit_Equals '='> <email>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'in='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'in='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'in='> name:in)
                          op: assign_op.Equal
                          rhs: {<0>}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <Id.Lit_Star '*'>
                  pattern: (pat.Words words:[{<Id.Lit_Star '*'>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'in='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'in='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'in='> name:in)
                          op: assign_op.Equal
                          rhs: {<4>}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
              ]
              arms_end: <Id.KW_Esac esac>
              redirects: []
            )
            (command.Simple
              blame_tok: <test_expect_success>
              more_env: []
              words: [
                {<test_expect_success>}
                {
                  (DQ <'expand/no-expand'> 
                    (BracedVarSub
                      left: <Id.Left_DollarBrace '${'>
                      token: <Id.VSub_Name fmt>
                      var_name: fmt
                      suffix_op: 
                        (suffix_op.Unary
                          op: <Id.VTest_ColonPlus _>
                          arg_word: {<' for '> ($ Id.VSub_DollarName fmt)}
                        )
                      right: <Id.Right_DollarBrace '}'>
                    )
                  )
                }
                {
                  (SQ <'\n'> <'\t\tcount_expand $in $default $fmt &&\n'> 
                    <'\t\tcount_expand $in 8 0 $fmt --expand-tabs &&\n'> <'\t\tcount_expand $in 8 0 --expand-tabs $fmt &&\n'> 
                    <'\t\tcount_expand $in 8 0 $fmt --expand-tabs=8 &&\n'> <'\t\tcount_expand $in 8 0 --expand-tabs=8 $fmt &&\n'> 
                    <'\t\tcount_expand $in 0 1 $fmt --no-expand-tabs &&\n'> <'\t\tcount_expand $in 0 1 --no-expand-tabs $fmt &&\n'> 
                    <'\t\tcount_expand $in 0 1 $fmt --expand-tabs=0 &&\n'> <'\t\tcount_expand $in 0 1 --expand-tabs=0 $fmt &&\n'> 
                    <'\t\tcount_expand $in 4 0 $fmt --expand-tabs=4 &&\n'> <'\t\tcount_expand $in 4 0 --expand-tabs=4 $fmt\n'> <'\t'>
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <setup>)}
        {
          (SQ <'\n'> <'\ttest_tick &&\n'> <'\tsed -e "s/Q/$HT/g" <<-EOF >msg &&\n'> <'\tQ$title\n'> 
            <'\n'> <'\tQ$body\n'> <'\tEOF\n'> <'\tgit commit --allow-empty -F msg\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expand>
      more_env: []
      words: [{<test_expand>} {(DQ )}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expand>
      more_env: []
      words: [{<test_expand>} {<--pretty>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expand>
      more_env: []
      words: [{<test_expand>} {<--pretty> <Id.Lit_Equals '='> <short>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expand>
      more_env: []
      words: [{<test_expand>} {<--pretty> <Id.Lit_Equals '='> <medium>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expand>
      more_env: []
      words: [{<test_expand>} {<--pretty> <Id.Lit_Equals '='> <full>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expand>
      more_env: []
      words: [{<test_expand>} {<--pretty> <Id.Lit_Equals '='> <fuller>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expand>
      more_env: []
      words: [{<test_expand>} {<--pretty> <Id.Lit_Equals '='> <raw>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expand>
      more_env: []
      words: [{<test_expand>} {<--pretty> <Id.Lit_Equals '='> <email>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_done>
      more_env: []
      words: [{<test_done>}]
      redirects: []
      do_fork: T
    )
  ]
)