(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:'rewrite diff' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:20) (Token id:Id.Lit_Chars val:'\n' span_id:21) 
          (Token
            id: Id.Lit_Chars
            val: '\tcat "$TEST_DIRECTORY"/../COPYING >test &&\n'
            span_id: 22
          ) (Token id:Id.Lit_Chars val:'\tgit add test &&\n' span_id:23) 
          (Token id:Id.Lit_Chars val:'\ttr \\\n' span_id:24) 
          (Token
            id: Id.Lit_Chars
            val: '\t  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" \\\n'
            span_id: 25
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t  "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM" \\\n'
            span_id: 26
          ) (Token id:Id.Lit_Chars val:'\t  <"$TEST_DIRECTORY"/../COPYING >test &&\n' span_id:27) 
          (Token id:Id.Lit_Chars val:'\techo "to be deleted" >test2 &&\n' span_id:28) (Token id:Id.Lit_Chars val:'\tgit add test2\n' span_id:29) (Token id:Id.Lit_Chars val:'\n' span_id:30)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'detect rewrite' span_id:37))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:41) (Token id:Id.Lit_Chars val:'\n' span_id:42) 
          (Token
            id: Id.Lit_Chars
            val: '\tactual=$(git diff-files -B --summary test) &&\n'
            span_id: 43
          ) (Token id:Id.Lit_Chars val:'\tverbose expr "$actual" : " rewrite test ([0-9]*%)$"\n' span_id:44) 
          (Token id:Id.Lit_Chars val:'\n' span_id:45)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir op:(Token id:Id.Redir_Great val:'>' span_id:51) fd:-1 arg_word:{(expect)})
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:54)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 65
          stdin_parts: [
            ('diff --git a/test2 b/test2\n')
            ('deleted file mode 100644\n')
            ('index 4202011..0000000\n')
            ('--- a/test2\n')
            ('+++ /dev/null\n')
            ('@@ -1 +0,0 @@\n')
            ('-to be deleted\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'show deletion diff without -D' span_id:69))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:73) (Token id:Id.Lit_Chars val:'\n' span_id:74) 
          (Token id:Id.Lit_Chars val:'\trm test2 &&\n' span_id:75) (Token id:Id.Lit_Chars val:'\tgit diff -- test2 >actual &&\n' span_id:76) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:77)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir op:(Token id:Id.Redir_Great val:'>' span_id:83) fd:-1 arg_word:{(expect)})
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:86)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 93
          stdin_parts: [
            ('diff --git a/test2 b/test2\n')
            ('deleted file mode 100644\n')
            ('index 4202011..0000000\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'suppress deletion diff with -D' span_id:97))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:101) (Token id:Id.Lit_Chars val:'\n' span_id:102) 
          (Token id:Id.Lit_Chars val:'\tgit diff -D -- test2 >actual &&\n' span_id:103) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:104)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'show deletion diff with -B' span_id:111))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:115) (Token id:Id.Lit_Chars val:'\n' span_id:116) 
          (Token id:Id.Lit_Chars val:'\tgit diff -B -- test >actual &&\n' span_id:117) (Token id:Id.Lit_Chars val:'\tgrep "Linus Torvalds" actual\n' span_id:118)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'suppress deletion diff with -B -D' span_id:125))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:129) (Token id:Id.Lit_Chars val:'\n' span_id:130) 
          (Token id:Id.Lit_Chars val:'\tgit diff -B -D -- test >actual &&\n' span_id:131) (Token id:Id.Lit_Chars val:'\tgrep -v "Linus Torvalds" actual\n' span_id:132)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'prepare a file that ends with an incomplete line'
            span_id: 139
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:143) 
          (Token id:Id.Lit_Chars val:'\ttest_seq 1 99 >seq &&\n' span_id:144) (Token id:Id.Lit_Chars val:'\tprintf 100 >>seq &&\n' span_id:145) 
          (Token id:Id.Lit_Chars val:'\tgit add seq &&\n' span_id:146) (Token id:Id.Lit_Chars val:'\tgit commit seq -m seq\n' span_id:147)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rewrite the middle 90% of sequence file and terminate with newline'
            span_id: 154
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:158) 
          (Token id:Id.Lit_Chars val:'\ttest_seq 1 5 >seq &&\n' span_id:159) (Token id:Id.Lit_Chars val:'\ttest_seq 9331 9420 >>seq &&\n' span_id:160) 
          (Token id:Id.Lit_Chars val:'\ttest_seq 96 100 >>seq\n' span_id:161)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'confirm that sequence file is considered a rewrite'
            span_id: 168
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:172) 
          (Token id:Id.Lit_Chars val:'\tgit diff -B seq >res &&\n' span_id:173) (Token id:Id.Lit_Chars val:'\tgrep "dissimilarity index" res\n' span_id:174)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'no newline at eof is on its own line without -B' span_id:181))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:185) 
          (Token id:Id.Lit_Chars val:'\tgit diff seq >res &&\n' span_id:186) (Token id:Id.Lit_Chars val:'\tgrep "^\\\\\\\\ " res &&\n' span_id:187) 
          (Token id:Id.Lit_Chars val:'\t! grep "^..*\\\\\\\\ " res\n' span_id:188)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'no newline at eof is on its own line with -B' span_id:195))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:199) 
          (Token id:Id.Lit_Chars val:'\tgit diff -B seq >res &&\n' span_id:200) (Token id:Id.Lit_Chars val:'\tgrep "^\\\\\\\\ " res &&\n' span_id:201) 
          (Token id:Id.Lit_Chars val:'\t! grep "^..*\\\\\\\\ " res\n' span_id:202)
        )
      }
    )
    (C {(test_done)})
  ]
)