From 31e98ced014b9326ddfc990b003864df69cd4dcc Mon Sep 17 00:00:00 2001
From: Danny van Kooten <dannyvankooten@users.noreply.github.com>
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