267 lines
7.7 KiB
C
267 lines
7.7 KiB
C
// vim:fileencoding=utf-8:foldmethod=marker
|
|
|
|
#include "wapp.h"
|
|
#include "test_hashmap.h"
|
|
|
|
wp_persist inline WpU8Stream encoder(void *data);
|
|
wp_persist inline b8 key_eq(void *a, void *b);
|
|
|
|
WpTestFuncResult test_hashmap(void) {
|
|
b8 result = true;
|
|
WpHashMap map = wpHashMap(WpStr8, i32, encoder, key_eq, 8);
|
|
result = result && wpHashMapCapacity(&map) == 8 && wpHashMapCount(&map) == 0;
|
|
map = wpHashMap(WpStr8, i32, encoder, key_eq, 3);
|
|
result = result && wpHashMapCapacity(&map) == 4 && wpHashMapCount(&map) == 0;
|
|
return wpTesterResult(result);
|
|
}
|
|
|
|
WpTestFuncResult test_hashmap_alloc(void) {
|
|
WpAllocator arena = wpMemArenaAllocatorInit(KiB(4));
|
|
b8 result = true;
|
|
WpHashMap map = wpHashMapAlloc(WpStr8, i32, &arena, encoder, key_eq, 8);
|
|
result = result && wpHashMapCapacity(&map) == 8 && wpHashMapCount(&map) == 0;
|
|
map = wpHashMapAlloc(WpStr8, i32, &arena, encoder, key_eq, 3);
|
|
result = result && wpHashMapCapacity(&map) == 4 && wpHashMapCount(&map) == 0;
|
|
|
|
wpMemArenaAllocatorDestroy(&arena);
|
|
|
|
return wpTesterResult(result);
|
|
}
|
|
|
|
WpTestFuncResult test_hashmap_get_key_size(void) {
|
|
b8 result = true;
|
|
WpHashMap map = wpHashMap(WpStr8, i32, encoder, key_eq, 8);
|
|
result = result && wpHashMapKeySize(&map) == sizeof(WpStr8);
|
|
return wpTesterResult(result);
|
|
}
|
|
|
|
WpTestFuncResult test_hashmap_get_value_size(void) {
|
|
b8 result = true;
|
|
WpHashMap map = wpHashMap(WpStr8, i32, encoder, key_eq, 8);
|
|
result = result && wpHashMapValueSize(&map) == sizeof(i32);
|
|
return wpTesterResult(result);
|
|
}
|
|
|
|
WpTestFuncResult test_hashmap_find(void) {
|
|
b8 result = true;
|
|
WpHashMap map = wpHashMap(WpStr8, i32, encoder, key_eq, 8);
|
|
WpStr8Array keys = wpArray(
|
|
WpStr8,
|
|
wpStr8Lit("key1"),
|
|
wpStr8Lit("key2"),
|
|
wpStr8Lit("key3"),
|
|
wpStr8Lit("key4")
|
|
);
|
|
WpI32Array values = wpArray(i32, 1, 2, 3, 4);
|
|
|
|
for (u64 i = 0; i < wpArrayCount(keys); ++i) {
|
|
wpHashMapInsertCapped(WpStr8, i32, &map, &keys[i], &values[i]);
|
|
}
|
|
|
|
WpHashLookupResult res = wpHashMapFind(WpStr8, &map, &keys[3]);
|
|
|
|
result = result && res.found && res.ref.dist_and_tag > 0;
|
|
|
|
WpStr8 key = wpStr8Lit("key0");
|
|
res = wpHashMapFind(WpStr8, &map, &key);
|
|
result = result && !res.found;
|
|
|
|
return wpTesterResult(result);
|
|
}
|
|
|
|
WpTestFuncResult test_hashmap_update(void) {
|
|
b8 result = true;
|
|
WpHashMap map = wpHashMap(WpStr8, i32, encoder, key_eq, 4);
|
|
WpStr8Array keys = wpArray(
|
|
WpStr8,
|
|
wpStr8Lit("key1"),
|
|
wpStr8Lit("key2"),
|
|
wpStr8Lit("key3"),
|
|
wpStr8Lit("key4")
|
|
);
|
|
WpI32Array values = wpArray(i32, 1, 2, 3, 4);
|
|
|
|
for (u64 i = 0; i < wpArrayCount(keys); ++i) {
|
|
wpHashMapInsertCapped(WpStr8, i32, &map, &keys[i], &values[i]);
|
|
}
|
|
|
|
i32 new_value = 0;
|
|
wpHashMapUpdate(WpStr8, i32, &map, &keys[1], &new_value);
|
|
result = result && wpHashMapCapacity(&map) == 4 && wpHashMapCount(&map) == 3 &&
|
|
wpHashMapValues(i32, &map)[1] == new_value;
|
|
|
|
return wpTesterResult(result);
|
|
}
|
|
|
|
WpTestFuncResult test_hashmap_insert_capped(void) {
|
|
b8 result = true;
|
|
WpHashMap map = wpHashMap(WpStr8, i32, encoder, key_eq, 4);
|
|
WpStr8Array keys = wpArray(
|
|
WpStr8,
|
|
wpStr8Lit("key1"),
|
|
wpStr8Lit("key2"),
|
|
wpStr8Lit("key3"),
|
|
wpStr8Lit("key4")
|
|
);
|
|
WpI32Array values = wpArray(i32, 1, 2, 3, 4);
|
|
|
|
for (u64 i = 0; i < wpArrayCount(keys); ++i) {
|
|
wpHashMapInsertCapped(WpStr8, i32, &map, &keys[i], &values[i]);
|
|
}
|
|
|
|
result = result && wpHashMapCapacity(&map) == 4 && wpHashMapCount(&map) == 3;
|
|
for (u64 i = 0; i < 3; ++i) {
|
|
result = result && wpStr8Equal(wpArrayGet(WpStr8, map.keys, i), &keys[i]);
|
|
}
|
|
|
|
return wpTesterResult(result);
|
|
}
|
|
|
|
WpTestFuncResult test_hashmap_insert_or_update_capped(void) {
|
|
b8 result = true;
|
|
WpHashMap map = wpHashMap(WpStr8, i32, encoder, key_eq, 4);
|
|
WpStr8Array keys = wpArray(
|
|
WpStr8,
|
|
wpStr8Lit("key1"),
|
|
wpStr8Lit("key2"),
|
|
wpStr8Lit("key3"),
|
|
wpStr8Lit("key4")
|
|
);
|
|
WpI32Array values = wpArray(i32, 1, 2, 3, 4);
|
|
|
|
for (u64 i = 0; i < wpArrayCount(keys); ++i) {
|
|
wpHashMapInsertOrUpdateCapped(WpStr8, i32, &map, &keys[i], &values[i]);
|
|
}
|
|
|
|
result = result && wpHashMapCapacity(&map) == 4 && wpHashMapCount(&map) == 3;
|
|
for (u64 i = 0; i < 3; ++i) {
|
|
result = result && wpStr8Equal(&wpHashMapKeys(WpStr8, &map)[i], &keys[i]);
|
|
}
|
|
|
|
i32 new_value = 0;
|
|
wpHashMapInsertOrUpdateCapped(WpStr8, i32, &map, &keys[1], &new_value);
|
|
result = result && wpHashMapCapacity(&map) == 4 && wpHashMapCount(&map) == 3 &&
|
|
wpHashMapValues(i32, &map)[1] == new_value;
|
|
|
|
return wpTesterResult(result);
|
|
}
|
|
|
|
WpTestFuncResult test_hashmap_insert_alloc(void) {
|
|
WpAllocator arena = wpMemArenaAllocatorInit(KiB(4));
|
|
b8 result = true;
|
|
WpHashMap map = wpHashMap(WpStr8, i32, encoder, key_eq, 4);
|
|
WpStr8Array keys = wpArray(
|
|
WpStr8,
|
|
wpStr8Lit("key1"),
|
|
wpStr8Lit("key2"),
|
|
wpStr8Lit("key3"),
|
|
wpStr8Lit("key4")
|
|
);
|
|
WpI32Array values = wpArray(i32, 1, 2, 3, 4);
|
|
|
|
WpStr8Array map_keys = map.keys;
|
|
|
|
for (u64 i = 0; i < wpArrayCount(keys); ++i) {
|
|
wpHashMapInsertAlloc(WpStr8, i32, &arena, &map, &keys[i], &values[i]);
|
|
}
|
|
|
|
result = result && map.keys != map_keys && wpHashMapCapacity(&map) == 8 && wpHashMapCount(&map) == 4;
|
|
for (u64 i = 0; i < wpArrayCount(keys); ++i) {
|
|
result = result && wpStr8Equal(&wpHashMapKeys(WpStr8, &map)[i], &keys[i]) &&
|
|
wpHashMapValues(i32, &map)[i] == values[i];
|
|
}
|
|
|
|
wpMemArenaAllocatorDestroy(&arena);
|
|
|
|
return wpTesterResult(result);
|
|
}
|
|
|
|
WpTestFuncResult test_hashmap_insert_or_update_alloc(void) {
|
|
WpAllocator arena = wpMemArenaAllocatorInit(KiB(4));
|
|
b8 result = true;
|
|
WpHashMap map = wpHashMap(WpStr8, i32, encoder, key_eq, 4);
|
|
WpStr8Array keys = wpArray(
|
|
WpStr8,
|
|
wpStr8Lit("key1"),
|
|
wpStr8Lit("key2"),
|
|
wpStr8Lit("key3"),
|
|
wpStr8Lit("key4")
|
|
);
|
|
WpI32Array values = wpArray(i32, 1, 2, 3, 4);
|
|
|
|
for (u64 i = 0; i < wpArrayCount(keys); ++i) {
|
|
wpHashMapInsertOrUpdateAlloc(WpStr8, i32, &arena, &map, &keys[i], &values[i]);
|
|
}
|
|
|
|
result = result && wpHashMapCapacity(&map) == 8 && wpHashMapCount(&map) == 4;
|
|
for (u64 i = 0; i < wpArrayCount(keys); ++i) {
|
|
result = result && wpStr8Equal(&wpHashMapKeys(WpStr8, &map)[i], &keys[i]);
|
|
}
|
|
|
|
i32 new_value = 0;
|
|
wpHashMapInsertOrUpdateAlloc(WpStr8, i32, &arena, &map, &keys[1], &new_value);
|
|
result = result && wpHashMapCapacity(&map) == 8 && wpHashMapCount(&map) == 4 &&
|
|
wpHashMapValues(i32, &map)[1] == new_value;
|
|
|
|
wpMemArenaAllocatorDestroy(&arena);
|
|
|
|
return wpTesterResult(result);
|
|
}
|
|
|
|
WpTestFuncResult test_hashmap_remove(void) {
|
|
b8 result = true;
|
|
WpHashMap map = wpHashMap(WpStr8, i32, encoder, key_eq, 4);
|
|
WpStr8Array keys = wpArray(
|
|
WpStr8,
|
|
wpStr8Lit("key1"),
|
|
wpStr8Lit("key2"),
|
|
wpStr8Lit("key3"),
|
|
wpStr8Lit("key4")
|
|
);
|
|
WpI32Array values = wpArray(i32, 1, 2, 3, 4);
|
|
|
|
for (u64 i = 0; i < wpArrayCount(keys); ++i) {
|
|
wpHashMapInsertCapped(WpStr8, i32, &map, &keys[i], &values[i]);
|
|
}
|
|
|
|
wpHashMapRemove(WpStr8, i32, &map, &keys[0]);
|
|
|
|
result = result && wpHashMapCapacity(&map) == 4 && wpHashMapCount(&map) == 2;
|
|
|
|
return wpTesterResult(result);
|
|
}
|
|
|
|
WpTestFuncResult test_hashmap_clear(void) {
|
|
b8 result = true;
|
|
WpHashMap map = wpHashMap(WpStr8, i32, encoder, key_eq, 8);
|
|
WpStr8Array keys = wpArray(
|
|
WpStr8,
|
|
wpStr8Lit("key1"),
|
|
wpStr8Lit("key2"),
|
|
wpStr8Lit("key3"),
|
|
wpStr8Lit("key4")
|
|
);
|
|
WpI32Array values = wpArray(i32, 1, 2, 3, 4);
|
|
|
|
for (u64 i = 0; i < wpArrayCount(keys); ++i) {
|
|
wpHashMapInsertCapped(WpStr8, i32, &map, &keys[i], &values[i]);
|
|
}
|
|
|
|
wpHashMapClear(WpStr8, i32, &map);
|
|
|
|
result = result && wpHashMapCount(&map) == 0;
|
|
|
|
return wpTesterResult(result);
|
|
}
|
|
|
|
wp_persist inline WpU8Stream encoder(void *data) {
|
|
WpStr8 *str = (WpStr8 *)data;
|
|
return wpStream(u8, str->buf, str->size);
|
|
}
|
|
|
|
wp_persist inline b8 key_eq(void *a, void *b) {
|
|
WpStr8 *a_str = (WpStr8 *)a;
|
|
WpStr8 *b_str = (WpStr8 *)b;
|
|
return wpStr8Equal(a_str, b_str);
|
|
}
|