(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 custom diff function name patterns' span_id:15))}
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:27))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:31) 
          (Token id:Id.Lit_Chars val:'\t# a non-trivial custom pattern\n' span_id:32) (Token id:Id.Lit_Chars val:'\tgit config diff.custom1.funcname "!static\n' span_id:33) 
          (Token id:Id.Lit_Chars val:'!String\n' span_id:34) (Token id:Id.Lit_Chars val:'[^ \t].*s.*" &&\n' span_id:35) (Token id:Id.Lit_Chars val:'\n' span_id:36) 
          (Token
            id: Id.Lit_Chars
            val: '\t# a custom pattern which matches to end of line\n'
            span_id: 37
          ) (Token id:Id.Lit_Chars val:'\tgit config diff.custom2.funcname "......Beer\\$" &&\n' span_id:38) 
          (Token id:Id.Lit_Chars val:'\n' span_id:39) (Token id:Id.Lit_Chars val:'\t# alternation in pattern\n' span_id:40) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config diff.custom3.funcname "Beer$" &&\n'
            span_id: 41
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config diff.custom3.xfuncname "^[ \t]*((public|static).*)$" &&\n'
            span_id: 42
          ) (Token id:Id.Lit_Chars val:'\n' span_id:43) 
          (Token id:Id.Lit_Chars val:'\t# for regexp compilation tests\n' span_id:44) (Token id:Id.Lit_Chars val:'\techo A >A.java &&\n' span_id:45) 
          (Token id:Id.Lit_Chars val:'\techo B >B.java\n' span_id:46)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:diffpatterns)
          op: assign_op.Equal
          rhs: 
            {
              (DQ ('\n') ('\tada\n') ('\tbibtex\n') ('\tcpp\n') ('\tcsharp\n') ('\tcss\n') ('\tfortran\n') 
                ('\tfountain\n') ('\thtml\n') ('\tjava\n') ('\tmatlab\n') ('\tobjc\n') ('\tpascal\n') ('\tperl\n') ('\tphp\n') ('\tpython\n') 
                ('\truby\n') ('\ttex\n') ('\tcustom1\n') ('\tcustom2\n') ('\tcustom3\n')
              )
            }
          spids: [50]
        )
      ]
    )
    (command.ForEach
      iter_name: p
      iter_words: [{($ Id.VSub_DollarName '$diffpatterns')}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (C {(test_expect_success)} 
              {(DQ ('builtin ') ($ Id.VSub_DollarName '$p') (' pattern compiles'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:96) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\techo "*.java diff=$p" >.gitattributes &&\n'
                    span_id: 97
                  ) (Token id:Id.Lit_Chars val:'\t\ttest_expect_code 1 git diff --no-index \\\n' span_id:98) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\tA.java B.java 2>msg &&\n'
                    span_id: 99
                  ) (Token id:Id.Lit_Chars val:'\t\ttest_i18ngrep ! fatal msg &&\n' span_id:100) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_i18ngrep ! error msg\n'
                    span_id: 101
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:102)
                )
              }
            )
            (C {(test_expect_success)} 
              {(DQ ('builtin ') ($ Id.VSub_DollarName '$p') (' wordRegex pattern compiles'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:115) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\techo "*.java diff=$p" >.gitattributes &&\n'
                    span_id: 116
                  ) (Token id:Id.Lit_Chars val:'\t\ttest_expect_code 1 git diff --no-index --word-diff \\\n' span_id:117) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\tA.java B.java 2>msg &&\n'
                    span_id: 118
                  ) (Token id:Id.Lit_Chars val:'\t\ttest_i18ngrep ! fatal msg &&\n' span_id:119) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_i18ngrep ! error msg\n'
                    span_id: 120
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:121)
                )
              }
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'last regexp must not be negated' span_id:130))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:134) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "*.java diff=java" >.gitattributes &&\n'
            span_id: 135
          ) (Token id:Id.Lit_Chars val:'\ttest_config diff.java.funcname "!static" &&\n' span_id:136) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_expect_code 128 git diff --no-index A.java B.java 2>msg &&\n'
            span_id: 137
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep ": Last expression must not be negated:" msg\n'
            span_id: 138
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup hunk header tests' span_id:145))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:149) 
          (Token id:Id.Lit_Chars val:'\tfor i in $diffpatterns\n' span_id:150) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:151) 
          (Token id:Id.Lit_Chars val:'\t\techo "$i-* diff=$i"\n' span_id:152) (Token id:Id.Lit_Chars val:'\tdone > .gitattributes &&\n' span_id:153) 
          (Token id:Id.Lit_Chars val:'\n' span_id:154) (Token id:Id.Lit_Chars val:'\t# add all test files to the index\n' span_id:155) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:156) (Token id:Id.Lit_Chars val:'\t\tcd "$TEST_DIRECTORY"/t4018 &&\n' span_id:157) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit --git-dir="$TRASH_DIRECTORY/.git" add .\n'
            span_id: 158
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:159) (Token id:Id.Lit_Chars val:'\n' span_id:160) 
          (Token
            id: Id.Lit_Chars
            val: '\t# place modified files in the worktree\n'
            span_id: 161
          ) (Token id:Id.Lit_Chars val:'\tfor i in $(git ls-files)\n' span_id:162) 
          (Token id:Id.Lit_Chars val:'\tdo\n' span_id:163) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\tsed -e "s/ChangeMe/IWasChanged/" <"$TEST_DIRECTORY/t4018/$i" >"$i" || return 1\n'
            span_id: 164
          ) (Token id:Id.Lit_Chars val:'\tdone\n' span_id:165)
        )
      }
    )
    (command.ForEach
      iter_name: i
      iter_words: [
        {
          (command_sub
            left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:178)
            command_list: (command.CommandList children:[(C {(git)} {(ls-files)})])
          )
        }
      ]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Simple
                      words: [{(grep)} {(broken)} {(DQ ($ Id.VSub_DollarName '$i'))}]
                      redirects: [
                        (redir.Redir
                          op: (Token id:Id.Redir_Great val:'>' span_id:197)
                          fd: -1
                          arg_word: {(/dev/null)}
                        )
                        (redir.Redir
                          op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:200)
                          fd: 2
                          arg_word: {(1)}
                        )
                      ]
                    )
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:result)
                          op: assign_op.Equal
                          rhs: {(failure)}
                          spids: [207]
                        )
                      ]
                    )
                  ]
                  spids: [187 204]
                )
              ]
              else_action: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:result)
                      op: assign_op.Equal
                      rhs: {(success)}
                      spids: [214]
                    )
                  ]
                )
              ]
            )
            (C {(test_expect_) ($ Id.VSub_DollarName '$result')} 
              {(DQ ('hunk header: ') ($ Id.VSub_DollarName '$i'))} 
              {
                (DQ ('\n') ("\t\ttest_when_finished 'cat actual' &&\t# for debugging only\n") 
                  ('\t\tgit diff -U1 ') ($ Id.VSub_DollarName '$i') (' >actual &&\n') ("\t\tgrep '@@ .* @@.*RIGHT' actual\n") ('\t')
                )
              }
            )
          ]
        )
    )
    (C {(test_done)})
  ]
)