(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:'Test rename detection in diff engine.\n' span_id:15) 
                (Token id:Id.Lit_Chars val:'\n' span_id:16)
              )
            }
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) (/diff-lib.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:34))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:38) 
          (Token id:Id.Lit_Chars val:'\tcat >path0 <<-\\EOF &&\n' span_id:39) (Token id:Id.Lit_Chars val:'\tLine 1\n' span_id:40) 
          (Token id:Id.Lit_Chars val:'\tLine 2\n' span_id:41) (Token id:Id.Lit_Chars val:'\tLine 3\n' span_id:42) 
          (Token id:Id.Lit_Chars val:'\tLine 4\n' span_id:43) (Token id:Id.Lit_Chars val:'\tLine 5\n' span_id:44) 
          (Token id:Id.Lit_Chars val:'\tLine 6\n' span_id:45) (Token id:Id.Lit_Chars val:'\tLine 7\n' span_id:46) 
          (Token id:Id.Lit_Chars val:'\tLine 8\n' span_id:47) (Token id:Id.Lit_Chars val:'\tLine 9\n' span_id:48) 
          (Token id:Id.Lit_Chars val:'\tLine 10\n' span_id:49) (Token id:Id.Lit_Chars val:'\tline 11\n' span_id:50) 
          (Token id:Id.Lit_Chars val:'\tLine 12\n' span_id:51) (Token id:Id.Lit_Chars val:'\tLine 13\n' span_id:52) 
          (Token id:Id.Lit_Chars val:'\tLine 14\n' span_id:53) (Token id:Id.Lit_Chars val:'\tLine 15\n' span_id:54) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:55) 
          (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:56) (Token id:Id.Lit_Chars val:'\tdiff --git a/path0 b/path1\n' span_id:57) 
          (Token id:Id.Lit_Chars val:'\trename from path0\n' span_id:58) (Token id:Id.Lit_Chars val:'\trename to path1\n' span_id:59) 
          (Token id:Id.Lit_Chars val:'\t--- a/path0\n' span_id:60) (Token id:Id.Lit_Chars val:'\t+++ b/path1\n' span_id:61) 
          (Token id:Id.Lit_Chars val:'\t@@ -8,7 +8,7 @@ Line 7\n' span_id:62) (Token id:Id.Lit_Chars val:'\t Line 8\n' span_id:63) 
          (Token id:Id.Lit_Chars val:'\t Line 9\n' span_id:64) (Token id:Id.Lit_Chars val:'\t Line 10\n' span_id:65) 
          (Token id:Id.Lit_Chars val:'\t-line 11\n' span_id:66) (Token id:Id.Lit_Chars val:'\t+Line 11\n' span_id:67) 
          (Token id:Id.Lit_Chars val:'\t Line 12\n' span_id:68) (Token id:Id.Lit_Chars val:'\t Line 13\n' span_id:69) 
          (Token id:Id.Lit_Chars val:'\t Line 14\n' span_id:70) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:71) 
          (Token id:Id.Lit_Chars val:'\tcat >no-rename <<-\\EOF\n' span_id:72) (Token id:Id.Lit_Chars val:'\tdiff --git a/path0 b/path0\n' span_id:73) 
          (Token id:Id.Lit_Chars val:'\tdeleted file mode 100644\n' span_id:74) (Token id:Id.Lit_Chars val:'\tindex fdbec44..0000000\n' span_id:75) 
          (Token id:Id.Lit_Chars val:'\t--- a/path0\n' span_id:76) (Token id:Id.Lit_Chars val:'\t+++ /dev/null\n' span_id:77) 
          (Token id:Id.Lit_Chars val:'\t@@ -1,15 +0,0 @@\n' span_id:78) (Token id:Id.Lit_Chars val:'\t-Line 1\n' span_id:79) 
          (Token id:Id.Lit_Chars val:'\t-Line 2\n' span_id:80) (Token id:Id.Lit_Chars val:'\t-Line 3\n' span_id:81) 
          (Token id:Id.Lit_Chars val:'\t-Line 4\n' span_id:82) (Token id:Id.Lit_Chars val:'\t-Line 5\n' span_id:83) 
          (Token id:Id.Lit_Chars val:'\t-Line 6\n' span_id:84) (Token id:Id.Lit_Chars val:'\t-Line 7\n' span_id:85) 
          (Token id:Id.Lit_Chars val:'\t-Line 8\n' span_id:86) (Token id:Id.Lit_Chars val:'\t-Line 9\n' span_id:87) 
          (Token id:Id.Lit_Chars val:'\t-Line 10\n' span_id:88) (Token id:Id.Lit_Chars val:'\t-line 11\n' span_id:89) 
          (Token id:Id.Lit_Chars val:'\t-Line 12\n' span_id:90) (Token id:Id.Lit_Chars val:'\t-Line 13\n' span_id:91) 
          (Token id:Id.Lit_Chars val:'\t-Line 14\n' span_id:92) (Token id:Id.Lit_Chars val:'\t-Line 15\n' span_id:93) 
          (Token id:Id.Lit_Chars val:'\tdiff --git a/path1 b/path1\n' span_id:94) (Token id:Id.Lit_Chars val:'\tnew file mode 100644\n' span_id:95) 
          (Token id:Id.Lit_Chars val:'\tindex 0000000..752c50e\n' span_id:96) (Token id:Id.Lit_Chars val:'\t--- /dev/null\n' span_id:97) 
          (Token id:Id.Lit_Chars val:'\t+++ b/path1\n' span_id:98) (Token id:Id.Lit_Chars val:'\t@@ -0,0 +1,15 @@\n' span_id:99) 
          (Token id:Id.Lit_Chars val:'\t+Line 1\n' span_id:100) (Token id:Id.Lit_Chars val:'\t+Line 2\n' span_id:101) 
          (Token id:Id.Lit_Chars val:'\t+Line 3\n' span_id:102) (Token id:Id.Lit_Chars val:'\t+Line 4\n' span_id:103) 
          (Token id:Id.Lit_Chars val:'\t+Line 5\n' span_id:104) (Token id:Id.Lit_Chars val:'\t+Line 6\n' span_id:105) 
          (Token id:Id.Lit_Chars val:'\t+Line 7\n' span_id:106) (Token id:Id.Lit_Chars val:'\t+Line 8\n' span_id:107) 
          (Token id:Id.Lit_Chars val:'\t+Line 9\n' span_id:108) (Token id:Id.Lit_Chars val:'\t+Line 10\n' span_id:109) 
          (Token id:Id.Lit_Chars val:'\t+Line 11\n' span_id:110) (Token id:Id.Lit_Chars val:'\t+Line 12\n' span_id:111) 
          (Token id:Id.Lit_Chars val:'\t+Line 13\n' span_id:112) (Token id:Id.Lit_Chars val:'\t+Line 14\n' span_id:113) 
          (Token id:Id.Lit_Chars val:'\t+Line 15\n' span_id:114) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:115)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'update-index --add a file.' span_id:124))} {(SQ (Token id:Id.Lit_Chars val:'git update-index --add path0' span_id:130))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'write that tree.' span_id:139))} 
      {(SQ (Token id:Id.Lit_Chars val:'tree=$(git write-tree) && echo $tree' span_id:145))}
    )
    (command.Simple
      words: [{(sed)} {(-e)} {(SQ (Token id:Id.Lit_Chars val:s/line/Line/ span_id:154))}]
      redirects: [
        (redir.Redir op:(Token id:Id.Redir_Less val:'<' span_id:157) fd:-1 arg_word:{(path0)})
        (redir.Redir op:(Token id:Id.Redir_Great val:'>' span_id:160) fd:-1 arg_word:{(path1)})
      ]
    )
    (C {(rm)} {(-f)} {(path0)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'renamed and edited the file.' span_id:174))} {(SQ (Token id:Id.Lit_Chars val:'git update-index --add --remove path0 path1' span_id:180))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git diff-index -p -M after rename and editing.' span_id:189))} {(SQ (Token id:Id.Lit_Chars val:'git diff-index -p -M $tree >current' span_id:195))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'validate the output.' span_id:205))} 
      {(SQ (Token id:Id.Lit_Chars val:'compare_diff_patch current expected' span_id:211))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'test diff.renames=true' span_id:218))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:222) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit -c diff.renames=true diff --cached $tree >current &&\n'
            span_id: 223
          ) (Token id:Id.Lit_Chars val:'\tcompare_diff_patch current expected\n' span_id:224)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'test diff.renames=false' span_id:231))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:235) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit -c diff.renames=false diff --cached $tree >current &&\n'
            span_id: 236
          ) (Token id:Id.Lit_Chars val:'\tcompare_diff_patch current no-rename\n' span_id:237)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'test diff.renames unset' span_id:244))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:248) 
          (Token id:Id.Lit_Chars val:'\tgit diff --cached $tree >current &&\n' span_id:249) (Token id:Id.Lit_Chars val:'\tcompare_diff_patch current expected\n' span_id:250)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'favour same basenames over different ones' span_id:257))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:261) 
          (Token id:Id.Lit_Chars val:'\tcp path1 another-path &&\n' span_id:262) (Token id:Id.Lit_Chars val:'\tgit add another-path &&\n' span_id:263) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m 1 &&\n' span_id:264) (Token id:Id.Lit_Chars val:'\tgit rm path1 &&\n' span_id:265) 
          (Token id:Id.Lit_Chars val:'\tmkdir subdir &&\n' span_id:266) (Token id:Id.Lit_Chars val:'\tgit mv another-path subdir/path1 &&\n' span_id:267) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status | test_i18ngrep "renamed: .*path1 -> subdir/path1"'
            span_id: 268
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'favour same basenames even with minor differences'
            span_id: 275
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:279) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit show HEAD:path1 | sed "s/15/16/" > subdir/path1 &&\n'
            span_id: 280
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status | test_i18ngrep "renamed: .*path1 -> subdir/path1"'
            span_id: 281
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'two files with same basename and same content' span_id:288))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:292) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:293) (Token id:Id.Lit_Chars val:'\tmkdir -p dir/A dir/B &&\n' span_id:294) 
          (Token id:Id.Lit_Chars val:'\tcp path1 dir/A/file &&\n' span_id:295) (Token id:Id.Lit_Chars val:'\tcp path1 dir/B/file &&\n' span_id:296) 
          (Token id:Id.Lit_Chars val:'\tgit add dir &&\n' span_id:297) (Token id:Id.Lit_Chars val:'\tgit commit -m 2 &&\n' span_id:298) 
          (Token id:Id.Lit_Chars val:'\tgit mv dir other-dir &&\n' span_id:299) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status | test_i18ngrep "renamed: .*dir/A/file -> other-dir/A/file"\n'
            span_id: 300
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup for many rename source candidates' span_id:307))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:311) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:312) (Token id:Id.Lit_Chars val:'\tfor i in 0 1 2 3 4 5 6 7 8 9;\n' span_id:313) 
          (Token id:Id.Lit_Chars val:'\tdo\n' span_id:314) (Token id:Id.Lit_Chars val:'\t\tfor j in 0 1 2 3 4 5 6 7 8 9;\n' span_id:315) 
          (Token id:Id.Lit_Chars val:'\t\tdo\n' span_id:316) (Token id:Id.Lit_Chars val:'\t\t\techo "$i$j" >"path$i$j"\n' span_id:317) 
          (Token id:Id.Lit_Chars val:'\t\tdone\n' span_id:318) (Token id:Id.Lit_Chars val:'\tdone &&\n' span_id:319) 
          (Token id:Id.Lit_Chars val:'\tgit add "path??" &&\n' span_id:320) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:321) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "hundred" &&\n' span_id:322) (Token id:Id.Lit_Chars val:'\t(cat path1; echo new) >new-path &&\n' span_id:323) 
          (Token id:Id.Lit_Chars val:'\techo old >>path1 &&\n' span_id:324) (Token id:Id.Lit_Chars val:'\tgit add new-path path1 &&\n' span_id:325) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff -l 4 -C -C --cached --name-status >actual 2>actual.err &&\n'
            span_id: 326
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed -e "s/^\\([CM]\\)[0-9]*\t/\\1\t/" actual >actual.munged &&\n'
            span_id: 327
          ) (Token id:Id.Lit_Chars val:'\tcat >expect <<-EOF &&\n' span_id:328) 
          (Token id:Id.Lit_Chars val:'\tC\tpath1\tnew-path\n' span_id:329) (Token id:Id.Lit_Chars val:'\tM\tpath1\n' span_id:330) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:331) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual.munged &&\n' span_id:332) 
          (Token id:Id.Lit_Chars val:'\tgrep warning actual.err\n' span_id:333)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rename pretty print with nothing in common' span_id:340))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:344) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p a/b/ &&\n' span_id:345) (Token id:Id.Lit_Chars val:'\t: >a/b/c &&\n' span_id:346) 
          (Token id:Id.Lit_Chars val:'\tgit add a/b/c &&\n' span_id:347) (Token id:Id.Lit_Chars val:'\tgit commit -m "create a/b/c" &&\n' span_id:348) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p c/b/ &&\n' span_id:349) (Token id:Id.Lit_Chars val:'\tgit mv a/b/c c/b/a &&\n' span_id:350) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "a/b/c -> c/b/a" &&\n' span_id:351) (Token id:Id.Lit_Chars val:'\tgit diff -M --summary HEAD^ HEAD >output &&\n' span_id:352) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep " a/b/c => c/b/a " output &&\n'
            span_id: 353
          ) (Token id:Id.Lit_Chars val:'\tgit diff -M --stat HEAD^ HEAD >output &&\n' span_id:354) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep " a/b/c => c/b/a " output\n'
            span_id: 355
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rename pretty print with common prefix' span_id:362))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:366) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p c/d &&\n' span_id:367) (Token id:Id.Lit_Chars val:'\tgit mv c/b/a c/d/e &&\n' span_id:368) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "c/b/a -> c/d/e" &&\n' span_id:369) (Token id:Id.Lit_Chars val:'\tgit diff -M --summary HEAD^ HEAD >output &&\n' span_id:370) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep " c/{b/a => d/e} " output &&\n'
            span_id: 371
          ) (Token id:Id.Lit_Chars val:'\tgit diff -M --stat HEAD^ HEAD >output &&\n' span_id:372) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep " c/{b/a => d/e} " output\n'
            span_id: 373
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rename pretty print with common suffix' span_id:380))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:384) 
          (Token id:Id.Lit_Chars val:'\tmkdir d &&\n' span_id:385) (Token id:Id.Lit_Chars val:'\tgit mv c/d/e d/e &&\n' span_id:386) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "c/d/e -> d/e" &&\n' span_id:387) (Token id:Id.Lit_Chars val:'\tgit diff -M --summary HEAD^ HEAD >output &&\n' span_id:388) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep " {c/d => d}/e " output &&\n'
            span_id: 389
          ) (Token id:Id.Lit_Chars val:'\tgit diff -M --stat HEAD^ HEAD >output &&\n' span_id:390) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep " {c/d => d}/e " output\n'
            span_id: 391
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rename pretty print with common prefix and suffix'
            span_id: 398
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:402) 
          (Token id:Id.Lit_Chars val:'\tmkdir d/f &&\n' span_id:403) (Token id:Id.Lit_Chars val:'\tgit mv d/e d/f/e &&\n' span_id:404) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "d/e -> d/f/e" &&\n' span_id:405) (Token id:Id.Lit_Chars val:'\tgit diff -M --summary HEAD^ HEAD >output &&\n' span_id:406) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep " d/{ => f}/e " output &&\n'
            span_id: 407
          ) (Token id:Id.Lit_Chars val:'\tgit diff -M --stat HEAD^ HEAD >output &&\n' span_id:408) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep " d/{ => f}/e " output\n'
            span_id: 409
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rename pretty print common prefix and suffix overlap'
            span_id: 416
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:420) 
          (Token id:Id.Lit_Chars val:'\tmkdir d/f/f &&\n' span_id:421) (Token id:Id.Lit_Chars val:'\tgit mv d/f/e d/f/f/e &&\n' span_id:422) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "d/f/e d/f/f/e" &&\n' span_id:423) (Token id:Id.Lit_Chars val:'\tgit diff -M --summary HEAD^ HEAD >output &&\n' span_id:424) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep " d/f/{ => f}/e " output &&\n'
            span_id: 425
          ) (Token id:Id.Lit_Chars val:'\tgit diff -M --stat HEAD^ HEAD >output &&\n' span_id:426) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep " d/f/{ => f}/e " output\n'
            span_id: 427
          )
        )
      }
    )
    (C {(test_done)})
  ]
)