(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:'git cat-file textconv support' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir op:(Token id:Id.Redir_Great val:'>' span_id:16) fd:-1 arg_word:{(helper)})
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:19)
          fd: -1
          here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:21))}
          here_end_span_id: 27
          stdin_parts: [
            ('#!/bin/sh\n')
            ('grep -q \'^bin: \' "$1" || { echo "E: $1 is not \\"binary\\" file" 1>&2; exit 1; }\n')
            ('sed \'s/^bin: /converted: /\' "$1"\n')
          ]
        )
      ]
    )
    (C {(chmod)} {(Id.Lit_Other '+') (x)} {(helper)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup ' span_id:39))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:43) 
          (Token id:Id.Lit_Chars val:'\techo "bin: test" >one.bin &&\n' span_id:44) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add one.bin symlink.bin &&\n' span_id:45) 
          (Token id:Id.Lit_Chars val:'\tgit add . &&\n' span_id:46) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tGIT_AUTHOR_NAME=Number1 git commit -a -m First --date="2010-01-01 18:00:00" &&\n'
            span_id: 47
          ) (Token id:Id.Lit_Chars val:'\techo "bin: test version 2" >one.bin &&\n' span_id:48) 
          (Token
            id: Id.Lit_Chars
            val: '\tGIT_AUTHOR_NAME=Number2 git commit -a -m Second --date="2010-01-01 20:00:00"\n'
            span_id: 49
          )
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:55)
          fd: -1
          arg_word: {(expected)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:58)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 63
          stdin_parts: [('bin: test version 2\n')]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'no filter specified' span_id:68))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:72) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file --textconv :one.bin >result &&\n'
            span_id: 73
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected result\n' span_id:74)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup textconv filters' span_id:81))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:85) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "*.bin diff=test" >.gitattributes &&\n'
            span_id: 86
          ) (Token id:Id.Lit_Chars val:'\tgit config diff.test.textconv ./helper &&\n' span_id:87) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config diff.test.cachetextconv false\n'
            span_id: 88
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cat-file without --textconv' span_id:95))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:99) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file blob :one.bin >result &&\n'
            span_id: 100
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected result\n' span_id:101)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:107)
          fd: -1
          arg_word: {(expected)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:110)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 115
          stdin_parts: [('bin: test\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cat-file without --textconv on previous commit' span_id:120))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:124) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file -p HEAD^:one.bin >result &&\n'
            span_id: 125
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected result\n' span_id:126)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:132)
          fd: -1
          arg_word: {(expected)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:135)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 140
          stdin_parts: [('converted: test version 2\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cat-file --textconv on last commit' span_id:145))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:149) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file --textconv :one.bin >result &&\n'
            span_id: 150
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected result\n' span_id:151)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:157)
          fd: -1
          arg_word: {(expected)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:160)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 165
          stdin_parts: [('converted: test\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cat-file --textconv on previous commit' span_id:170))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:174) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file --textconv HEAD^:one.bin >result &&\n'
            span_id: 175
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected result\n' span_id:176)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cat-file without --textconv (symlink)' span_id:183))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:187) 
          (Token id:Id.Lit_Chars val:'\tprintf "%s" "one.bin" >expected &&\n' span_id:188) (Token id:Id.Lit_Chars val:'\tgit cat-file blob :symlink.bin >result &&\n' span_id:189) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected result\n' span_id:190)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cat-file --textconv on index (symlink)' span_id:198))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:202) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file --textconv :symlink.bin >result &&\n'
            span_id: 203
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected result\n' span_id:204)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cat-file --textconv on HEAD (symlink)' span_id:211))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:215) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file --textconv HEAD:symlink.bin >result &&\n'
            span_id: 216
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected result\n' span_id:217)
        )
      }
    )
    (C {(test_done)})
  ]
)