(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: 'combined and merge diff handle binary files and textconv'
                  span_id: 6
                )
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup binary merge conflict' span_id:17))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:21) 
          (Token id:Id.Lit_Chars val:'\techo oneQ1 | q_to_nul >binary &&\n' span_id:22) (Token id:Id.Lit_Chars val:'\tgit add binary &&\n' span_id:23) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m one &&\n' span_id:24) (Token id:Id.Lit_Chars val:'\techo twoQ2 | q_to_nul >binary &&\n' span_id:25) 
          (Token id:Id.Lit_Chars val:'\tgit commit -a -m two &&\n' span_id:26) (Token id:Id.Lit_Chars val:'\tgit checkout -b branch-binary HEAD^ &&\n' span_id:27) 
          (Token id:Id.Lit_Chars val:'\techo threeQ3 | q_to_nul >binary &&\n' span_id:28) (Token id:Id.Lit_Chars val:'\tgit commit -a -m three &&\n' span_id:29) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge master &&\n' span_id:30) (Token id:Id.Lit_Chars val:'\techo resolvedQhooray | q_to_nul >binary &&\n' span_id:31) 
          (Token id:Id.Lit_Chars val:'\tgit commit -a -m resolved\n' span_id:32)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir op:(Token id:Id.Redir_Great val:'>' span_id:38) fd:-1 arg_word:{(expect)})
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:41)
          fd: -1
          here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:43))}
          here_end_span_id: 56
          stdin_parts: [
            ('resolved\n')
            ('\n')
            ('diff --git a/binary b/binary\n')
            ('index 7ea6ded..9563691 100644\n')
            ('Binary files a/binary and b/binary differ\n')
            ('resolved\n')
            ('\n')
            ('diff --git a/binary b/binary\n')
            ('index 6197570..9563691 100644\n')
            ('Binary files a/binary and b/binary differ\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff -m indicates binary-ness' span_id:60))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:64) 
          (Token id:Id.Lit_Chars val:'\tgit show --format=%s -m >actual &&\n' span_id:65) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:66)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir op:(Token id:Id.Redir_Great val:'>' span_id:72) fd:-1 arg_word:{(expect)})
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:75)
          fd: -1
          here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:77))}
          here_end_span_id: 85
          stdin_parts: [
            ('resolved\n')
            ('\n')
            ('diff --combined binary\n')
            ('index 7ea6ded,6197570..9563691\n')
            ('Binary files differ\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff -c indicates binary-ness' span_id:89))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:93) 
          (Token id:Id.Lit_Chars val:'\tgit show --format=%s -c >actual &&\n' span_id:94) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:95)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:101)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:104)
          fd: -1
          here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:106))}
          here_end_span_id: 114
          stdin_parts: [
            ('resolved\n')
            ('\n')
            ('diff --cc binary\n')
            ('index 7ea6ded,6197570..9563691\n')
            ('Binary files differ\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff --cc indicates binary-ness' span_id:118))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:122) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit show --format=%s --cc >actual &&\n'
            span_id: 123
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:124)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup non-binary with binary attribute' span_id:131))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:135) 
          (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:136) (Token id:Id.Lit_Chars val:'\ttest_commit one text &&\n' span_id:137) 
          (Token id:Id.Lit_Chars val:'\ttest_commit two text &&\n' span_id:138) (Token id:Id.Lit_Chars val:'\tgit checkout -b branch-text HEAD^ &&\n' span_id:139) 
          (Token id:Id.Lit_Chars val:'\ttest_commit three text &&\n' span_id:140) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge master &&\n' span_id:141) 
          (Token id:Id.Lit_Chars val:'\ttest_commit resolved text &&\n' span_id:142) (Token id:Id.Lit_Chars val:'\techo text -diff >.gitattributes\n' span_id:143)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:149)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:152)
          fd: -1
          here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:154))}
          here_end_span_id: 167
          stdin_parts: [
            ('resolved\n')
            ('\n')
            ('diff --git a/text b/text\n')
            ('index 2bdf67a..2ab19ae 100644\n')
            ('Binary files a/text and b/text differ\n')
            ('resolved\n')
            ('\n')
            ('diff --git a/text b/text\n')
            ('index f719efd..2ab19ae 100644\n')
            ('Binary files a/text and b/text differ\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff -m respects binary attribute' span_id:171))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:175) 
          (Token id:Id.Lit_Chars val:'\tgit show --format=%s -m >actual &&\n' span_id:176) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:177)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:183)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:186)
          fd: -1
          here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:188))}
          here_end_span_id: 196
          stdin_parts: [
            ('resolved\n')
            ('\n')
            ('diff --combined text\n')
            ('index 2bdf67a,f719efd..2ab19ae\n')
            ('Binary files differ\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff -c respects binary attribute' span_id:200))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:204) 
          (Token id:Id.Lit_Chars val:'\tgit show --format=%s -c >actual &&\n' span_id:205) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:206)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:212)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:215)
          fd: -1
          here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:217))}
          here_end_span_id: 225
          stdin_parts: [
            ('resolved\n')
            ('\n')
            ('diff --cc text\n')
            ('index 2bdf67a,f719efd..2ab19ae\n')
            ('Binary files differ\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff --cc respects binary attribute' span_id:229))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:233) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit show --format=%s --cc >actual &&\n'
            span_id: 234
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:235)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup textconv attribute' span_id:242))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:246) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "text diff=upcase" >.gitattributes &&\n'
            span_id: 247
          ) (Token id:Id.Lit_Chars val:'\tgit config diff.upcase.textconv "tr a-z A-Z <"\n' span_id:248)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:254)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:257)
          fd: -1
          here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:259))}
          here_end_span_id: 280
          stdin_parts: [
            ('resolved\n')
            ('\n')
            ('diff --git a/text b/text\n')
            ('index 2bdf67a..2ab19ae 100644\n')
            ('--- a/text\n')
            ('+++ b/text\n')
            ('@@ -1 +1 @@\n')
            ('-THREE\n')
            ('+RESOLVED\n')
            ('resolved\n')
            ('\n')
            ('diff --git a/text b/text\n')
            ('index f719efd..2ab19ae 100644\n')
            ('--- a/text\n')
            ('+++ b/text\n')
            ('@@ -1 +1 @@\n')
            ('-TWO\n')
            ('+RESOLVED\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff -m respects textconv attribute' span_id:284))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:288) 
          (Token id:Id.Lit_Chars val:'\tgit show --format=%s -m >actual &&\n' span_id:289) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:290)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:296)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:299)
          fd: -1
          here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:301))}
          here_end_span_id: 314
          stdin_parts: [
            ('resolved\n')
            ('\n')
            ('diff --combined text\n')
            ('index 2bdf67a,f719efd..2ab19ae\n')
            ('--- a/text\n')
            ('+++ b/text\n')
            ('@@@ -1,1 -1,1 +1,1 @@@\n')
            ('- THREE\n')
            (' -TWO\n')
            ('++RESOLVED\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff -c respects textconv attribute' span_id:318))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:322) 
          (Token id:Id.Lit_Chars val:'\tgit show --format=%s -c >actual &&\n' span_id:323) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:324)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:330)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:333)
          fd: -1
          here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:335))}
          here_end_span_id: 348
          stdin_parts: [
            ('resolved\n')
            ('\n')
            ('diff --cc text\n')
            ('index 2bdf67a,f719efd..2ab19ae\n')
            ('--- a/text\n')
            ('+++ b/text\n')
            ('@@@ -1,1 -1,1 +1,1 @@@\n')
            ('- THREE\n')
            (' -TWO\n')
            ('++RESOLVED\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff --cc respects textconv attribute' span_id:352))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:356) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit show --format=%s --cc >actual &&\n'
            span_id: 357
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:358)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:364)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:367)
          fd: -1
          here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:369))}
          here_end_span_id: 380
          stdin_parts: [
            ('diff --combined text\n')
            ('index 2bdf67a,f719efd..2ab19ae\n')
            ('--- a/text\n')
            ('+++ b/text\n')
            ('@@@ -1,1 -1,1 +1,1 @@@\n')
            ('- three\n')
            (' -two\n')
            ('++resolved\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff-tree plumbing does not respect textconv' span_id:384))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:388) 
          (Token id:Id.Lit_Chars val:'\tgit diff-tree HEAD -c -p >full &&\n' span_id:389) (Token id:Id.Lit_Chars val:'\ttail -n +2 full >actual &&\n' span_id:390) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:391)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:397)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:400)
          fd: -1
          here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:402))}
          here_end_span_id: 415
          stdin_parts: [
            ('diff --cc text\n')
            ('index 2bdf67a,f719efd..0000000\n')
            ('--- a/text\n')
            ('+++ b/text\n')
            ('@@@ -1,1 -1,1 +1,5 @@@\n')
            ('++<<<<<<< HEAD\n')
            (' +THREE\n')
            ('++=======\n')
            ('+ TWO\n')
            ('++>>>>>>> MASTER\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff --cc respects textconv on worktree file' span_id:419))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:423) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard HEAD^ &&\n' span_id:424) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge master &&\n' span_id:425) 
          (Token id:Id.Lit_Chars val:'\tgit diff >actual &&\n' span_id:426) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:427)
        )
      }
    )
    (C {(test_done)})
  ]
)