(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: 'log --grep/--author/--regexp-ignore-case/-S/-G'
                  span_id: 6
                )
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: test_log
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:expect)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [22]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:kind)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$2')}
                  spids: [26]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:needle)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$3')}
                  spids: [30]
                )
              ]
            )
            (C {(shift)} {(3)})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:rest)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_At '$@')}
                  spids: [39]
                )
              ]
            )
            (command.Case
              to_match: {($ Id.VSub_DollarName '$kind')}
              arms: [
                (case_arm
                  pat_list: [{(--) (Id.Lit_Star '*')}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:opt)
                          op: assign_op.Equal
                          rhs: 
                            {($ Id.VSub_DollarName '$kind') (Id.Lit_Equals '=') 
                              ($ Id.VSub_DollarName '$needle')
                            }
                          spids: [56]
                        )
                      ]
                    )
                  ]
                  spids: [51 53 62 -1]
                )
                (case_arm
                  pat_list: [{(Id.Lit_Star '*')}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:opt)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_DollarName '$kind') ($ Id.VSub_DollarName '$needle')}
                          spids: [69]
                        )
                      ]
                    )
                  ]
                  spids: [65 66 74 -1]
                )
              ]
            )
            (command.Case
              to_match: {($ Id.VSub_DollarName '$expect')}
              arms: [
                (case_arm
                  pat_list: [{(expect_nomatch)}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:match)
                          op: assign_op.Equal
                          rhs: {(nomatch)}
                          spids: [91]
                        )
                      ]
                    )
                  ]
                  spids: [87 88 95 -1]
                )
                (case_arm
                  pat_list: [{(Id.Lit_Star '*')}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:match)
                          op: assign_op.Equal
                          rhs: {(match)}
                          spids: [102]
                        )
                      ]
                    )
                  ]
                  spids: [98 99 106 -1]
                )
              ]
            )
            (C {(test_expect_success)} 
              {
                (DQ ('log ') ($ Id.VSub_DollarName '$kind') 
                  (braced_var_sub
                    token: (Token id:Id.VSub_Name val:rest span_id:119)
                    suffix_op: 
                      (suffix_op.Unary
                        op_id: Id.VTest_ColonPlus
                        arg_word: {(' ') ($ Id.VSub_DollarName '$rest')}
                      )
                  ) (' (') ($ Id.VSub_DollarName '$match') (')')
                )
              } 
              {
                (DQ ('\n') ('\t\tgit log ') ($ Id.VSub_DollarName '$rest') (' ') 
                  ($ Id.VSub_DollarName '$opt') (' --format=%H >actual &&\n') ('\t\ttest_cmp ') ($ Id.VSub_DollarName '$expect') (' actual\n') ('\t')
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: test_log_icase
      body: 
        (command.BraceGroup
          children: [
            (C {(test_log)} {($ Id.VSub_At '$@')} {(--regexp-ignore-case)})
            (C {(test_log)} {($ Id.VSub_At '$@')} {(-i)})
          ]
        )
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:177) 
          (Token id:Id.Lit_Chars val:'\t>expect_nomatch &&\n' span_id:178) (Token id:Id.Lit_Chars val:'\n' span_id:179) (Token id:Id.Lit_Chars val:'\t>file &&\n' span_id:180) 
          (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:181) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:182) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m initial &&\n' span_id:183) (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify HEAD >expect_initial &&\n' span_id:184) 
          (Token id:Id.Lit_Chars val:'\n' span_id:185) (Token id:Id.Lit_Chars val:'\techo Picked >file &&\n' span_id:186) 
          (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:187) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:188) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit --author="Another Person <another@example.com>" -m second &&\n'
            span_id: 189
          ) (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify HEAD >expect_second\n' span_id:190)
        )
      }
    )
    (C {(test_log)} {(expect_initial)} {(--grep)} {(initial)})
    (C {(test_log)} {(expect_nomatch)} {(--grep)} {(InItial)})
    (C {(test_log_icase)} {(expect_initial)} {(--grep)} {(InItial)})
    (C {(test_log_icase)} {(expect_nomatch)} {(--grep)} {(initail)})
    (C {(test_log)} {(expect_second)} {(--author)} {(Person)})
    (C {(test_log)} {(expect_nomatch)} {(--author)} {(person)})
    (C {(test_log_icase)} {(expect_second)} {(--author)} {(person)})
    (C {(test_log_icase)} {(expect_nomatch)} {(--author)} {(spreon)})
    (C {(test_log)} {(expect_nomatch)} {(-G)} {(picked)})
    (C {(test_log)} {(expect_second)} {(-G)} {(Picked)})
    (C {(test_log_icase)} {(expect_nomatch)} {(-G)} {(pickle)})
    (C {(test_log_icase)} {(expect_second)} {(-G)} {(picked)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log -G --textconv (missing textconv tool)' span_id:296))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:300) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "* diff=test" >.gitattributes &&\n'
            span_id: 301
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git -c diff.test.textconv=missing log -Gfoo &&\n'
            span_id: 302
          ) (Token id:Id.Lit_Chars val:'\trm .gitattributes\n' span_id:303)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log -G --no-textconv (missing textconv tool)' span_id:310))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:314) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "* diff=test" >.gitattributes &&\n'
            span_id: 315
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit -c diff.test.textconv=missing log -Gfoo --no-textconv >actual &&\n'
            span_id: 316
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect_nomatch actual &&\n' span_id:317) 
          (Token id:Id.Lit_Chars val:'\trm .gitattributes\n' span_id:318)
        )
      }
    )
    (C {(test_log)} {(expect_nomatch)} {(-S)} {(picked)})
    (C {(test_log)} {(expect_second)} {(-S)} {(Picked)})
    (C {(test_log_icase)} {(expect_second)} {(-S)} {(picked)})
    (C {(test_log_icase)} {(expect_nomatch)} {(-S)} {(pickle)})
    (C {(test_log)} {(expect_nomatch)} {(-S)} {(p.cked)} {(--pickaxe-regex)})
    (C {(test_log)} {(expect_second)} {(-S)} {(P.cked)} {(--pickaxe-regex)})
    (C {(test_log_icase)} {(expect_second)} {(-S)} {(p.cked)} {(--pickaxe-regex)})
    (C {(test_log_icase)} {(expect_nomatch)} {(-S)} {(p.ckle)} {(--pickaxe-regex)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log -S --textconv (missing textconv tool)' span_id:399))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:403) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "* diff=test" >.gitattributes &&\n'
            span_id: 404
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git -c diff.test.textconv=missing log -Sfoo &&\n'
            span_id: 405
          ) (Token id:Id.Lit_Chars val:'\trm .gitattributes\n' span_id:406)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log -S --no-textconv (missing textconv tool)' span_id:413))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:417) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "* diff=test" >.gitattributes &&\n'
            span_id: 418
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit -c diff.test.textconv=missing log -Sfoo --no-textconv >actual &&\n'
            span_id: 419
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect_nomatch actual &&\n' span_id:420) 
          (Token id:Id.Lit_Chars val:'\trm .gitattributes\n' span_id:421)
        )
      }
    )
    (C {(test_done)})
  ]
)