(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:'word diff colors' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) (/diff-lib.sh)})
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:24)
          fd: -1
          arg_word: {(pre.simple)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:27)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:28)) (OF)}
          here_end_span_id: 34
          stdin_parts: [('h(4)\n') ('\n') ('a = b + c\n')]
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:37)
          fd: -1
          arg_word: {(post.simple)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:40)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:41)) (OF)}
          here_end_span_id: 51
          stdin_parts: [
            ('h(4),hh[44]\n')
            ('\n')
            ('a = b + c\n')
            ('\n')
            ('aa = a\n')
            ('\n')
            ('aeff = aeff * ( aaa )\n')
          ]
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:54)
          fd: -1
          arg_word: {(expect.letter-runs-are-words)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:57)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:58)) (OF)}
          here_end_span_id: 73
          stdin_parts: [
            ('<BOLD>diff --git a/pre b/post<RESET>\n')
            ('<BOLD>index 330b04f..5ed8eff 100644<RESET>\n')
            ('<BOLD>--- a/pre<RESET>\n')
            ('<BOLD>+++ b/post<RESET>\n')
            ('<CYAN>@@ -1,3 +1,7 @@<RESET>\n')
            ('h(4),<GREEN>hh<RESET>[44]\n')
            ('\n')
            ('a = b + c<RESET>\n')
            ('\n')
            ('<GREEN>aa = a<RESET>\n')
            ('\n')
            ('<GREEN>aeff = aeff * ( aaa<RESET> )\n')
          ]
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:76)
          fd: -1
          arg_word: {(expect.non-whitespace-is-word)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:79)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:80)) (OF)}
          here_end_span_id: 95
          stdin_parts: [
            ('<BOLD>diff --git a/pre b/post<RESET>\n')
            ('<BOLD>index 330b04f..5ed8eff 100644<RESET>\n')
            ('<BOLD>--- a/pre<RESET>\n')
            ('<BOLD>+++ b/post<RESET>\n')
            ('<CYAN>@@ -1,3 +1,7 @@<RESET>\n')
            ('h(4)<GREEN>,hh[44]<RESET>\n')
            ('\n')
            ('a = b + c<RESET>\n')
            ('\n')
            ('<GREEN>aa = a<RESET>\n')
            ('\n')
            ('<GREEN>aeff = aeff * ( aaa )<RESET>\n')
          ]
        )
      ]
    )
    (command.ShFunction
      name: word_diff
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [
                    {(test_must_fail)}
                    {(git)}
                    {(diff)}
                    {(--no-index)}
                    {(DQ ($ Id.VSub_At '$@'))}
                    {(pre)}
                    {(post)}
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:121)
                      fd: -1
                      arg_word: {(output)}
                    )
                  ]
                )
                (command.Simple
                  words: [{(test_decode_color)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Less val:'<' span_id:129)
                      fd: -1
                      arg_word: {(output)}
                    )
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:132)
                      fd: -1
                      arg_word: {(output.decrypted)}
                    )
                  ]
                )
                (C {(test_cmp)} {(expect)} {(output.decrypted)})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: test_language_driver
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:lang)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [155]
                )
              ]
            )
            (C {(test_expect_success)} {(DQ ("diff driver '") ($ Id.VSub_DollarName '$lang') ("'"))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:168) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcp "$TEST_DIRECTORY/t4034/'
                    span_id: 169
                  )
                ) (DQ ($ Id.VSub_DollarName '$lang')) 
                (SQ (Token id:Id.Lit_Chars val:'/pre" \\\n' span_id:175) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\t"$TEST_DIRECTORY/t4034/'
                    span_id: 176
                  )
                ) (DQ ($ Id.VSub_DollarName '$lang')) 
                (SQ (Token id:Id.Lit_Chars val:'/post" \\\n' span_id:182) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\t"$TEST_DIRECTORY/t4034/'
                    span_id: 183
                  )
                ) (DQ ($ Id.VSub_DollarName '$lang')) 
                (SQ (Token id:Id.Lit_Chars val:'/expect" . &&\n' span_id:189) 
                  (Token id:Id.Lit_Chars val:'\t\techo "* diff=' span_id:190)
                ) (DQ ($ Id.VSub_DollarName '$lang')) 
                (SQ (Token id:Id.Lit_Chars val:'" >.gitattributes &&\n' span_id:196) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tword_diff --color-words\n'
                    span_id: 197
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:198)
                )
              }
            )
          ]
        )
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:209) 
          (Token id:Id.Lit_Chars val:'\tgit config diff.color.old red &&\n' span_id:210) (Token id:Id.Lit_Chars val:'\tgit config diff.color.new green &&\n' span_id:211) 
          (Token id:Id.Lit_Chars val:'\tgit config diff.color.func magenta\n' span_id:212)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'set up pre and post with runs of whitespace' span_id:219))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:223) 
          (Token id:Id.Lit_Chars val:'\tcp pre.simple pre &&\n' span_id:224) (Token id:Id.Lit_Chars val:'\tcp post.simple post\n' span_id:225)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'word diff with runs of whitespace' span_id:232))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:236) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:237) (Token id:Id.Lit_Chars val:'\t\t<BOLD>diff --git a/pre b/post<RESET>\n' span_id:238) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t<BOLD>index 330b04f..5ed8eff 100644<RESET>\n'
            span_id: 239
          ) (Token id:Id.Lit_Chars val:'\t\t<BOLD>--- a/pre<RESET>\n' span_id:240) 
          (Token id:Id.Lit_Chars val:'\t\t<BOLD>+++ b/post<RESET>\n' span_id:241) (Token id:Id.Lit_Chars val:'\t\t<CYAN>@@ -1,3 +1,7 @@<RESET>\n' span_id:242) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t<RED>h(4)<RESET><GREEN>h(4),hh[44]<RESET>\n'
            span_id: 243
          ) (Token id:Id.Lit_Chars val:'\n' span_id:244) 
          (Token id:Id.Lit_Chars val:'\t\ta = b + c<RESET>\n' span_id:245) (Token id:Id.Lit_Chars val:'\n' span_id:246) 
          (Token id:Id.Lit_Chars val:'\t\t<GREEN>aa = a<RESET>\n' span_id:247) (Token id:Id.Lit_Chars val:'\n' span_id:248) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t<GREEN>aeff = aeff * ( aaa )<RESET>\n'
            span_id: 249
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:250) 
          (Token id:Id.Lit_Chars val:'\tword_diff --color-words &&\n' span_id:251) (Token id:Id.Lit_Chars val:'\tword_diff --word-diff=color &&\n' span_id:252) 
          (Token id:Id.Lit_Chars val:'\tword_diff --color --word-diff=color\n' span_id:253)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--word-diff=porcelain' span_id:260))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:264) 
          (Token id:Id.Lit_Chars val:'\tsed ' span_id:265)
        ) (s/) (Id.Lit_Pound '#') (.) (Id.Lit_Star '*') (Id.Lit_Other '$') (//) 
        (SQ (Token id:Id.Lit_Chars val:' >expect <<-\\EOF &&\n' span_id:274) 
          (Token id:Id.Lit_Chars val:'\t\tdiff --git a/pre b/post\n' span_id:275) (Token id:Id.Lit_Chars val:'\t\tindex 330b04f..5ed8eff 100644\n' span_id:276) 
          (Token id:Id.Lit_Chars val:'\t\t--- a/pre\n' span_id:277) (Token id:Id.Lit_Chars val:'\t\t+++ b/post\n' span_id:278) 
          (Token id:Id.Lit_Chars val:'\t\t@@ -1,3 +1,7 @@\n' span_id:279) (Token id:Id.Lit_Chars val:'\t\t-h(4)\n' span_id:280) 
          (Token id:Id.Lit_Chars val:'\t\t+h(4),hh[44]\n' span_id:281) (Token id:Id.Lit_Chars val:'\t\t~\n' span_id:282) 
          (Token id:Id.Lit_Chars val:'\t\t # significant space\n' span_id:283) (Token id:Id.Lit_Chars val:'\t\t~\n' span_id:284) 
          (Token id:Id.Lit_Chars val:'\t\t a = b + c\n' span_id:285) (Token id:Id.Lit_Chars val:'\t\t~\n' span_id:286) (Token id:Id.Lit_Chars val:'\t\t~\n' span_id:287) 
          (Token id:Id.Lit_Chars val:'\t\t+aa = a\n' span_id:288) (Token id:Id.Lit_Chars val:'\t\t~\n' span_id:289) (Token id:Id.Lit_Chars val:'\t\t~\n' span_id:290) 
          (Token id:Id.Lit_Chars val:'\t\t+aeff = aeff * ( aaa )\n' span_id:291) (Token id:Id.Lit_Chars val:'\t\t~\n' span_id:292) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:293) 
          (Token id:Id.Lit_Chars val:'\tword_diff --word-diff=porcelain\n' span_id:294)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--word-diff=plain' span_id:301))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:305) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:306) (Token id:Id.Lit_Chars val:'\t\tdiff --git a/pre b/post\n' span_id:307) 
          (Token id:Id.Lit_Chars val:'\t\tindex 330b04f..5ed8eff 100644\n' span_id:308) (Token id:Id.Lit_Chars val:'\t\t--- a/pre\n' span_id:309) 
          (Token id:Id.Lit_Chars val:'\t\t+++ b/post\n' span_id:310) (Token id:Id.Lit_Chars val:'\t\t@@ -1,3 +1,7 @@\n' span_id:311) 
          (Token id:Id.Lit_Chars val:'\t\t[-h(4)-]{+h(4),hh[44]+}\n' span_id:312) (Token id:Id.Lit_Chars val:'\n' span_id:313) (Token id:Id.Lit_Chars val:'\t\ta = b + c\n' span_id:314) 
          (Token id:Id.Lit_Chars val:'\n' span_id:315) (Token id:Id.Lit_Chars val:'\t\t{+aa = a+}\n' span_id:316) 
          (Token id:Id.Lit_Chars val:'\n' span_id:317) (Token id:Id.Lit_Chars val:'\t\t{+aeff = aeff * ( aaa )+}\n' span_id:318) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:319) (Token id:Id.Lit_Chars val:'\tword_diff --word-diff=plain &&\n' span_id:320) 
          (Token
            id: Id.Lit_Chars
            val: '\tword_diff --word-diff=plain --no-color\n'
            span_id: 321
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'--word-diff=plain --color' span_id:328))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:332) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:333) (Token id:Id.Lit_Chars val:'\t\t<BOLD>diff --git a/pre b/post<RESET>\n' span_id:334) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t<BOLD>index 330b04f..5ed8eff 100644<RESET>\n'
            span_id: 335
          ) (Token id:Id.Lit_Chars val:'\t\t<BOLD>--- a/pre<RESET>\n' span_id:336) 
          (Token id:Id.Lit_Chars val:'\t\t<BOLD>+++ b/post<RESET>\n' span_id:337) (Token id:Id.Lit_Chars val:'\t\t<CYAN>@@ -1,3 +1,7 @@<RESET>\n' span_id:338) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t<RED>[-h(4)-]<RESET><GREEN>{+h(4),hh[44]+}<RESET>\n'
            span_id: 339
          ) (Token id:Id.Lit_Chars val:'\n' span_id:340) 
          (Token id:Id.Lit_Chars val:'\t\ta = b + c<RESET>\n' span_id:341) (Token id:Id.Lit_Chars val:'\n' span_id:342) 
          (Token id:Id.Lit_Chars val:'\t\t<GREEN>{+aa = a+}<RESET>\n' span_id:343) (Token id:Id.Lit_Chars val:'\n' span_id:344) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t<GREEN>{+aeff = aeff * ( aaa )+}<RESET>\n'
            span_id: 345
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:346) 
          (Token id:Id.Lit_Chars val:'\tword_diff --word-diff=plain --color\n' span_id:347)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'word diff without context' span_id:354))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:358) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:359) (Token id:Id.Lit_Chars val:'\t\t<BOLD>diff --git a/pre b/post<RESET>\n' span_id:360) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t<BOLD>index 330b04f..5ed8eff 100644<RESET>\n'
            span_id: 361
          ) (Token id:Id.Lit_Chars val:'\t\t<BOLD>--- a/pre<RESET>\n' span_id:362) 
          (Token id:Id.Lit_Chars val:'\t\t<BOLD>+++ b/post<RESET>\n' span_id:363) (Token id:Id.Lit_Chars val:'\t\t<CYAN>@@ -1 +1 @@<RESET>\n' span_id:364) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t<RED>h(4)<RESET><GREEN>h(4),hh[44]<RESET>\n'
            span_id: 365
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t<CYAN>@@ -3,0 +4,4 @@<RESET> <RESET><MAGENTA>a = b + c<RESET>\n'
            span_id: 366
          ) (Token id:Id.Lit_Chars val:'\n' span_id:367) 
          (Token id:Id.Lit_Chars val:'\t\t<GREEN>aa = a<RESET>\n' span_id:368) (Token id:Id.Lit_Chars val:'\n' span_id:369) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t<GREEN>aeff = aeff * ( aaa )<RESET>\n'
            span_id: 370
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:371) 
          (Token id:Id.Lit_Chars val:'\tword_diff --color-words --unified=0\n' span_id:372)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'word diff with a regular expression' span_id:379))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:383) 
          (Token
            id: Id.Lit_Chars
            val: '\tcp expect.letter-runs-are-words expect &&\n'
            span_id: 384
          ) (Token id:Id.Lit_Chars val:'\tword_diff --color-words="[a-z]+"\n' span_id:385)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'set up a diff driver' span_id:392))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:396) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config diff.testdriver.wordRegex "[^[:space:]]" &&\n'
            span_id: 397
          ) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >.gitattributes\n' span_id:398) 
          (Token id:Id.Lit_Chars val:'\t\tpre diff=testdriver\n' span_id:399) (Token id:Id.Lit_Chars val:'\t\tpost diff=testdriver\n' span_id:400) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:401)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'option overrides .gitattributes' span_id:408))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:412) 
          (Token
            id: Id.Lit_Chars
            val: '\tcp expect.letter-runs-are-words expect &&\n'
            span_id: 413
          ) (Token id:Id.Lit_Chars val:'\tword_diff --color-words="[a-z]+"\n' span_id:414)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'use regex supplied by driver' span_id:421))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:425) 
          (Token
            id: Id.Lit_Chars
            val: '\tcp expect.non-whitespace-is-word expect &&\n'
            span_id: 426
          ) (Token id:Id.Lit_Chars val:'\tword_diff --color-words\n' span_id:427)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'set up diff.wordRegex option' span_id:434))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:438) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config diff.wordRegex "[[:alnum:]]+"\n'
            span_id: 439
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'command-line overrides config' span_id:446))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:450) 
          (Token
            id: Id.Lit_Chars
            val: '\tcp expect.letter-runs-are-words expect &&\n'
            span_id: 451
          ) (Token id:Id.Lit_Chars val:'\tword_diff --color-words="[a-z]+"\n' span_id:452)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'command-line overrides config: --word-diff-regex'
            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:'\t\t<BOLD>diff --git a/pre b/post<RESET>\n' span_id:465) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t<BOLD>index 330b04f..5ed8eff 100644<RESET>\n'
            span_id: 466
          ) (Token id:Id.Lit_Chars val:'\t\t<BOLD>--- a/pre<RESET>\n' span_id:467) 
          (Token id:Id.Lit_Chars val:'\t\t<BOLD>+++ b/post<RESET>\n' span_id:468) (Token id:Id.Lit_Chars val:'\t\t<CYAN>@@ -1,3 +1,7 @@<RESET>\n' span_id:469) 
          (Token id:Id.Lit_Chars val:'\t\th(4),<GREEN>{+hh+}<RESET>[44]\n' span_id:470) (Token id:Id.Lit_Chars val:'\n' span_id:471) 
          (Token id:Id.Lit_Chars val:'\t\ta = b + c<RESET>\n' span_id:472) (Token id:Id.Lit_Chars val:'\n' span_id:473) 
          (Token id:Id.Lit_Chars val:'\t\t<GREEN>{+aa = a+}<RESET>\n' span_id:474) (Token id:Id.Lit_Chars val:'\n' span_id:475) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t<GREEN>{+aeff = aeff * ( aaa+}<RESET> )\n'
            span_id: 476
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:477) 
          (Token
            id: Id.Lit_Chars
            val: '\tword_diff --color --word-diff-regex="[a-z]+"\n'
            span_id: 478
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'.gitattributes override config' span_id:485))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:489) 
          (Token
            id: Id.Lit_Chars
            val: '\tcp expect.non-whitespace-is-word expect &&\n'
            span_id: 490
          ) (Token id:Id.Lit_Chars val:'\tword_diff --color-words\n' span_id:491)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup: remove diff driver regex' span_id:498))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:502) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_unconfig diff.testdriver.wordRegex\n'
            span_id: 503
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'use configured regex' span_id:510))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:514) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:515) (Token id:Id.Lit_Chars val:'\t\t<BOLD>diff --git a/pre b/post<RESET>\n' span_id:516) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t<BOLD>index 330b04f..5ed8eff 100644<RESET>\n'
            span_id: 517
          ) (Token id:Id.Lit_Chars val:'\t\t<BOLD>--- a/pre<RESET>\n' span_id:518) 
          (Token id:Id.Lit_Chars val:'\t\t<BOLD>+++ b/post<RESET>\n' span_id:519) (Token id:Id.Lit_Chars val:'\t\t<CYAN>@@ -1,3 +1,7 @@<RESET>\n' span_id:520) 
          (Token id:Id.Lit_Chars val:'\t\th(4),<GREEN>hh[44<RESET>]\n' span_id:521) (Token id:Id.Lit_Chars val:'\n' span_id:522) 
          (Token id:Id.Lit_Chars val:'\t\ta = b + c<RESET>\n' span_id:523) (Token id:Id.Lit_Chars val:'\n' span_id:524) 
          (Token id:Id.Lit_Chars val:'\t\t<GREEN>aa = a<RESET>\n' span_id:525) (Token id:Id.Lit_Chars val:'\n' span_id:526) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t<GREEN>aeff = aeff * ( aaa<RESET> )\n'
            span_id: 527
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:528) 
          (Token id:Id.Lit_Chars val:'\tword_diff --color-words\n' span_id:529)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'test parsing words for newline' span_id:536))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:540) 
          (Token id:Id.Lit_Chars val:'\techo "aaa (aaa)" >pre &&\n' span_id:541) (Token id:Id.Lit_Chars val:'\techo "aaa (aaa) aaa" >post &&\n' span_id:542) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:543) (Token id:Id.Lit_Chars val:'\t\t<BOLD>diff --git a/pre b/post<RESET>\n' span_id:544) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t<BOLD>index c29453b..be22f37 100644<RESET>\n'
            span_id: 545
          ) (Token id:Id.Lit_Chars val:'\t\t<BOLD>--- a/pre<RESET>\n' span_id:546) 
          (Token id:Id.Lit_Chars val:'\t\t<BOLD>+++ b/post<RESET>\n' span_id:547) (Token id:Id.Lit_Chars val:'\t\t<CYAN>@@ -1 +1 @@<RESET>\n' span_id:548) 
          (Token id:Id.Lit_Chars val:'\t\taaa (aaa) <GREEN>aaa<RESET>\n' span_id:549) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:550) 
          (Token id:Id.Lit_Chars val:'\tword_diff --color-words="a+"\n' span_id:551)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'test when words are only removed at the end' span_id:558))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:562) 
          (Token id:Id.Lit_Chars val:'\techo "(:" >pre &&\n' span_id:563) (Token id:Id.Lit_Chars val:'\techo "(" >post &&\n' span_id:564) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:565) (Token id:Id.Lit_Chars val:'\t\t<BOLD>diff --git a/pre b/post<RESET>\n' span_id:566) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t<BOLD>index 289cb9d..2d06f37 100644<RESET>\n'
            span_id: 567
          ) (Token id:Id.Lit_Chars val:'\t\t<BOLD>--- a/pre<RESET>\n' span_id:568) 
          (Token id:Id.Lit_Chars val:'\t\t<BOLD>+++ b/post<RESET>\n' span_id:569) (Token id:Id.Lit_Chars val:'\t\t<CYAN>@@ -1 +1 @@<RESET>\n' span_id:570) 
          (Token id:Id.Lit_Chars val:'\t\t(<RED>:<RESET>\n' span_id:571) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:572) 
          (Token id:Id.Lit_Chars val:'\tword_diff --color-words=.\n' span_id:573)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--word-diff=none' span_id:580))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:584) 
          (Token id:Id.Lit_Chars val:'\techo "(:" >pre &&\n' span_id:585) (Token id:Id.Lit_Chars val:'\techo "(" >post &&\n' span_id:586) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:587) (Token id:Id.Lit_Chars val:'\t\tdiff --git a/pre b/post\n' span_id:588) 
          (Token id:Id.Lit_Chars val:'\t\tindex 289cb9d..2d06f37 100644\n' span_id:589) (Token id:Id.Lit_Chars val:'\t\t--- a/pre\n' span_id:590) 
          (Token id:Id.Lit_Chars val:'\t\t+++ b/post\n' span_id:591) (Token id:Id.Lit_Chars val:'\t\t@@ -1 +1 @@\n' span_id:592) 
          (Token id:Id.Lit_Chars val:'\t\t-(:\n' span_id:593) (Token id:Id.Lit_Chars val:'\t\t+(\n' span_id:594) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:595) 
          (Token
            id: Id.Lit_Chars
            val: '\tword_diff --word-diff=plain --word-diff=none\n'
            span_id: 596
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'unset default driver' span_id:603))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:607) 
          (Token id:Id.Lit_Chars val:'\ttest_unconfig diff.wordregex\n' span_id:608)
        )
      }
    )
    (C {(test_language_driver)} {(ada)})
    (C {(test_language_driver)} {(bibtex)})
    (C {(test_language_driver)} {(cpp)})
    (C {(test_language_driver)} {(csharp)})
    (C {(test_language_driver)} {(css)})
    (C {(test_language_driver)} {(fortran)})
    (C {(test_language_driver)} {(html)})
    (C {(test_language_driver)} {(java)})
    (C {(test_language_driver)} {(matlab)})
    (C {(test_language_driver)} {(objc)})
    (C {(test_language_driver)} {(pascal)})
    (C {(test_language_driver)} {(perl)})
    (C {(test_language_driver)} {(php)})
    (C {(test_language_driver)} {(python)})
    (C {(test_language_driver)} {(ruby)})
    (C {(test_language_driver)} {(tex)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'word-diff with diff.sbe' span_id:680))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:684) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:685) (Token id:Id.Lit_Chars val:'\tdiff --git a/pre b/post\n' span_id:686) 
          (Token id:Id.Lit_Chars val:'\tindex a1a53b5..bc8fe6d 100644\n' span_id:687) (Token id:Id.Lit_Chars val:'\t--- a/pre\n' span_id:688) 
          (Token id:Id.Lit_Chars val:'\t+++ b/post\n' span_id:689) (Token id:Id.Lit_Chars val:'\t@@ -1,3 +1,3 @@\n' span_id:690) 
          (Token id:Id.Lit_Chars val:'\ta\n' span_id:691) (Token id:Id.Lit_Chars val:'\n' span_id:692) (Token id:Id.Lit_Chars val:'\t[-b-]{+c+}\n' span_id:693) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:694) (Token id:Id.Lit_Chars val:'\tcat >pre <<-\\EOF &&\n' span_id:695) 
          (Token id:Id.Lit_Chars val:'\ta\n' span_id:696) (Token id:Id.Lit_Chars val:'\n' span_id:697) (Token id:Id.Lit_Chars val:'\tb\n' span_id:698) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:699) (Token id:Id.Lit_Chars val:'\tcat >post <<-\\EOF &&\n' span_id:700) 
          (Token id:Id.Lit_Chars val:'\ta\n' span_id:701) (Token id:Id.Lit_Chars val:'\n' span_id:702) (Token id:Id.Lit_Chars val:'\tc\n' span_id:703) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:704) (Token id:Id.Lit_Chars val:'\ttest_config diff.suppress-blank-empty true &&\n' span_id:705) 
          (Token id:Id.Lit_Chars val:'\tword_diff --word-diff=plain\n' span_id:706)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'word-diff with no newline at EOF' span_id:713))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:717) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:718) (Token id:Id.Lit_Chars val:'\tdiff --git a/pre b/post\n' span_id:719) 
          (Token id:Id.Lit_Chars val:'\tindex 7bf316e..3dd0303 100644\n' span_id:720) (Token id:Id.Lit_Chars val:'\t--- a/pre\n' span_id:721) 
          (Token id:Id.Lit_Chars val:'\t+++ b/post\n' span_id:722) (Token id:Id.Lit_Chars val:'\t@@ -1 +1 @@\n' span_id:723) 
          (Token id:Id.Lit_Chars val:'\ta a [-a-]{+ab+} a a\n' span_id:724) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:725) 
          (Token id:Id.Lit_Chars val:'\tprintf "%s" "a a a a a" >pre &&\n' span_id:726) (Token id:Id.Lit_Chars val:'\tprintf "%s" "a a ab a a" >post &&\n' span_id:727) 
          (Token id:Id.Lit_Chars val:'\tword_diff --word-diff=plain\n' span_id:728)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup history with two files' span_id:735))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:739) 
          (Token id:Id.Lit_Chars val:'\techo "a b; c" >a.tex &&\n' span_id:740) (Token id:Id.Lit_Chars val:'\techo "a b; c" >z.txt &&\n' span_id:741) 
          (Token id:Id.Lit_Chars val:'\tgit add a.tex z.txt &&\n' span_id:742) (Token id:Id.Lit_Chars val:'\tgit commit -minitial &&\n' span_id:743) 
          (Token id:Id.Lit_Chars val:'\n' span_id:744) (Token id:Id.Lit_Chars val:'\t# modify both\n' span_id:745) 
          (Token id:Id.Lit_Chars val:'\techo "a bx; c" >a.tex &&\n' span_id:746) (Token id:Id.Lit_Chars val:'\techo "a bx; c" >z.txt &&\n' span_id:747) 
          (Token id:Id.Lit_Chars val:'\tgit commit -mmodified -a\n' span_id:748)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'wordRegex for the first file does not apply to the second'
            span_id: 755
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:759) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "*.tex diff=tex" >.gitattributes &&\n'
            span_id: 760
          ) (Token id:Id.Lit_Chars val:'\ttest_config diff.tex.wordRegex "[a-z]+|." &&\n' span_id:761) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:762) (Token id:Id.Lit_Chars val:'\t\tdiff --git a/a.tex b/a.tex\n' span_id:763) 
          (Token id:Id.Lit_Chars val:'\t\t--- a/a.tex\n' span_id:764) (Token id:Id.Lit_Chars val:'\t\t+++ b/a.tex\n' span_id:765) 
          (Token id:Id.Lit_Chars val:'\t\t@@ -1 +1 @@\n' span_id:766) (Token id:Id.Lit_Chars val:'\t\ta [-b-]{+bx+}; c\n' span_id:767) 
          (Token id:Id.Lit_Chars val:'\t\tdiff --git a/z.txt b/z.txt\n' span_id:768) (Token id:Id.Lit_Chars val:'\t\t--- a/z.txt\n' span_id:769) 
          (Token id:Id.Lit_Chars val:'\t\t+++ b/z.txt\n' span_id:770) (Token id:Id.Lit_Chars val:'\t\t@@ -1 +1 @@\n' span_id:771) 
          (Token id:Id.Lit_Chars val:'\t\ta [-b;-]{+bx;+} c\n' span_id:772) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:773) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --word-diff HEAD~ >actual &&\n'
            span_id: 774
          ) (Token id:Id.Lit_Chars val:'\tcompare_diff_patch expect actual\n' span_id:775)
        )
      }
    )
    (C {(test_done)})
  ]
)