(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 blame' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PROG)
          op: assign_op.Equal
          rhs: {(SQ (Token id:Id.Lit_Chars val:'git blame -c' span_id:16))}
          spids: [14]
        )
      ]
    )
    (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) (/annotate-tests.sh)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'blame untracked file in empty repo' span_id:30))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:34) 
          (Token id:Id.Lit_Chars val:'\t>untracked &&\n' span_id:35) (Token id:Id.Lit_Chars val:'\ttest_must_fail git blame untracked\n' span_id:36)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PROG)
          op: assign_op.Equal
          rhs: {(SQ (Token id:Id.Lit_Chars val:'git blame -c -e' span_id:42))}
          spids: [40]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'blame --show-email' span_id:48))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:52) 
          (Token id:Id.Lit_Chars val:'\tcheck_count \\\n' span_id:53) (Token id:Id.Lit_Chars val:'\t\t"<A@test.git>" 1 \\\n' span_id:54) 
          (Token id:Id.Lit_Chars val:'\t\t"<B@test.git>" 1 \\\n' span_id:55) (Token id:Id.Lit_Chars val:'\t\t"<B1@test.git>" 1 \\\n' span_id:56) 
          (Token id:Id.Lit_Chars val:'\t\t"<B2@test.git>" 1 \\\n' span_id:57) (Token id:Id.Lit_Chars val:'\t\t"<author@example.com>" 1 \\\n' span_id:58) 
          (Token id:Id.Lit_Chars val:'\t\t"<C@test.git>" 1 \\\n' span_id:59) (Token id:Id.Lit_Chars val:'\t\t"<D@test.git>" 1 \\\n' span_id:60) 
          (Token id:Id.Lit_Chars val:'\t\t"<E at test dot git>" 1\n' span_id:61)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup showEmail tests' span_id:68))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:72) 
          (Token id:Id.Lit_Chars val:'\techo "bin: test number 1" >one &&\n' span_id:73) (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:74) 
          (Token id:Id.Lit_Chars val:'\tGIT_AUTHOR_NAME=name1 \\\n' span_id:75) (Token id:Id.Lit_Chars val:'\tGIT_AUTHOR_EMAIL=email1@test.git \\\n' span_id:76) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -m First --date="2010-01-01 01:00:00" &&\n'
            span_id: 77
          ) (Token id:Id.Lit_Chars val:'\tcat >expected_n <<-\\EOF &&\n' span_id:78) 
          (Token
            id: Id.Lit_Chars
            val: '\t(name1 2010-01-01 01:00:00 +0000 1) bin: test number 1\n'
            span_id: 79
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:80) 
          (Token id:Id.Lit_Chars val:'\tcat >expected_e <<-\\EOF\n' span_id:81) 
          (Token
            id: Id.Lit_Chars
            val: '\t(<email1@test.git> 2010-01-01 01:00:00 +0000 1) bin: test number 1\n'
            span_id: 82
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:83)
        )
      }
    )
    (command.ShFunction
      name: find_blame
      body: 
        (command.BraceGroup
          children: [(C {(sed)} {(-e)} {(SQ (Token id:Id.Lit_Chars val:'s/^[^(]*//' span_id:100))})]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'blame with no options and no config' span_id:109))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:113) 
          (Token id:Id.Lit_Chars val:'\tgit blame one >blame &&\n' span_id:114) (Token id:Id.Lit_Chars val:'\tfind_blame <blame >result &&\n' span_id:115) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected_n result\n' span_id:116)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'blame with showemail options' span_id:123))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:127) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit blame --show-email one >blame1 &&\n'
            span_id: 128
          ) (Token id:Id.Lit_Chars val:'\tfind_blame <blame1 >result &&\n' span_id:129) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected_e result &&\n' span_id:130) (Token id:Id.Lit_Chars val:'\tgit blame -e one >blame2 &&\n' span_id:131) 
          (Token id:Id.Lit_Chars val:'\tfind_blame <blame2 >result &&\n' span_id:132) (Token id:Id.Lit_Chars val:'\ttest_cmp expected_e result &&\n' span_id:133) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit blame --no-show-email one >blame3 &&\n'
            span_id: 134
          ) (Token id:Id.Lit_Chars val:'\tfind_blame <blame3 >result &&\n' span_id:135) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected_n result\n' span_id:136)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'blame with showEmail config false' span_id:143))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:147) 
          (Token id:Id.Lit_Chars val:'\tgit config blame.showEmail false &&\n' span_id:148) (Token id:Id.Lit_Chars val:'\tgit blame one >blame1 &&\n' span_id:149) 
          (Token id:Id.Lit_Chars val:'\tfind_blame <blame1 >result &&\n' span_id:150) (Token id:Id.Lit_Chars val:'\ttest_cmp expected_n result &&\n' span_id:151) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit blame --show-email one >blame2 &&\n'
            span_id: 152
          ) (Token id:Id.Lit_Chars val:'\tfind_blame <blame2 >result &&\n' span_id:153) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected_e result &&\n' span_id:154) (Token id:Id.Lit_Chars val:'\tgit blame -e one >blame3 &&\n' span_id:155) 
          (Token id:Id.Lit_Chars val:'\tfind_blame <blame3 >result &&\n' span_id:156) (Token id:Id.Lit_Chars val:'\ttest_cmp expected_e result &&\n' span_id:157) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit blame --no-show-email one >blame4 &&\n'
            span_id: 158
          ) (Token id:Id.Lit_Chars val:'\tfind_blame <blame4 >result &&\n' span_id:159) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected_n result\n' span_id:160)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'blame with showEmail config true' span_id:167))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:171) 
          (Token id:Id.Lit_Chars val:'\tgit config blame.showEmail true &&\n' span_id:172) (Token id:Id.Lit_Chars val:'\tgit blame one >blame1 &&\n' span_id:173) 
          (Token id:Id.Lit_Chars val:'\tfind_blame <blame1 >result &&\n' span_id:174) (Token id:Id.Lit_Chars val:'\ttest_cmp expected_e result &&\n' span_id:175) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit blame --no-show-email one >blame2 &&\n'
            span_id: 176
          ) (Token id:Id.Lit_Chars val:'\tfind_blame <blame2 >result &&\n' span_id:177) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected_n result\n' span_id:178)
        )
      }
    )
    (C {(test_done)})
  ]
)