(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: 'ls-files --exclude does not affect index files'
                  span_id: 6
                )
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'create repo with file' span_id:17))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:21) 
          (Token id:Id.Lit_Chars val:'\techo content >file &&\n' span_id:22) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:23) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m file &&\n' span_id:24) (Token id:Id.Lit_Chars val:'\techo modification >file\n' span_id:25)
        )
      }
    )
    (command.ShFunction
      name: check_output
      body: 
        (command.BraceGroup
          children: [
            (C {(test_expect_success)} 
              {(DQ ('ls-files output contains file (') ($ Id.VSub_Number '$1') (')'))} 
              {
                (DQ ('\n') ("\techo '") ($ Id.VSub_Number '$2') ("' >expect &&\n") 
                  ('\tgit ls-files --exclude-standard --') ($ Id.VSub_Number '$1') (' >output &&\n') ('\ttest_cmp expect output\n')
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: check_all_output
      body: 
        (command.BraceGroup
          children: [
            (C {(check_output)} {(SQ (Token id:Id.Lit_Chars val:cached span_id:67))} 
              {(SQ (Token id:Id.Lit_Chars val:file span_id:71))}
            )
            (C {(check_output)} {(SQ (Token id:Id.Lit_Chars val:modified span_id:78))} 
              {(SQ (Token id:Id.Lit_Chars val:file span_id:82))}
            )
          ]
        )
    )
    (C {(check_all_output)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'add file to gitignore' span_id:93))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:97) 
          (Token id:Id.Lit_Chars val:'\techo file >.gitignore\n' span_id:98)
        )
      }
    )
    (C {(check_all_output)})
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'ls-files -i lists only tracked-but-ignored files'
            span_id: 107
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:111) 
          (Token id:Id.Lit_Chars val:'\techo content >other-file &&\n' span_id:112) (Token id:Id.Lit_Chars val:'\tgit add other-file &&\n' span_id:113) 
          (Token id:Id.Lit_Chars val:'\techo file >expect &&\n' span_id:114) (Token id:Id.Lit_Chars val:'\tgit ls-files -i --exclude-standard >output &&\n' span_id:115) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect output\n' span_id:116)
        )
      }
    )
    (C {(test_done)})
  ]
)