| #!/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 |