(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: 'basic tests for the SHA1 array implementation'
                  span_id: 6
                )
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: echo20
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:prefix)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ 
                        (braced_var_sub
                          token: (Token id:Id.VSub_Number val:1 span_id:25)
                          suffix_op: 
                            (suffix_op.Unary
                              op_id: Id.VTest_ColonPlus
                              arg_word: {($ Id.VSub_Number '$1') (' ')}
                            )
                        )
                      )
                    }
                  spids: [22]
                )
              ]
            )
            (C {(shift)})
            (command.WhileUntil
              keyword: (Token id:Id.KW_While val:while span_id:36)
              cond: [(C {(test)} {($ Id.VSub_Pound '$#')} {(-gt)} {(0)})]
              body: 
                (command.DoGroup
                  children: [
                    (C {(echo)} 
                      {
                        (DQ ($ Id.VSub_DollarName '$prefix') ($ Id.VSub_Number '$1') 
                          ($ Id.VSub_Number '$1') ($ Id.VSub_Number '$1') ($ Id.VSub_Number '$1') ($ Id.VSub_Number '$1') ($ Id.VSub_Number '$1') 
                          ($ Id.VSub_Number '$1') ($ Id.VSub_Number '$1') ($ Id.VSub_Number '$1') ($ Id.VSub_Number '$1') ($ Id.VSub_Number '$1') 
                          ($ Id.VSub_Number '$1') ($ Id.VSub_Number '$1') ($ Id.VSub_Number '$1') ($ Id.VSub_Number '$1') ($ Id.VSub_Number '$1') 
                          ($ Id.VSub_Number '$1') ($ Id.VSub_Number '$1') ($ Id.VSub_Number '$1') ($ Id.VSub_Number '$1')
                        )
                      }
                    )
                    (C {(shift)})
                  ]
                )
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'ordered enumeration' span_id:88))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:92) 
          (Token id:Id.Lit_Chars val:'\techo20 "" 44 55 88 aa >expect &&\n' span_id:93) (Token id:Id.Lit_Chars val:'\t{\n' span_id:94) 
          (Token id:Id.Lit_Chars val:'\t\techo20 append 88 44 aa 55 &&\n' span_id:95) (Token id:Id.Lit_Chars val:'\t\techo for_each_unique\n' span_id:96) 
          (Token id:Id.Lit_Chars val:'\t} | test-sha1-array >actual &&\n' span_id:97) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:98)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'ordered enumeration with duplicate suppression' span_id:105))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:109) 
          (Token id:Id.Lit_Chars val:'\techo20 "" 44 55 88 aa >expect &&\n' span_id:110) (Token id:Id.Lit_Chars val:'\t{\n' span_id:111) 
          (Token id:Id.Lit_Chars val:'\t\techo20 append 88 44 aa 55 &&\n' span_id:112) (Token id:Id.Lit_Chars val:'\t\techo20 append 88 44 aa 55 &&\n' span_id:113) 
          (Token id:Id.Lit_Chars val:'\t\techo for_each_unique\n' span_id:114) (Token id:Id.Lit_Chars val:'\t} | test-sha1-array >actual &&\n' span_id:115) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:116)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:lookup span_id:123))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:127) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:128) (Token id:Id.Lit_Chars val:'\t\techo20 append 88 44 aa 55 &&\n' span_id:129) 
          (Token id:Id.Lit_Chars val:'\t\techo20 lookup 55\n' span_id:130) (Token id:Id.Lit_Chars val:'\t} | test-sha1-array >actual &&\n' span_id:131) 
          (Token id:Id.Lit_Chars val:'\tn=$(cat actual) &&\n' span_id:132) (Token id:Id.Lit_Chars val:'\ttest "$n" -eq 1\n' span_id:133)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'lookup non-existing entry' span_id:140))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:144) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:145) (Token id:Id.Lit_Chars val:'\t\techo20 append 88 44 aa 55 &&\n' span_id:146) 
          (Token id:Id.Lit_Chars val:'\t\techo20 lookup 33\n' span_id:147) (Token id:Id.Lit_Chars val:'\t} | test-sha1-array >actual &&\n' span_id:148) 
          (Token id:Id.Lit_Chars val:'\tn=$(cat actual) &&\n' span_id:149) (Token id:Id.Lit_Chars val:'\ttest "$n" -lt 0\n' span_id:150)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'lookup with duplicates' span_id:157))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:161) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:162) (Token id:Id.Lit_Chars val:'\t\techo20 append 88 44 aa 55 &&\n' span_id:163) 
          (Token id:Id.Lit_Chars val:'\t\techo20 append 88 44 aa 55 &&\n' span_id:164) (Token id:Id.Lit_Chars val:'\t\techo20 lookup 55\n' span_id:165) 
          (Token id:Id.Lit_Chars val:'\t} | test-sha1-array >actual &&\n' span_id:166) (Token id:Id.Lit_Chars val:'\tn=$(cat actual) &&\n' span_id:167) 
          (Token id:Id.Lit_Chars val:'\ttest "$n" -ge 2 &&\n' span_id:168) (Token id:Id.Lit_Chars val:'\ttest "$n" -le 3\n' span_id:169)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'lookup non-existing entry with duplicates' span_id:176))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:180) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:181) (Token id:Id.Lit_Chars val:'\t\techo20 append 88 44 aa 55 &&\n' span_id:182) 
          (Token id:Id.Lit_Chars val:'\t\techo20 append 88 44 aa 55 &&\n' span_id:183) (Token id:Id.Lit_Chars val:'\t\techo20 lookup 66\n' span_id:184) 
          (Token id:Id.Lit_Chars val:'\t} | test-sha1-array >actual &&\n' span_id:185) (Token id:Id.Lit_Chars val:'\tn=$(cat actual) &&\n' span_id:186) 
          (Token id:Id.Lit_Chars val:'\ttest "$n" -lt 0\n' span_id:187)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'lookup with almost duplicate values' span_id:194))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:198) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:199) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "append 5555555555555555555555555555555555555555" &&\n'
            span_id: 200
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "append 555555555555555555555555555555555555555f" &&\n'
            span_id: 201
          ) (Token id:Id.Lit_Chars val:'\t\techo20 lookup 55\n' span_id:202) 
          (Token id:Id.Lit_Chars val:'\t} | test-sha1-array >actual &&\n' span_id:203) (Token id:Id.Lit_Chars val:'\tn=$(cat actual) &&\n' span_id:204) 
          (Token id:Id.Lit_Chars val:'\ttest "$n" -eq 0\n' span_id:205)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'lookup with single duplicate value' span_id:212))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:216) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:217) (Token id:Id.Lit_Chars val:'\t\techo20 append 55 55 &&\n' span_id:218) 
          (Token id:Id.Lit_Chars val:'\t\techo20 lookup 55\n' span_id:219) (Token id:Id.Lit_Chars val:'\t} | test-sha1-array >actual &&\n' span_id:220) 
          (Token id:Id.Lit_Chars val:'\tn=$(cat actual) &&\n' span_id:221) (Token id:Id.Lit_Chars val:'\ttest "$n" -ge 0 &&\n' span_id:222) 
          (Token id:Id.Lit_Chars val:'\ttest "$n" -le 1\n' span_id:223)
        )
      }
    )
    (C {(test_done)})
  ]
)