(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
              children: [
                (Pipeline
                  children: [
                    (C {(echo)} {(DQ ($ VSub_Number "$1"))})
                    (SimpleCommand
                      words: [{(test-hashmap)} {($ VSub_Number "$3")}]
                      redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(actual)} spids:[33])]
                    )
                  ]
                  negated: False
                )
                (AndOr
                  children: [
                    (SimpleCommand
                      words: [{(echo)} {(DQ ($ VSub_Number "$2"))}]
                      redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(expect)} spids:[46])]
                    )
                    (C {(test_cmp)} {(expect)} {(actual)})
                  ]
                  op_id: Op_DAmp
                )
              ]
              op_id: Op_DAmp
            )
          ]
          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)})
  ]
)