(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <'test hashmap and string hash functions'>)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (FuncDef
      name: test_hashmap
      body: 
        (BraceGroup
          children: [
            (AndOr
              ops: [Op_DAmp Op_DAmp]
              children: [
                (Pipeline
                  children: [
                    (C {(echo)} {(DQ ($ VSub_Number '$1'))})
                    (SimpleCommand
                      words: [{(test-hashmap)} {($ VSub_Number '$3')}]
                      redirects: [
                        (Redir
                          op_id: Redir_Great
                          fd: 16777215
                          arg_word: {(actual)}
                          spids: [33]
                        )
                      ]
                    )
                  ]
                  negated: F
                )
                (SimpleCommand
                  words: [{(echo)} {(DQ ($ VSub_Number '$2'))}]
                  redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(expect)} spids:[46])]
                )
                (C {(test_cmp)} {(expect)} {(actual)})
              ]
            )
          ]
          spids: [18]
        )
      spids: [14 17]
    )
    (C {(test_expect_success)} {(SQ <'hash functions'>)} 
      {
        (SQ <'\n'> <'\n'> <'test_hashmap "hash key1" "2215982743 2215982743 116372151 116372151" &&\n'> 
          <'test_hashmap "hash key2" "2215982740 2215982740 116372148 116372148" &&\n'> <'test_hashmap "hash fooBarFrotz" "1383912807 1383912807 3189766727 3189766727" &&\n'> 
          <'test_hashmap "hash foobarfrotz" "2862305959 2862305959 3189766727 3189766727"\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <put>)} 
      {
        (SQ <'\n'> <'\n'> <'test_hashmap "put key1 value1\n'> <'put key2 value2\n'> 
          <'put fooBarFrotz value3\n'> <'put foobarfrotz value4\n'> <'size" "NULL\n'> <'NULL\n'> <'NULL\n'> <'NULL\n'> <'64 4"\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'put (case insensitive)'>)} 
      {
        (SQ <'\n'> <'\n'> <'test_hashmap "put key1 value1\n'> <'put key2 value2\n'> 
          <'put fooBarFrotz value3\n'> <'size" "NULL\n'> <'NULL\n'> <'NULL\n'> <'64 3" ignorecase\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <replace>)} 
      {
        (SQ <'\n'> <'\n'> <'test_hashmap "put key1 value1\n'> <'put key1 value2\n'> 
          <'put fooBarFrotz value3\n'> <'put fooBarFrotz value4\n'> <'size" "NULL\n'> <'value1\n'> <'NULL\n'> <'value3\n'> <'64 2"\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'replace (case insensitive)'>)} 
      {
        (SQ <'\n'> <'\n'> <'test_hashmap "put key1 value1\n'> <'put Key1 value2\n'> 
          <'put fooBarFrotz value3\n'> <'put foobarfrotz value4\n'> <'size" "NULL\n'> <'value1\n'> <'NULL\n'> <'value3\n'> <'64 2" ignorecase\n'> 
          <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <get>)} 
      {
        (SQ <'\n'> <'\n'> <'test_hashmap "put key1 value1\n'> <'put key2 value2\n'> 
          <'put fooBarFrotz value3\n'> <'put foobarfrotz value4\n'> <'get key1\n'> <'get key2\n'> <'get fooBarFrotz\n'> 
          <'get notInMap" "NULL\n'> <'NULL\n'> <'NULL\n'> <'NULL\n'> <'value1\n'> <'value2\n'> <'value3\n'> <'NULL"\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'get (case insensitive)'>)} 
      {
        (SQ <'\n'> <'\n'> <'test_hashmap "put key1 value1\n'> <'put key2 value2\n'> 
          <'put fooBarFrotz value3\n'> <'get Key1\n'> <'get keY2\n'> <'get foobarfrotz\n'> <'get notInMap" "NULL\n'> <'NULL\n'> <'NULL\n'> 
          <'value1\n'> <'value2\n'> <'value3\n'> <'NULL" ignorecase\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <add>)} 
      {
        (SQ <'\n'> <'\n'> <'test_hashmap "add key1 value1\n'> <'add key1 value2\n'> 
          <'add fooBarFrotz value3\n'> <'add fooBarFrotz value4\n'> <'get key1\n'> <'get fooBarFrotz\n'> <'get notInMap" "value2\n'> 
          <'value1\n'> <'value4\n'> <'value3\n'> <'NULL"\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'add (case insensitive)'>)} 
      {
        (SQ <'\n'> <'\n'> <'test_hashmap "add key1 value1\n'> <'add Key1 value2\n'> 
          <'add fooBarFrotz value3\n'> <'add foobarfrotz value4\n'> <'get key1\n'> <'get Foobarfrotz\n'> <'get notInMap" "value2\n'> 
          <'value1\n'> <'value4\n'> <'value3\n'> <'NULL" ignorecase\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <remove>)} 
      {
        (SQ <'\n'> <'\n'> <'test_hashmap "put key1 value1\n'> <'put key2 value2\n'> 
          <'put fooBarFrotz value3\n'> <'remove key1\n'> <'remove key2\n'> <'remove notInMap\n'> <'size" "NULL\n'> <'NULL\n'> <'NULL\n'> 
          <'value1\n'> <'value2\n'> <'NULL\n'> <'64 1"\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'remove (case insensitive)'>)} 
      {
        (SQ <'\n'> <'\n'> <'test_hashmap "put key1 value1\n'> <'put key2 value2\n'> 
          <'put fooBarFrotz value3\n'> <'remove Key1\n'> <'remove keY2\n'> <'remove notInMap\n'> <'size" "NULL\n'> <'NULL\n'> <'NULL\n'> 
          <'value1\n'> <'value2\n'> <'NULL\n'> <'64 1" ignorecase\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <iterate>)} 
      {
        (SQ <'\n'> <'\n'> <'test_hashmap "put key1 value1\n'> <'put key2 value2\n'> 
          <'put fooBarFrotz value3\n'> <'iterate" "NULL\n'> <'NULL\n'> <'NULL\n'> <'key2 value2\n'> <'key1 value1\n'> <'fooBarFrotz value3"\n'> 
          <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'iterate (case insensitive)'>)} 
      {
        (SQ <'\n'> <'\n'> <'test_hashmap "put key1 value1\n'> <'put key2 value2\n'> 
          <'put fooBarFrotz value3\n'> <'iterate" "NULL\n'> <'NULL\n'> <'NULL\n'> <'fooBarFrotz value3\n'> <'key2 value2\n'> 
          <'key1 value1" ignorecase\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'grow / shrink'>)} 
      {
        (SQ <'\n'> <'\n'> <'\trm -f in &&\n'> <'\trm -f expect &&\n'> <'\tfor n in $(test_seq 51)\n'> 
          <'\tdo\n'> <'\t\techo put key$n value$n >> in &&\n'> <'\t\techo NULL >> expect\n'> <'\tdone &&\n'> 
          <'\techo size >> in &&\n'> <'\techo 64 51 >> expect &&\n'> <'\techo put key52 value52 >> in &&\n'> <'\techo NULL >> expect &&\n'> 
          <'\techo size >> in &&\n'> <'\techo 256 52 >> expect &&\n'> <'\tfor n in $(test_seq 12)\n'> <'\tdo\n'> 
          <'\t\techo remove key$n >> in &&\n'> <'\t\techo value$n >> expect\n'> <'\tdone &&\n'> <'\techo size >> in &&\n'> 
          <'\techo 256 40 >> expect &&\n'> <'\techo remove key40 >> in &&\n'> <'\techo value40 >> expect &&\n'> <'\techo size >> in &&\n'> 
          <'\techo 64 39 >> expect &&\n'> <'\tcat in | test-hashmap > out &&\n'> <'\ttest_cmp expect out\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'string interning'>)} 
      {
        (SQ <'\n'> <'\n'> <'test_hashmap "intern value1\n'> <'intern Value1\n'> <'intern value2\n'> 
          <'intern value2\n'> <'" "value1\n'> <'Value1\n'> <'value2\n'> <'value2"\n'> <'\n'>
        )
      }
    )
    (C {(test_done)})
  ]
)