(command.CommandList
  children: [
    (command.ShFunction
      name: test_diff_frobnitz
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<file1>})
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.MultiLine
                      here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <OF>}
                      here_end_span_id: 49
                      stdin_parts: [
                        <'#include <stdio.h>\n'>
                        <'\n'>
                        <'// Frobs foo heartily\n'>
                        <'int frobnitz(int foo)\n'>
                        <'{\n'>
                        <'    int i;\n'>
                        <'    for(i = 0; i < 10; i++)\n'>
                        <'    {\n'>
                        <'        printf("Your answer is: ");\n'>
                        <'        printf("%d\\n", foo);\n'>
                        <'    }\n'>
                        <'}\n'>
                        <'\n'>
                        <'int fact(int n)\n'>
                        <'{\n'>
                        <'    if(n > 1)\n'>
                        <'    {\n'>
                        <'        return fact(n-1) * n;\n'>
                        <'    }\n'>
                        <'    return 1;\n'>
                        <'}\n'>
                        <'\n'>
                        <'int main(int argc, char **argv)\n'>
                        <'{\n'>
                        <'    frobnitz(fact(10));\n'>
                        <'}\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<file2>})
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.MultiLine
                      here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <OF>}
                      here_end_span_id: 86
                      stdin_parts: [
                        <'#include <stdio.h>\n'>
                        <'\n'>
                        <'int fib(int n)\n'>
                        <'{\n'>
                        <'    if(n > 2)\n'>
                        <'    {\n'>
                        <'        return fib(n-1) + fib(n-2);\n'>
                        <'    }\n'>
                        <'    return 1;\n'>
                        <'}\n'>
                        <'\n'>
                        <'// Frobs foo heartily\n'>
                        <'int frobnitz(int foo)\n'>
                        <'{\n'>
                        <'    int i;\n'>
                        <'    for(i = 0; i < 10; i++)\n'>
                        <'    {\n'>
                        <'        printf("%d\\n", foo);\n'>
                        <'    }\n'>
                        <'}\n'>
                        <'\n'>
                        <'int main(int argc, char **argv)\n'>
                        <'{\n'>
                        <'    frobnitz(fib(10));\n'>
                        <'}\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expect>})
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.MultiLine
                      here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <OF>}
                      here_end_span_id: 139
                      stdin_parts: [
                        <'diff --git a/file1 b/file2\n'>
                        <'index 6faa5a3..e3af329 100644\n'>
                        <'--- a/file1\n'>
                        <'+++ b/file2\n'>
                        <'@@ -1,26 +1,25 @@\n'>
                        <' #include <stdio.h>\n'>
                        <' \n'>
                        <'+int fib(int n)\n'>
                        <'+{\n'>
                        <'+    if(n > 2)\n'>
                        <'+    {\n'>
                        <'+        return fib(n-1) + fib(n-2);\n'>
                        <'+    }\n'>
                        <'+    return 1;\n'>
                        <'+}\n'>
                        <'+\n'>
                        <' // Frobs foo heartily\n'>
                        <' int frobnitz(int foo)\n'>
                        <' {\n'>
                        <'     int i;\n'>
                        <'     for(i = 0; i < 10; i++)\n'>
                        <'     {\n'>
                        <'-        printf("Your answer is: ");\n'>
                        <'         printf("%d\\n", foo);\n'>
                        <'     }\n'>
                        <' }\n'>
                        <' \n'>
                        <'-int fact(int n)\n'>
                        <'-{\n'>
                        <'-    if(n > 1)\n'>
                        <'-    {\n'>
                        <'-        return fact(n-1) * n;\n'>
                        <'-    }\n'>
                        <'-    return 1;\n'>
                        <'-}\n'>
                        <'-\n'>
                        <' int main(int argc, char **argv)\n'>
                        <' {\n'>
                        <'-    frobnitz(fact(10));\n'>
                        <'+    frobnitz(fib(10));\n'>
                        <' }\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:STRATEGY)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [142]
                )
              ]
            )
            (C {<test_expect_success>} {(DQ ($ Id.VSub_DollarName '$STRATEGY') <' diff'>)} 
              {
                (SQ <'\n'> 
                  <'\t\ttest_must_fail git diff --no-index "--$STRATEGY" file1 file2 > output &&\n'> <'\t\ttest_cmp expect output\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} 
              {(DQ ($ Id.VSub_DollarName '$STRATEGY') <' diff output is valid'>)} 
              {
                (SQ <'\n'> <'\t\tmv file2 expect &&\n'> <'\t\tgit apply < output &&\n'> 
                  <'\t\ttest_cmp expect file2\n'> <'\t'>
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: test_diff_unique
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<uniq1>})
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.MultiLine
                      here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <OF>}
                      here_end_span_id: 203
                      stdin_parts: [<'1\n'> <'2\n'> <'3\n'> <'4\n'> <'5\n'> <'6\n'>]
                    )
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<uniq2>})
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.MultiLine
                      here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <OF>}
                      here_end_span_id: 221
                      stdin_parts: [<'a\n'> <'b\n'> <'c\n'> <'d\n'> <'e\n'> <'f\n'>]
                    )
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expect>})
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.MultiLine
                      here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <OF>}
                      here_end_span_id: 250
                      stdin_parts: [
                        <'diff --git a/uniq1 b/uniq2\n'>
                        <'index b414108..0fdf397 100644\n'>
                        <'--- a/uniq1\n'>
                        <'+++ b/uniq2\n'>
                        <'@@ -1,6 +1,6 @@\n'>
                        <'-1\n'>
                        <'-2\n'>
                        <'-3\n'>
                        <'-4\n'>
                        <'-5\n'>
                        <'-6\n'>
                        <'+a\n'>
                        <'+b\n'>
                        <'+c\n'>
                        <'+d\n'>
                        <'+e\n'>
                        <'+f\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:STRATEGY)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [253]
                )
              ]
            )
            (C {<test_expect_success>} {(SQ <'completely different files'>)} 
              {
                (SQ <'\n'> 
                  <'\t\ttest_must_fail git diff --no-index "--$STRATEGY" uniq1 uniq2 > output &&\n'> <'\t\ttest_cmp expect output\n'> <'\t'>
                )
              }
            )
          ]
        )
    )
  ]
)