#!/bin/sh test_description='test hashmap and string hash functions' . ./test-lib.sh test_hashmap() { echo "$1" | test-tool hashmap $3 > actual && echo "$2" > expect && test_cmp expect actual } 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-tool hashmap >actual.raw <<-\EOF && put key1 value1 put key2 value2 put fooBarFrotz value3 iterate EOF cat >expect <<-\EOF && NULL NULL NULL fooBarFrotz value3 key1 value1 key2 value2 EOF sort <actual.raw >actual && test_cmp expect actual ' test_expect_success 'iterate (case insensitive)' ' test-tool hashmap ignorecase >actual.raw <<-\EOF && put key1 value1 put key2 value2 put fooBarFrotz value3 iterate EOF cat >expect <<-\EOF && NULL NULL NULL fooBarFrotz value3 key1 value1 key2 value2 EOF sort <actual.raw >actual && test_cmp expect actual ' 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-tool 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