(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:'test hashmap and string hash functions' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: test_hashmap
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Pipeline
                  children: [
                    (C {(echo)} {(DQ ($ Id.VSub_Number '$1'))})
                    (command.Simple
                      words: [{(test-hashmap)} {($ Id.VSub_Number '$3')}]
                      redirects: [
                        (redir.Redir
                          op: (Token id:Id.Redir_Great val:'>' span_id:33)
                          fd: -1
                          arg_word: {(actual)}
                        )
                      ]
                    )
                  ]
                  negated: F
                )
                (command.Simple
                  words: [{(echo)} {(DQ ($ Id.VSub_Number '$2'))}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:46)
                      fd: -1
                      arg_word: {(expect)}
                    )
                  ]
                )
                (C {(test_cmp)} {(expect)} {(actual)})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'hash functions' span_id:65))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:69) (Token id:Id.Lit_Chars val:'\n' span_id:70) 
          (Token
            id: Id.Lit_Chars
            val: 'test_hashmap "hash key1" "2215982743 2215982743 116372151 116372151" &&\n'
            span_id: 71
          ) 
          (Token
            id: Id.Lit_Chars
            val: 'test_hashmap "hash key2" "2215982740 2215982740 116372148 116372148" &&\n'
            span_id: 72
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'test_hashmap "hash fooBarFrotz" "1383912807 1383912807 3189766727 3189766727" &&\n'
            span_id: 73
          ) 
          (Token
            id: Id.Lit_Chars
            val: 'test_hashmap "hash foobarfrotz" "2862305959 2862305959 3189766727 3189766727"\n'
            span_id: 74
          ) (Token id:Id.Lit_Chars val:'\n' span_id:75)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:put span_id:82))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:86) (Token id:Id.Lit_Chars val:'\n' span_id:87) 
          (Token id:Id.Lit_Chars val:'test_hashmap "put key1 value1\n' span_id:88) (Token id:Id.Lit_Chars val:'put key2 value2\n' span_id:89) 
          (Token id:Id.Lit_Chars val:'put fooBarFrotz value3\n' span_id:90) (Token id:Id.Lit_Chars val:'put foobarfrotz value4\n' span_id:91) 
          (Token id:Id.Lit_Chars val:'size" "NULL\n' span_id:92) (Token id:Id.Lit_Chars val:'NULL\n' span_id:93) (Token id:Id.Lit_Chars val:'NULL\n' span_id:94) 
          (Token id:Id.Lit_Chars val:'NULL\n' span_id:95) (Token id:Id.Lit_Chars val:'64 4"\n' span_id:96) (Token id:Id.Lit_Chars val:'\n' span_id:97)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'put (case insensitive)' span_id:104))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:108) (Token id:Id.Lit_Chars val:'\n' span_id:109) 
          (Token id:Id.Lit_Chars val:'test_hashmap "put key1 value1\n' span_id:110) (Token id:Id.Lit_Chars val:'put key2 value2\n' span_id:111) 
          (Token id:Id.Lit_Chars val:'put fooBarFrotz value3\n' span_id:112) (Token id:Id.Lit_Chars val:'size" "NULL\n' span_id:113) 
          (Token id:Id.Lit_Chars val:'NULL\n' span_id:114) (Token id:Id.Lit_Chars val:'NULL\n' span_id:115) 
          (Token id:Id.Lit_Chars val:'64 3" ignorecase\n' span_id:116) (Token id:Id.Lit_Chars val:'\n' span_id:117)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:replace span_id:124))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:128) (Token id:Id.Lit_Chars val:'\n' span_id:129) 
          (Token id:Id.Lit_Chars val:'test_hashmap "put key1 value1\n' span_id:130) (Token id:Id.Lit_Chars val:'put key1 value2\n' span_id:131) 
          (Token id:Id.Lit_Chars val:'put fooBarFrotz value3\n' span_id:132) (Token id:Id.Lit_Chars val:'put fooBarFrotz value4\n' span_id:133) 
          (Token id:Id.Lit_Chars val:'size" "NULL\n' span_id:134) (Token id:Id.Lit_Chars val:'value1\n' span_id:135) (Token id:Id.Lit_Chars val:'NULL\n' span_id:136) 
          (Token id:Id.Lit_Chars val:'value3\n' span_id:137) (Token id:Id.Lit_Chars val:'64 2"\n' span_id:138) (Token id:Id.Lit_Chars val:'\n' span_id:139)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'replace (case insensitive)' 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:'test_hashmap "put key1 value1\n' span_id:152) (Token id:Id.Lit_Chars val:'put Key1 value2\n' span_id:153) 
          (Token id:Id.Lit_Chars val:'put fooBarFrotz value3\n' span_id:154) (Token id:Id.Lit_Chars val:'put foobarfrotz value4\n' span_id:155) 
          (Token id:Id.Lit_Chars val:'size" "NULL\n' span_id:156) (Token id:Id.Lit_Chars val:'value1\n' span_id:157) (Token id:Id.Lit_Chars val:'NULL\n' span_id:158) 
          (Token id:Id.Lit_Chars val:'value3\n' span_id:159) (Token id:Id.Lit_Chars val:'64 2" ignorecase\n' span_id:160) 
          (Token id:Id.Lit_Chars val:'\n' span_id:161)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:get span_id:168))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:172) (Token id:Id.Lit_Chars val:'\n' span_id:173) 
          (Token id:Id.Lit_Chars val:'test_hashmap "put key1 value1\n' span_id:174) (Token id:Id.Lit_Chars val:'put key2 value2\n' span_id:175) 
          (Token id:Id.Lit_Chars val:'put fooBarFrotz value3\n' span_id:176) (Token id:Id.Lit_Chars val:'put foobarfrotz value4\n' span_id:177) 
          (Token id:Id.Lit_Chars val:'get key1\n' span_id:178) (Token id:Id.Lit_Chars val:'get key2\n' span_id:179) 
          (Token id:Id.Lit_Chars val:'get fooBarFrotz\n' span_id:180) (Token id:Id.Lit_Chars val:'get notInMap" "NULL\n' span_id:181) 
          (Token id:Id.Lit_Chars val:'NULL\n' span_id:182) (Token id:Id.Lit_Chars val:'NULL\n' span_id:183) (Token id:Id.Lit_Chars val:'NULL\n' span_id:184) 
          (Token id:Id.Lit_Chars val:'value1\n' span_id:185) (Token id:Id.Lit_Chars val:'value2\n' span_id:186) (Token id:Id.Lit_Chars val:'value3\n' span_id:187) 
          (Token id:Id.Lit_Chars val:'NULL"\n' span_id:188) (Token id:Id.Lit_Chars val:'\n' span_id:189)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'get (case insensitive)' span_id:196))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:200) (Token id:Id.Lit_Chars val:'\n' span_id:201) 
          (Token id:Id.Lit_Chars val:'test_hashmap "put key1 value1\n' span_id:202) (Token id:Id.Lit_Chars val:'put key2 value2\n' span_id:203) 
          (Token id:Id.Lit_Chars val:'put fooBarFrotz value3\n' span_id:204) (Token id:Id.Lit_Chars val:'get Key1\n' span_id:205) 
          (Token id:Id.Lit_Chars val:'get keY2\n' span_id:206) (Token id:Id.Lit_Chars val:'get foobarfrotz\n' span_id:207) 
          (Token id:Id.Lit_Chars val:'get notInMap" "NULL\n' span_id:208) (Token id:Id.Lit_Chars val:'NULL\n' span_id:209) (Token id:Id.Lit_Chars val:'NULL\n' span_id:210) 
          (Token id:Id.Lit_Chars val:'value1\n' span_id:211) (Token id:Id.Lit_Chars val:'value2\n' span_id:212) (Token id:Id.Lit_Chars val:'value3\n' span_id:213) 
          (Token id:Id.Lit_Chars val:'NULL" ignorecase\n' span_id:214) (Token id:Id.Lit_Chars val:'\n' span_id:215)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:add span_id:222))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:226) (Token id:Id.Lit_Chars val:'\n' span_id:227) 
          (Token id:Id.Lit_Chars val:'test_hashmap "add key1 value1\n' span_id:228) (Token id:Id.Lit_Chars val:'add key1 value2\n' span_id:229) 
          (Token id:Id.Lit_Chars val:'add fooBarFrotz value3\n' span_id:230) (Token id:Id.Lit_Chars val:'add fooBarFrotz value4\n' span_id:231) 
          (Token id:Id.Lit_Chars val:'get key1\n' span_id:232) (Token id:Id.Lit_Chars val:'get fooBarFrotz\n' span_id:233) 
          (Token id:Id.Lit_Chars val:'get notInMap" "value2\n' span_id:234) (Token id:Id.Lit_Chars val:'value1\n' span_id:235) (Token id:Id.Lit_Chars val:'value4\n' span_id:236) 
          (Token id:Id.Lit_Chars val:'value3\n' span_id:237) (Token id:Id.Lit_Chars val:'NULL"\n' span_id:238) (Token id:Id.Lit_Chars val:'\n' span_id:239)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'add (case insensitive)' span_id:246))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:250) (Token id:Id.Lit_Chars val:'\n' span_id:251) 
          (Token id:Id.Lit_Chars val:'test_hashmap "add key1 value1\n' span_id:252) (Token id:Id.Lit_Chars val:'add Key1 value2\n' span_id:253) 
          (Token id:Id.Lit_Chars val:'add fooBarFrotz value3\n' span_id:254) (Token id:Id.Lit_Chars val:'add foobarfrotz value4\n' span_id:255) 
          (Token id:Id.Lit_Chars val:'get key1\n' span_id:256) (Token id:Id.Lit_Chars val:'get Foobarfrotz\n' span_id:257) 
          (Token id:Id.Lit_Chars val:'get notInMap" "value2\n' span_id:258) (Token id:Id.Lit_Chars val:'value1\n' span_id:259) (Token id:Id.Lit_Chars val:'value4\n' span_id:260) 
          (Token id:Id.Lit_Chars val:'value3\n' span_id:261) (Token id:Id.Lit_Chars val:'NULL" ignorecase\n' span_id:262) 
          (Token id:Id.Lit_Chars val:'\n' span_id:263)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:remove span_id:270))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:274) (Token id:Id.Lit_Chars val:'\n' span_id:275) 
          (Token id:Id.Lit_Chars val:'test_hashmap "put key1 value1\n' span_id:276) (Token id:Id.Lit_Chars val:'put key2 value2\n' span_id:277) 
          (Token id:Id.Lit_Chars val:'put fooBarFrotz value3\n' span_id:278) (Token id:Id.Lit_Chars val:'remove key1\n' span_id:279) 
          (Token id:Id.Lit_Chars val:'remove key2\n' span_id:280) (Token id:Id.Lit_Chars val:'remove notInMap\n' span_id:281) 
          (Token id:Id.Lit_Chars val:'size" "NULL\n' span_id:282) (Token id:Id.Lit_Chars val:'NULL\n' span_id:283) (Token id:Id.Lit_Chars val:'NULL\n' span_id:284) 
          (Token id:Id.Lit_Chars val:'value1\n' span_id:285) (Token id:Id.Lit_Chars val:'value2\n' span_id:286) (Token id:Id.Lit_Chars val:'NULL\n' span_id:287) 
          (Token id:Id.Lit_Chars val:'64 1"\n' span_id:288) (Token id:Id.Lit_Chars val:'\n' span_id:289)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'remove (case insensitive)' span_id:296))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:300) (Token id:Id.Lit_Chars val:'\n' span_id:301) 
          (Token id:Id.Lit_Chars val:'test_hashmap "put key1 value1\n' span_id:302) (Token id:Id.Lit_Chars val:'put key2 value2\n' span_id:303) 
          (Token id:Id.Lit_Chars val:'put fooBarFrotz value3\n' span_id:304) (Token id:Id.Lit_Chars val:'remove Key1\n' span_id:305) 
          (Token id:Id.Lit_Chars val:'remove keY2\n' span_id:306) (Token id:Id.Lit_Chars val:'remove notInMap\n' span_id:307) 
          (Token id:Id.Lit_Chars val:'size" "NULL\n' span_id:308) (Token id:Id.Lit_Chars val:'NULL\n' span_id:309) (Token id:Id.Lit_Chars val:'NULL\n' span_id:310) 
          (Token id:Id.Lit_Chars val:'value1\n' span_id:311) (Token id:Id.Lit_Chars val:'value2\n' span_id:312) (Token id:Id.Lit_Chars val:'NULL\n' span_id:313) 
          (Token id:Id.Lit_Chars val:'64 1" ignorecase\n' span_id:314) (Token id:Id.Lit_Chars val:'\n' span_id:315)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:iterate span_id:322))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:326) (Token id:Id.Lit_Chars val:'\n' span_id:327) 
          (Token id:Id.Lit_Chars val:'test_hashmap "put key1 value1\n' span_id:328) (Token id:Id.Lit_Chars val:'put key2 value2\n' span_id:329) 
          (Token id:Id.Lit_Chars val:'put fooBarFrotz value3\n' span_id:330) (Token id:Id.Lit_Chars val:'iterate" "NULL\n' span_id:331) 
          (Token id:Id.Lit_Chars val:'NULL\n' span_id:332) (Token id:Id.Lit_Chars val:'NULL\n' span_id:333) 
          (Token id:Id.Lit_Chars val:'key2 value2\n' span_id:334) (Token id:Id.Lit_Chars val:'key1 value1\n' span_id:335) 
          (Token id:Id.Lit_Chars val:'fooBarFrotz value3"\n' span_id:336) (Token id:Id.Lit_Chars val:'\n' span_id:337)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'iterate (case insensitive)' span_id:344))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:348) (Token id:Id.Lit_Chars val:'\n' span_id:349) 
          (Token id:Id.Lit_Chars val:'test_hashmap "put key1 value1\n' span_id:350) (Token id:Id.Lit_Chars val:'put key2 value2\n' span_id:351) 
          (Token id:Id.Lit_Chars val:'put fooBarFrotz value3\n' span_id:352) (Token id:Id.Lit_Chars val:'iterate" "NULL\n' span_id:353) 
          (Token id:Id.Lit_Chars val:'NULL\n' span_id:354) (Token id:Id.Lit_Chars val:'NULL\n' span_id:355) 
          (Token id:Id.Lit_Chars val:'fooBarFrotz value3\n' span_id:356) (Token id:Id.Lit_Chars val:'key2 value2\n' span_id:357) 
          (Token id:Id.Lit_Chars val:'key1 value1" ignorecase\n' span_id:358) (Token id:Id.Lit_Chars val:'\n' span_id:359)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'grow / shrink' span_id:366))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:370) (Token id:Id.Lit_Chars val:'\n' span_id:371) 
          (Token id:Id.Lit_Chars val:'\trm -f in &&\n' span_id:372) (Token id:Id.Lit_Chars val:'\trm -f expect &&\n' span_id:373) 
          (Token id:Id.Lit_Chars val:'\tfor n in $(test_seq 51)\n' span_id:374) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:375) 
          (Token id:Id.Lit_Chars val:'\t\techo put key$n value$n >> in &&\n' span_id:376) (Token id:Id.Lit_Chars val:'\t\techo NULL >> expect\n' span_id:377) 
          (Token id:Id.Lit_Chars val:'\tdone &&\n' span_id:378) (Token id:Id.Lit_Chars val:'\techo size >> in &&\n' span_id:379) 
          (Token id:Id.Lit_Chars val:'\techo 64 51 >> expect &&\n' span_id:380) (Token id:Id.Lit_Chars val:'\techo put key52 value52 >> in &&\n' span_id:381) 
          (Token id:Id.Lit_Chars val:'\techo NULL >> expect &&\n' span_id:382) (Token id:Id.Lit_Chars val:'\techo size >> in &&\n' span_id:383) 
          (Token id:Id.Lit_Chars val:'\techo 256 52 >> expect &&\n' span_id:384) (Token id:Id.Lit_Chars val:'\tfor n in $(test_seq 12)\n' span_id:385) 
          (Token id:Id.Lit_Chars val:'\tdo\n' span_id:386) (Token id:Id.Lit_Chars val:'\t\techo remove key$n >> in &&\n' span_id:387) 
          (Token id:Id.Lit_Chars val:'\t\techo value$n >> expect\n' span_id:388) (Token id:Id.Lit_Chars val:'\tdone &&\n' span_id:389) 
          (Token id:Id.Lit_Chars val:'\techo size >> in &&\n' span_id:390) (Token id:Id.Lit_Chars val:'\techo 256 40 >> expect &&\n' span_id:391) 
          (Token id:Id.Lit_Chars val:'\techo remove key40 >> in &&\n' span_id:392) (Token id:Id.Lit_Chars val:'\techo value40 >> expect &&\n' span_id:393) 
          (Token id:Id.Lit_Chars val:'\techo size >> in &&\n' span_id:394) (Token id:Id.Lit_Chars val:'\techo 64 39 >> expect &&\n' span_id:395) 
          (Token id:Id.Lit_Chars val:'\tcat in | test-hashmap > out &&\n' span_id:396) (Token id:Id.Lit_Chars val:'\ttest_cmp expect out\n' span_id:397) 
          (Token id:Id.Lit_Chars val:'\n' span_id:398)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'string interning' span_id:405))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:409) (Token id:Id.Lit_Chars val:'\n' span_id:410) 
          (Token id:Id.Lit_Chars val:'test_hashmap "intern value1\n' span_id:411) (Token id:Id.Lit_Chars val:'intern Value1\n' span_id:412) 
          (Token id:Id.Lit_Chars val:'intern value2\n' span_id:413) (Token id:Id.Lit_Chars val:'intern value2\n' span_id:414) 
          (Token id:Id.Lit_Chars val:'" "value1\n' span_id:415) (Token id:Id.Lit_Chars val:'Value1\n' span_id:416) (Token id:Id.Lit_Chars val:'value2\n' span_id:417) 
          (Token id:Id.Lit_Chars val:'value2"\n' span_id:418) (Token id:Id.Lit_Chars val:'\n' span_id:419)
        )
      }
    )
    (C {(test_done)})
  ]
)