(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 apply handling criss-cross rename patch.'
                  span_id: 6
                )
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: create_file
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:cnt)
                  op: assign_op.Equal
                  rhs: {(0)}
                  spids: [21]
                )
              ]
            )
            (command.WhileUntil
              keyword: (Token id:Id.KW_While val:while span_id:25)
              cond: [(C {(test)} {($ Id.VSub_DollarName '$cnt')} {(-le)} {(100)})]
              body: 
                (command.DoGroup
                  children: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:cnt)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (word_part.ArithSub
                                anode: 
                                  (arith_expr.Binary
                                    op_id: Id.Arith_Plus
                                    left: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$cnt')})
                                    right: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)})
                                  )
                              )
                            }
                          spids: [39]
                        )
                      ]
                    )
                    (command.Simple
                      words: [{(echo)} {(DQ ($ Id.VSub_Number '$2'))}]
                      redirects: [
                        (redir.Redir
                          op: (Token id:Id.Redir_DGreat val:'>>' span_id:56)
                          fd: -1
                          arg_word: {(DQ ($ Id.VSub_Number '$1'))}
                        )
                      ]
                    )
                  ]
                )
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:71))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:75) 
          (Token
            id: Id.Lit_Chars
            val: '\t# Ensure that file sizes are different, because on Windows\n'
            span_id: 76
          ) (Token id:Id.Lit_Chars val:'\t# lstat() does not discover inode numbers, and we need\n' span_id:77) 
          (Token
            id: Id.Lit_Chars
            val: '\t# other properties to discover swapped files\n'
            span_id: 78
          ) (Token id:Id.Lit_Chars val:'\t# (mtime is not always different, either).\n' span_id:79) 
          (Token id:Id.Lit_Chars val:'\tcreate_file file1 "some content" &&\n' span_id:80) (Token id:Id.Lit_Chars val:'\tcreate_file file2 "some other content" &&\n' span_id:81) 
          (Token
            id: Id.Lit_Chars
            val: '\tcreate_file file3 "again something else" &&\n'
            span_id: 82
          ) (Token id:Id.Lit_Chars val:'\tgit add file1 file2 file3 &&\n' span_id:83) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m 1\n' span_id:84)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'criss-cross rename' span_id:91))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:95) 
          (Token id:Id.Lit_Chars val:'\tmv file1 tmp &&\n' span_id:96) (Token id:Id.Lit_Chars val:'\tmv file2 file1 &&\n' span_id:97) 
          (Token id:Id.Lit_Chars val:'\tmv tmp file2 &&\n' span_id:98) (Token id:Id.Lit_Chars val:'\tcp file1 file1-swapped &&\n' span_id:99) 
          (Token id:Id.Lit_Chars val:'\tcp file2 file2-swapped\n' span_id:100)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff -M -B' span_id:107))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:111) 
          (Token id:Id.Lit_Chars val:'\tgit diff -M -B > diff &&\n' span_id:112) (Token id:Id.Lit_Chars val:'\tgit reset --hard\n' span_id:113) 
          (Token id:Id.Lit_Chars val:'\n' span_id:114)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:apply span_id:121))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:125) 
          (Token id:Id.Lit_Chars val:'\tgit apply diff &&\n' span_id:126) (Token id:Id.Lit_Chars val:'\ttest_cmp file1 file1-swapped &&\n' span_id:127) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp file2 file2-swapped\n' span_id:128)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'criss-cross rename' span_id:135))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:139) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:140) (Token id:Id.Lit_Chars val:'\tmv file1 tmp &&\n' span_id:141) 
          (Token id:Id.Lit_Chars val:'\tmv file2 file1 &&\n' span_id:142) (Token id:Id.Lit_Chars val:'\tmv file3 file2 &&\n' span_id:143) 
          (Token id:Id.Lit_Chars val:'\tmv tmp file3 &&\n' span_id:144) (Token id:Id.Lit_Chars val:'\tcp file1 file1-swapped &&\n' span_id:145) 
          (Token id:Id.Lit_Chars val:'\tcp file2 file2-swapped &&\n' span_id:146) (Token id:Id.Lit_Chars val:'\tcp file3 file3-swapped\n' span_id:147)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff -M -B' span_id:154))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:158) 
          (Token id:Id.Lit_Chars val:'\tgit diff -M -B > diff &&\n' span_id:159) (Token id:Id.Lit_Chars val:'\tgit reset --hard\n' span_id:160)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:apply span_id:167))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:171) 
          (Token id:Id.Lit_Chars val:'\tgit apply diff &&\n' span_id:172) (Token id:Id.Lit_Chars val:'\ttest_cmp file1 file1-swapped &&\n' span_id:173) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp file2 file2-swapped &&\n' span_id:174) (Token id:Id.Lit_Chars val:'\ttest_cmp file3 file3-swapped\n' span_id:175)
        )
      }
    )
    (C {(test_done)})
  ]
)