2013-11-14 23:17:54 +04:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='test hashmap and string hash functions'
|
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
test_hashmap() {
|
2018-03-24 10:44:43 +03:00
|
|
|
echo "$1" | test-tool hashmap $3 > actual &&
|
2013-11-14 23:17:54 +04:00
|
|
|
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' '
|
2019-07-31 04:23:37 +03:00
|
|
|
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
|
2013-11-14 23:17:54 +04:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'iterate (case insensitive)' '
|
2019-07-31 04:23:37 +03:00
|
|
|
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
|
2013-11-14 23:17:54 +04:00
|
|
|
'
|
|
|
|
|
|
|
|
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 &&
|
2015-03-20 13:07:15 +03:00
|
|
|
echo NULL >> expect &&
|
2013-11-14 23:17:54 +04:00
|
|
|
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 &&
|
2018-03-24 10:44:43 +03:00
|
|
|
cat in | test-tool hashmap > out &&
|
2013-11-14 23:17:54 +04:00
|
|
|
test_cmp expect out
|
|
|
|
|
|
|
|
'
|
|
|
|
|
2014-07-03 02:22:54 +04:00
|
|
|
test_expect_success 'string interning' '
|
|
|
|
|
|
|
|
test_hashmap "intern value1
|
|
|
|
intern Value1
|
|
|
|
intern value2
|
|
|
|
intern value2
|
|
|
|
" "value1
|
|
|
|
Value1
|
|
|
|
value2
|
|
|
|
value2"
|
|
|
|
|
|
|
|
'
|
|
|
|
|
2013-11-14 23:17:54 +04:00
|
|
|
test_done
|