#!/bin/sh global test_description := ''test hashmap and string hash functions'' source ./test-lib.sh proc test_hashmap { echo $1 | test-hashmap $3 > actual && echo $2 > expect && test_cmp expect actual } test_expect_success 'hash functions' ' test_hashmap "hash key1" "2215982743 2215982743 116372151 116372151" && test_hashmap "hash key2" "2215982740 2215982740 116372148 116372148" && test_hashmap "hash fooBarFrotz" "1383912807 1383912807 3189766727 3189766727" && test_hashmap "hash foobarfrotz" "2862305959 2862305959 3189766727 3189766727" ' test_expect_success 'put' ' test_hashmap "put key1 value1 put key2 value2 put fooBarFrotz value3 put foobarfrotz value4 size" "NULL NULL NULL NULL 64 4" ' test_expect_success 'put (case insensitive)' ' test_hashmap "put key1 value1 put key2 value2 put fooBarFrotz value3 size" "NULL NULL NULL 64 3" ignorecase ' test_expect_success 'replace' ' test_hashmap "put key1 value1 put key1 value2 put fooBarFrotz value3 put fooBarFrotz value4 size" "NULL value1 NULL value3 64 2" ' test_expect_success 'replace (case insensitive)' ' test_hashmap "put key1 value1 put Key1 value2 put fooBarFrotz value3 put foobarfrotz value4 size" "NULL value1 NULL value3 64 2" ignorecase ' test_expect_success 'get' ' test_hashmap "put key1 value1 put key2 value2 put fooBarFrotz value3 put foobarfrotz value4 get key1 get key2 get fooBarFrotz get notInMap" "NULL NULL NULL NULL value1 value2 value3 NULL" ' test_expect_success 'get (case insensitive)' ' test_hashmap "put key1 value1 put key2 value2 put fooBarFrotz value3 get Key1 get keY2 get foobarfrotz get notInMap" "NULL NULL NULL value1 value2 value3 NULL" ignorecase ' test_expect_success 'add' ' test_hashmap "add key1 value1 add key1 value2 add fooBarFrotz value3 add fooBarFrotz value4 get key1 get fooBarFrotz get notInMap" "value2 value1 value4 value3 NULL" ' test_expect_success 'add (case insensitive)' ' test_hashmap "add key1 value1 add Key1 value2 add fooBarFrotz value3 add foobarfrotz value4 get key1 get Foobarfrotz get notInMap" "value2 value1 value4 value3 NULL" ignorecase ' test_expect_success 'remove' ' test_hashmap "put key1 value1 put key2 value2 put fooBarFrotz value3 remove key1 remove key2 remove notInMap size" "NULL NULL NULL value1 value2 NULL 64 1" ' test_expect_success 'remove (case insensitive)' ' test_hashmap "put key1 value1 put key2 value2 put fooBarFrotz value3 remove Key1 remove keY2 remove notInMap size" "NULL NULL NULL value1 value2 NULL 64 1" ignorecase ' test_expect_success 'iterate' ' test_hashmap "put key1 value1 put key2 value2 put fooBarFrotz value3 iterate" "NULL NULL NULL key2 value2 key1 value1 fooBarFrotz value3" ' test_expect_success 'iterate (case insensitive)' ' test_hashmap "put key1 value1 put key2 value2 put fooBarFrotz value3 iterate" "NULL NULL NULL fooBarFrotz value3 key2 value2 key1 value1" ignorecase ' test_expect_success 'grow / shrink' ' rm -f in && rm -f expect && for n in $(test_seq 51) do echo put key$n value$n >> in && echo NULL >> expect done && echo size >> in && echo 64 51 >> expect && echo put key52 value52 >> in && echo NULL >> expect && echo size >> in && echo 256 52 >> expect && for n in $(test_seq 12) do echo remove key$n >> in && echo value$n >> expect done && echo size >> in && echo 256 40 >> expect && echo remove key40 >> in && echo value40 >> expect && echo size >> in && echo 64 39 >> expect && cat in | test-hashmap > out && test_cmp expect out ' test_expect_success 'string interning' ' test_hashmap "intern value1 intern Value1 intern value2 intern value2 " "value1 Value1 value2 value2" ' test_done (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 )} { (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 )} { (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 )} { (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 )} { (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 )} { (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 )} { (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)}) ] )