(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:'apply same filename' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: modify
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [{(sed)} {(-e)} {(DQ ($ Id.VSub_Number '$1'))}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Less val:'<' span_id:31)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_Number '$2'))}
                    )
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:37)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_Number '$2')) (.x)}
                    )
                  ]
                )
                (C {(mv)} {(DQ ($ Id.VSub_Number '$2')) (.x)} {(DQ ($ Id.VSub_Number '$2'))})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:66) 
          (Token id:Id.Lit_Chars val:'\tfor i in a b c d e f g h i j k l m\n' span_id:67) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:68) (Token id:Id.Lit_Chars val:'\t\techo $i\n' span_id:69) 
          (Token id:Id.Lit_Chars val:'\tdone >same_fn &&\n' span_id:70) (Token id:Id.Lit_Chars val:'\tcp same_fn other_fn &&\n' span_id:71) 
          (Token id:Id.Lit_Chars val:'\tgit add same_fn other_fn &&\n' span_id:72) (Token id:Id.Lit_Chars val:'\tgit commit -m initial\n' span_id:73)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'apply same filename with independent changes' span_id:79))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:83) 
          (Token id:Id.Lit_Chars val:'\tmodify "s/^d/z/" same_fn &&\n' span_id:84) (Token id:Id.Lit_Chars val:'\tgit diff > patch0 &&\n' span_id:85) 
          (Token id:Id.Lit_Chars val:'\tgit add same_fn &&\n' span_id:86) (Token id:Id.Lit_Chars val:'\tmodify "s/^i/y/" same_fn &&\n' span_id:87) 
          (Token id:Id.Lit_Chars val:'\tgit diff >> patch0 &&\n' span_id:88) (Token id:Id.Lit_Chars val:'\tcp same_fn same_fn2 &&\n' span_id:89) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:90) (Token id:Id.Lit_Chars val:'\tgit apply patch0 &&\n' span_id:91) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp same_fn same_fn2\n' span_id:92)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'apply same filename with overlapping changes' span_id:99))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:103) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:104) (Token id:Id.Lit_Chars val:'\tmodify "s/^d/z/" same_fn &&\n' span_id:105) 
          (Token id:Id.Lit_Chars val:'\tgit diff > patch0 &&\n' span_id:106) (Token id:Id.Lit_Chars val:'\tgit add same_fn &&\n' span_id:107) 
          (Token id:Id.Lit_Chars val:'\tmodify "s/^e/y/" same_fn &&\n' span_id:108) (Token id:Id.Lit_Chars val:'\tgit diff >> patch0 &&\n' span_id:109) 
          (Token id:Id.Lit_Chars val:'\tcp same_fn same_fn2 &&\n' span_id:110) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:111) 
          (Token id:Id.Lit_Chars val:'\tgit apply patch0 &&\n' span_id:112) (Token id:Id.Lit_Chars val:'\ttest_cmp same_fn same_fn2\n' span_id:113)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'apply same new filename after rename' span_id:120))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:124) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:125) (Token id:Id.Lit_Chars val:'\tgit mv same_fn new_fn &&\n' span_id:126) 
          (Token id:Id.Lit_Chars val:'\tmodify "s/^d/z/" new_fn &&\n' span_id:127) (Token id:Id.Lit_Chars val:'\tgit add new_fn &&\n' span_id:128) 
          (Token id:Id.Lit_Chars val:'\tgit diff -M --cached > patch1 &&\n' span_id:129) (Token id:Id.Lit_Chars val:'\tmodify "s/^e/y/" new_fn &&\n' span_id:130) 
          (Token id:Id.Lit_Chars val:'\tgit diff >> patch1 &&\n' span_id:131) (Token id:Id.Lit_Chars val:'\tcp new_fn new_fn2 &&\n' span_id:132) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:133) (Token id:Id.Lit_Chars val:'\tgit apply --index patch1 &&\n' span_id:134) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp new_fn new_fn2\n' span_id:135)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'apply same old filename after rename -- should fail.'
            span_id: 142
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:146) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:147) (Token id:Id.Lit_Chars val:'\tgit mv same_fn new_fn &&\n' span_id:148) 
          (Token id:Id.Lit_Chars val:'\tmodify "s/^d/z/" new_fn &&\n' span_id:149) (Token id:Id.Lit_Chars val:'\tgit add new_fn &&\n' span_id:150) 
          (Token id:Id.Lit_Chars val:'\tgit diff -M --cached > patch1 &&\n' span_id:151) (Token id:Id.Lit_Chars val:'\tgit mv new_fn same_fn &&\n' span_id:152) 
          (Token id:Id.Lit_Chars val:'\tmodify "s/^e/y/" same_fn &&\n' span_id:153) (Token id:Id.Lit_Chars val:'\tgit diff >> patch1 &&\n' span_id:154) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:155) (Token id:Id.Lit_Chars val:'\ttest_must_fail git apply patch1\n' span_id:156)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'apply A->B (rename), C->A (rename), A->A -- should pass.'
            span_id: 163
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:167) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:168) (Token id:Id.Lit_Chars val:'\tgit mv same_fn new_fn &&\n' span_id:169) 
          (Token id:Id.Lit_Chars val:'\tmodify "s/^d/z/" new_fn &&\n' span_id:170) (Token id:Id.Lit_Chars val:'\tgit add new_fn &&\n' span_id:171) 
          (Token id:Id.Lit_Chars val:'\tgit diff -M --cached > patch1 &&\n' span_id:172) (Token id:Id.Lit_Chars val:'\tgit commit -m "a rename" &&\n' span_id:173) 
          (Token id:Id.Lit_Chars val:'\tgit mv other_fn same_fn &&\n' span_id:174) (Token id:Id.Lit_Chars val:'\tmodify "s/^e/y/" same_fn &&\n' span_id:175) 
          (Token id:Id.Lit_Chars val:'\tgit add same_fn &&\n' span_id:176) (Token id:Id.Lit_Chars val:'\tgit diff -M --cached >> patch1 &&\n' span_id:177) 
          (Token id:Id.Lit_Chars val:'\tmodify "s/^g/x/" same_fn &&\n' span_id:178) (Token id:Id.Lit_Chars val:'\tgit diff >> patch1 &&\n' span_id:179) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard HEAD^ &&\n' span_id:180) (Token id:Id.Lit_Chars val:'\tgit apply patch1\n' span_id:181)
        )
      }
    )
    (C {(test_done)})
  ]
)