From 31e98ced014b9326ddfc990b003864df69cd4dcc Mon Sep 17 00:00:00 2001 From: Danny van Kooten Date: Mon, 16 Mar 2020 14:06:02 +0100 Subject: return old values when inserting or removing from hashmap --- tests/test.h | 2 ++ tests/test_hashmap.c | 38 ++++++++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 6 deletions(-) (limited to 'tests') diff --git a/tests/test.h b/tests/test.h index f860ee2..7a82d08 100644 --- a/tests/test.h +++ b/tests/test.h @@ -6,6 +6,8 @@ #define START_TESTS int main() { #define END_TESTS } #define TEST(name) strcpy(current_test, #name); +#define assert_null(actual) _assert(actual == NULL, __FILE__, __LINE__, "invalid value: expected NULL, got %s", actual) + #define assert_str(actual, expected) _assert(actual != NULL && strcmp(actual, expected) == 0, __FILE__, __LINE__, "invalid string: expected %s, got %s", expected, actual) #define assert(assertion, format, ...) _assert(assertion, __FILE__, __LINE__, format, ##__VA_ARGS__) #define ARRAY_SIZE(arr) sizeof arr / sizeof arr[0] diff --git a/tests/test_hashmap.c b/tests/test_hashmap.c index 14ec552..82f340c 100644 --- a/tests/test_hashmap.c +++ b/tests/test_hashmap.c @@ -5,23 +5,49 @@ START_TESTS TEST(hashmap) { struct hashmap *hm = hashmap_new(); - assert(hashmap_get(hm, "foo") == NULL, "expected NULL"); - hashmap_insert(hm, "foo", "bar"); char *value = hashmap_get(hm, "foo"); + assert_null(value); + value = hashmap_insert(hm, "foo", "bar"); + assert_null(value); + value = hashmap_get(hm, "foo"); assert_str(value, "bar"); hashmap_free(hm); } TEST(dot_notation) { + void *val; struct hashmap *user = hashmap_new(); - hashmap_insert(user, "name", "Danny"); + val = hashmap_insert(user, "name", "Danny"); + assert_null(val); struct hashmap *hm = hashmap_new(); - hashmap_insert(hm, "user", user); + val = hashmap_insert(hm, "user", user); + assert_null(val); assert(hashmap_resolve(hm, "user") == user, "expected user hashmap, got something else"); - char *value = (char *) hashmap_resolve(hm, "user.name"); - assert_str(value, "Danny"); + val = hashmap_resolve(hm, "user.name"); + assert_str(val, "Danny"); hashmap_free(user); hashmap_free(hm); } +TEST(hashmap_remove) { + struct hashmap *hm = hashmap_new(); + hashmap_insert(hm, "foo", "bar"); + char *value = hashmap_get(hm, "foo"); + assert_str(value, "bar"); + + // remove once + value = hashmap_remove(hm, "foo"); + assert_str(value, "bar"); + value = hashmap_get(hm, "foo"); + assert_null(value); + + // remove again (should no-op) + value = hashmap_remove(hm, "foo"); + assert_null(value); + value = hashmap_get(hm, "foo"); + assert_null(value); + + hashmap_free(hm); +} + END_TESTS \ No newline at end of file -- cgit v1.2.3