(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 wacky input to git config' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: setup
      body: 
        (command.BraceGroup
          children: [
            (command.Subshell
              command_list: 
                (command.CommandList
                  children: [
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (C {(printf)} {(DQ ('[section]') (Id.Lit_Other '\\') (n))})
                        (C {(printf)} {(DQ ('  key = foo'))})
                      ]
                    )
                  ]
                )
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:43)
                  fd: -1
                  arg_word: {(.git/config)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: check
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(echo)} {(DQ ($ Id.VSub_Number '$2'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:68)
                  fd: -1
                  arg_word: {(expected)}
                )
              ]
            )
            (command.Simple
              words: [{(git)} {(config)} {(--get)} {(DQ ($ Id.VSub_Number '$1'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:82)
                  fd: -1
                  arg_word: {(actual)}
                )
                (redir.Redir
                  op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:85)
                  fd: 2
                  arg_word: {(1)}
                )
              ]
            )
            (C {(test_cmp)} {(actual)} {(expected)})
          ]
        )
    )
    (command.ShFunction
      name: check_regex
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(echo)} {(DQ ($ Id.VSub_Number '$3'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:117)
                  fd: -1
                  arg_word: {(expected)}
                )
              ]
            )
            (command.Simple
              words: [
                {(git)}
                {(config)}
                {(--get)}
                {(DQ ($ Id.VSub_Number '$1'))}
                {(DQ ($ Id.VSub_Number '$2'))}
              ]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:135)
                  fd: -1
                  arg_word: {(actual)}
                )
                (redir.Redir
                  op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:138)
                  fd: 2
                  arg_word: {(1)}
                )
              ]
            )
            (C {(test_cmp)} {(actual)} {(expected)})
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'modify same key' span_id:154))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:158) 
          (Token id:Id.Lit_Chars val:'\tsetup &&\n' span_id:159) (Token id:Id.Lit_Chars val:'\tgit config section.key bar &&\n' span_id:160) 
          (Token id:Id.Lit_Chars val:'\tcheck section.key bar\n' span_id:161)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'add key in same section' span_id:168))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:172) 
          (Token id:Id.Lit_Chars val:'\tsetup &&\n' span_id:173) (Token id:Id.Lit_Chars val:'\tgit config section.other bar &&\n' span_id:174) 
          (Token id:Id.Lit_Chars val:'\tcheck section.key foo &&\n' span_id:175) (Token id:Id.Lit_Chars val:'\tcheck section.other bar\n' span_id:176)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'add key in different section' span_id:183))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:187) 
          (Token id:Id.Lit_Chars val:'\tsetup &&\n' span_id:188) (Token id:Id.Lit_Chars val:'\tgit config section2.key bar &&\n' span_id:189) 
          (Token id:Id.Lit_Chars val:'\tcheck section.key foo &&\n' span_id:190) (Token id:Id.Lit_Chars val:'\tcheck section2.key bar\n' span_id:191)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:SECTION)
          op: assign_op.Equal
          rhs: 
            {
              (DQ (test.q) 
                (word_part.EscapedLiteral
                  token: (Token id:Id.Lit_EscapedChar val:'\\"' span_id:198)
                ) (s) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\\\' span_id:200)) 
                ("sq'sp e.key")
              )
            }
          spids: [195]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'make sure git config escapes section names properly'
            span_id: 207
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:211) 
          (Token id:Id.Lit_Chars val:'\tgit config "$SECTION" bar &&\n' span_id:212) (Token id:Id.Lit_Chars val:'\tcheck "$SECTION" bar\n' span_id:213)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:LONG_VALUE)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:218)
                command_list: 
                  (command.CommandList
                    children: [(C {(printf)} {(DQ ('x%01021dx a'))} {(7)})]
                  )
              )
            }
          spids: [217]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'do not crash on special long config line' span_id:231))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:235) 
          (Token id:Id.Lit_Chars val:'\tsetup &&\n' span_id:236) (Token id:Id.Lit_Chars val:'\tgit config section.key "$LONG_VALUE" &&\n' span_id:237) 
          (Token id:Id.Lit_Chars val:'\tcheck section.key "$LONG_VALUE"\n' span_id:238)
        )
      }
    )
    (command.ShFunction
      name: setup_many
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {(setup)})
                (command.Simple
                  words: [{(echo)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_DGreat val:'>>' span_id:264)
                      fd: -1
                      arg_word: {(.git/config)}
                    )
                  ]
                )
                (command.Simple
                  words: [{(cat)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:284)
                      fd: -1
                      arg_word: {(5to1)}
                    )
                    (redir.HereDoc
                      op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:287)
                      fd: -1
                      here_begin: 
                        {
                          (word_part.EscapedLiteral
                            token: (Token id:Id.Lit_EscapedChar val:'\\E' span_id:288)
                          ) (OF)
                        }
                      here_end_span_id: 298
                      stdin_parts: [
                        ('  key = foo\n')
                        ('  key = foo\n')
                        ('  key = foo\n')
                        ('  key = foo\n')
                        ('  key = foo\n')
                      ]
                    )
                  ]
                )
                (command.Simple
                  words: [{(cat)} {(5to1)} {(5to1)} {(5to1)} {(5to1)} {(5to1)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:312)
                      fd: -1
                      arg_word: {(5to2)}
                    )
                  ]
                )
                (command.Simple
                  words: [{(cat)} {(5to2)} {(5to2)} {(5to2)} {(5to2)} {(5to2)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:333)
                      fd: -1
                      arg_word: {(5to3)}
                    )
                  ]
                )
                (command.Simple
                  words: [{(cat)} {(5to3)} {(5to3)} {(5to3)} {(5to3)} {(5to3)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:354)
                      fd: -1
                      arg_word: {(5to4)}
                    )
                  ]
                )
                (command.Simple
                  words: [{(cat)} {(5to4)} {(5to4)} {(5to4)} {(5to4)} {(5to4)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_DGreat val:'>>' span_id:375)
                      fd: -1
                      arg_word: {(.git/config)}
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'get many entries' span_id:387))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:391) 
          (Token id:Id.Lit_Chars val:'\tsetup_many &&\n' span_id:392) (Token id:Id.Lit_Chars val:'\tgit config --get-all section.key >actual &&\n' span_id:393) 
          (Token id:Id.Lit_Chars val:'\ttest_line_count = 3126 actual\n' span_id:394)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'get many entries by regex' span_id:401))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:405) 
          (Token id:Id.Lit_Chars val:'\tsetup_many &&\n' span_id:406) (Token id:Id.Lit_Chars val:'\tgit config --get-regexp "sec.*ke." >actual &&\n' span_id:407) 
          (Token id:Id.Lit_Chars val:'\ttest_line_count = 3126 actual\n' span_id:408)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'add and replace one of many entries' span_id:415))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:419) 
          (Token id:Id.Lit_Chars val:'\tsetup_many &&\n' span_id:420) (Token id:Id.Lit_Chars val:'\tgit config --add section.key bar &&\n' span_id:421) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck_regex section.key "b.*r" bar &&\n'
            span_id: 422
          ) (Token id:Id.Lit_Chars val:'\tgit config section.key beer "b.*r" &&\n' span_id:423) 
          (Token id:Id.Lit_Chars val:'\tcheck_regex section.key "b.*r" beer\n' span_id:424)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'replace many entries' span_id:431))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:435) 
          (Token id:Id.Lit_Chars val:'\tsetup_many &&\n' span_id:436) (Token id:Id.Lit_Chars val:'\tgit config --replace-all section.key bar &&\n' span_id:437) 
          (Token id:Id.Lit_Chars val:'\tcheck section.key bar\n' span_id:438)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'unset many entries' span_id:445))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:449) 
          (Token id:Id.Lit_Chars val:'\tsetup_many &&\n' span_id:450) (Token id:Id.Lit_Chars val:'\tgit config --unset-all section.key &&\n' span_id:451) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git config section.key\n'
            span_id: 452
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '--add appends new value after existing empty value'
            span_id: 459
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:463) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:464) (Token id:Id.Lit_Chars val:'\n' span_id:465) (Token id:Id.Lit_Chars val:'\n' span_id:466) 
          (Token id:Id.Lit_Chars val:'\tfool\n' span_id:467) (Token id:Id.Lit_Chars val:'\troll\n' span_id:468) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:469) 
          (Token id:Id.Lit_Chars val:'\tcp .git/config .git/config.old &&\n' span_id:470) (Token id:Id.Lit_Chars val:'\ttest_when_finished "mv .git/config.old .git/config" &&\n' span_id:471) 
          (Token id:Id.Lit_Chars val:'\tcat >.git/config <<-\\EOF &&\n' span_id:472) (Token id:Id.Lit_Chars val:'\t[foo]\n' span_id:473) 
          (Token id:Id.Lit_Chars val:'\t\tbaz\n' span_id:474) (Token id:Id.Lit_Chars val:'\t\tbaz =\n' span_id:475) 
          (Token id:Id.Lit_Chars val:'\t\tbaz = fool\n' span_id:476) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:477) 
          (Token id:Id.Lit_Chars val:'\tgit config --add foo.baz roll &&\n' span_id:478) (Token id:Id.Lit_Chars val:'\tgit config --get-all foo.baz >output &&\n' span_id:479) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect output\n' span_id:480)
        )
      }
    )
    (C {(test_done)})
  ]
)