(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: 'ancestor culling and limiting by parent number'
                  span_id: 6
                )
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: check_revlist
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:rev_list_args)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_Number '$1'))}
                      spids: [23]
                    )
                  ]
                )
                (C {(shift)})
                (command.Simple
                  words: [{(git)} {(rev-parse)} {(DQ ($ Id.VSub_At '$@'))}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:44)
                      fd: -1
                      arg_word: {(expect)}
                    )
                  ]
                )
                (command.Simple
                  words: [{(git)} {(rev-list)} {($ Id.VSub_DollarName '$rev_list_args')} {(--all)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:58)
                      fd: -1
                      arg_word: {(actual)}
                    )
                  ]
                )
                (C {(test_cmp)} {(expect)} {(actual)})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:78) (Token id:Id.Lit_Chars val:'\n' span_id:79) 
          (Token id:Id.Lit_Chars val:'\ttouch file &&\n' span_id:80) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:81) 
          (Token id:Id.Lit_Chars val:'\n' span_id:82) (Token id:Id.Lit_Chars val:'\ttest_commit one &&\n' span_id:83) 
          (Token id:Id.Lit_Chars val:'\n' span_id:84) (Token id:Id.Lit_Chars val:'\ttest_tick=$(($test_tick - 2400)) &&\n' span_id:85) 
          (Token id:Id.Lit_Chars val:'\n' span_id:86) (Token id:Id.Lit_Chars val:'\ttest_commit two &&\n' span_id:87) 
          (Token id:Id.Lit_Chars val:'\ttest_commit three &&\n' span_id:88) (Token id:Id.Lit_Chars val:'\ttest_commit four &&\n' span_id:89) 
          (Token id:Id.Lit_Chars val:'\n' span_id:90) (Token id:Id.Lit_Chars val:'\tgit log --pretty=oneline --abbrev-commit\n' span_id:91)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'one is ancestor of others and should not be shown'
            span_id: 98
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:102) (Token id:Id.Lit_Chars val:'\n' span_id:103) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-list one --not four >result &&\n'
            span_id: 104
          ) (Token id:Id.Lit_Chars val:'\t>expect &&\n' span_id:105) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect result\n' span_id:106) (Token id:Id.Lit_Chars val:'\n' span_id:107)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup roots, merges and octopuses' span_id:114))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:118) (Token id:Id.Lit_Chars val:'\n' span_id:119) 
          (Token id:Id.Lit_Chars val:'\tgit checkout --orphan newroot &&\n' span_id:120) (Token id:Id.Lit_Chars val:'\ttest_commit five &&\n' span_id:121) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -b sidebranch two &&\n' span_id:122) (Token id:Id.Lit_Chars val:'\ttest_commit six &&\n' span_id:123) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit checkout -b anotherbranch three &&\n'
            span_id: 124
          ) (Token id:Id.Lit_Chars val:'\ttest_commit seven &&\n' span_id:125) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit checkout -b yetanotherbranch four &&\n'
            span_id: 126
          ) (Token id:Id.Lit_Chars val:'\ttest_commit eight &&\n' span_id:127) 
          (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:128) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:129) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit merge --allow-unrelated-histories -m normalmerge newroot &&\n'
            span_id: 130
          ) (Token id:Id.Lit_Chars val:'\tgit tag normalmerge &&\n' span_id:131) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:132) (Token id:Id.Lit_Chars val:'\tgit merge -m tripus sidebranch anotherbranch &&\n' span_id:133) 
          (Token id:Id.Lit_Chars val:'\tgit tag tripus &&\n' span_id:134) (Token id:Id.Lit_Chars val:'\tgit checkout -b tetrabranch normalmerge &&\n' span_id:135) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:136) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit merge -m tetrapus sidebranch anotherbranch yetanotherbranch &&\n'
            span_id: 137
          ) (Token id:Id.Lit_Chars val:'\tgit tag tetrapus &&\n' span_id:138) 
          (Token id:Id.Lit_Chars val:'\tgit checkout master\n' span_id:139)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list roots' span_id:146))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:150) (Token id:Id.Lit_Chars val:'\n' span_id:151) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck_revlist "--max-parents=0" one five\n'
            span_id: 152
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list no merges' span_id:159))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:163) (Token id:Id.Lit_Chars val:'\n' span_id:164) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck_revlist "--max-parents=1" one eight seven six five four three two &&\n'
            span_id: 165
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck_revlist "--no-merges" one eight seven six five four three two\n'
            span_id: 166
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list no octopuses' span_id:173))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:177) (Token id:Id.Lit_Chars val:'\n' span_id:178) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tcheck_revlist "--max-parents=2" one normalmerge eight seven six five four three two\n'
            span_id: 179
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list no roots' span_id:186))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:190) (Token id:Id.Lit_Chars val:'\n' span_id:191) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tcheck_revlist "--min-parents=1" tetrapus tripus normalmerge eight seven six four three two\n'
            span_id: 192
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list merges' span_id:199))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:203) (Token id:Id.Lit_Chars val:'\n' span_id:204) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck_revlist "--min-parents=2" tetrapus tripus normalmerge &&\n'
            span_id: 205
          ) (Token id:Id.Lit_Chars val:'\tcheck_revlist "--merges" tetrapus tripus normalmerge\n' span_id:206)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list octopus' span_id:213))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:217) (Token id:Id.Lit_Chars val:'\n' span_id:218) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck_revlist "--min-parents=3" tetrapus tripus\n'
            span_id: 219
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-list ordinary commits' span_id:226))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:230) (Token id:Id.Lit_Chars val:'\n' span_id:231) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tcheck_revlist "--min-parents=1 --max-parents=1" eight seven six four three two\n'
            span_id: 232
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-list --merges --no-merges yields empty set' span_id:239))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:243) (Token id:Id.Lit_Chars val:'\n' span_id:244) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck_revlist "--min-parents=2 --no-merges" &&\n'
            span_id: 245
          ) (Token id:Id.Lit_Chars val:'\tcheck_revlist "--merges --no-merges" &&\n' span_id:246) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck_revlist "--no-merges --merges"\n'
            span_id: 247
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-list override and infinities' span_id:254))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:258) (Token id:Id.Lit_Chars val:'\n' span_id:259) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tcheck_revlist "--min-parents=2 --max-parents=1 --max-parents=3" tripus normalmerge &&\n'
            span_id: 260
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tcheck_revlist "--min-parents=1 --min-parents=2 --max-parents=7" tetrapus tripus normalmerge &&\n'
            span_id: 261
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tcheck_revlist "--min-parents=2 --max-parents=8" tetrapus tripus normalmerge &&\n'
            span_id: 262
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tcheck_revlist "--min-parents=2 --max-parents=-1" tetrapus tripus normalmerge &&\n'
            span_id: 263
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tcheck_revlist "--min-parents=2 --no-max-parents" tetrapus tripus normalmerge &&\n'
            span_id: 264
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck_revlist "--max-parents=0 --min-parents=1 --no-min-parents" one five\n'
            span_id: 265
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:dodecapus span_id:272))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:276) (Token id:Id.Lit_Chars val:'\n' span_id:277) 
          (Token id:Id.Lit_Chars val:'\troots= &&\n' span_id:278) (Token id:Id.Lit_Chars val:'\tfor i in 1 2 3 4 5 6 7 8 9 10 11\n' span_id:279) 
          (Token id:Id.Lit_Chars val:'\tdo\n' span_id:280) (Token id:Id.Lit_Chars val:'\t\tgit checkout -b root$i five &&\n' span_id:281) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit $i &&\n' span_id:282) (Token id:Id.Lit_Chars val:'\t\troots="$roots root$i" ||\n' span_id:283) 
          (Token id:Id.Lit_Chars val:'\t\treturn\n' span_id:284) (Token id:Id.Lit_Chars val:'\tdone &&\n' span_id:285) 
          (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:286) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:287) 
          (Token id:Id.Lit_Chars val:'\tgit merge -m dodecapus $roots &&\n' span_id:288) (Token id:Id.Lit_Chars val:'\tgit tag dodecapus &&\n' span_id:289) 
          (Token id:Id.Lit_Chars val:'\n' span_id:290) (Token id:Id.Lit_Chars val:'\tcheck_revlist "--min-parents=4" dodecapus tetrapus &&\n' span_id:291) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck_revlist "--min-parents=8" dodecapus &&\n'
            span_id: 292
          ) (Token id:Id.Lit_Chars val:'\tcheck_revlist "--min-parents=12" dodecapus &&\n' span_id:293) 
          (Token id:Id.Lit_Chars val:'\tcheck_revlist "--min-parents=13" &&\n' span_id:294) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck_revlist "--min-parents=4 --max-parents=11" tetrapus\n'
            span_id: 295
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'ancestors with the same commit time' span_id:302))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:306) (Token id:Id.Lit_Chars val:'\n' span_id:307) 
          (Token id:Id.Lit_Chars val:'\ttest_tick_keep=$test_tick &&\n' span_id:308) (Token id:Id.Lit_Chars val:'\tfor i in 1 2 3 4 5 6 7 8; do\n' span_id:309) 
          (Token id:Id.Lit_Chars val:'\t\ttest_tick=$test_tick_keep\n' span_id:310) (Token id:Id.Lit_Chars val:'\t\ttest_commit t$i\n' span_id:311) 
          (Token id:Id.Lit_Chars val:'\tdone &&\n' span_id:312) (Token id:Id.Lit_Chars val:'\tgit rev-list t1^! --not t$i >result &&\n' span_id:313) 
          (Token id:Id.Lit_Chars val:'\t>expect &&\n' span_id:314) (Token id:Id.Lit_Chars val:'\ttest_cmp expect result\n' span_id:315)
        )
      }
    )
    (C {(test_done)})
  ]
)