From 5f21ebf42e670470b315a992b8a60f7c2e2bbbeb Mon Sep 17 00:00:00 2001
From: Steven Le Rouzic <steven.lerouzic@gmail.com>
Date: Tue, 14 Jan 2025 22:50:34 +0100
Subject: Add remove element to hash_set

---
 asl/tests/hash_set_tests.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 61 insertions(+), 2 deletions(-)

(limited to 'asl/tests/hash_set_tests.cpp')

diff --git a/asl/tests/hash_set_tests.cpp b/asl/tests/hash_set_tests.cpp
index e8d744b..e6a020a 100644
--- a/asl/tests/hash_set_tests.cpp
+++ b/asl/tests/hash_set_tests.cpp
@@ -1,5 +1,6 @@
 #include "asl/hash_set.hpp"
 #include "asl/testing/testing.hpp"
+#include "asl/tests/test_types.hpp"
 #include "asl/string.hpp"
 #include "asl/string_view.hpp"
 
@@ -53,7 +54,65 @@ ASL_TEST(a_bunch_of_ints)
     }
 }
 
-// @Todo Remove elements
+struct HashWithDestructor: public DestructorObserver
+{
+    int x;
+
+    HashWithDestructor(int x_, bool* ptr)
+        : DestructorObserver{ptr}
+        , x{x_}
+    {}
+
+    constexpr bool operator==(const HashWithDestructor& other) const
+    {
+        return x == other.x;
+    }
 
-// @Todo Test destructors
+    template<typename H>
+    friend H AslHashValue(H h, const HashWithDestructor& value)
+    {
+        return H::combine(ASL_MOVE(h), value.x);
+    }
+};
+
+ASL_TEST(destructor_and_remove)
+{
+    static constexpr int kCount = 200;
+    bool destroyed[kCount]{};
+
+    {
+        asl::hash_set<HashWithDestructor> set;
+
+        for (int i = 0; i < kCount; ++i)
+        {
+            set.insert(i, &destroyed[i]); // NOLINT
+        }
+
+        ASL_TEST_EXPECT(set.size() == kCount);
+
+        for (int i = 0; i < kCount; ++i)
+        {
+            ASL_TEST_EXPECT(!destroyed[i]); // NOLINT
+        }
+
+        for (int i = 0; i < kCount; i += 2)
+        {
+            // @Todo Remove with something comparable
+            ASL_TEST_EXPECT(set.remove(HashWithDestructor{i, nullptr}));
+        }
+
+        for (int i = 0; i < kCount; i += 2)
+        {
+            ASL_TEST_EXPECT(!set.contains(HashWithDestructor{i, nullptr}));
+            ASL_TEST_EXPECT(set.contains(HashWithDestructor{i+1, nullptr}));
+            ASL_TEST_EXPECT(destroyed[i]); // NOLINT
+            ASL_TEST_EXPECT(!destroyed[i + 1]); // NOLINT
+        }
+    }
+
+    for (int i = 0; i < kCount; ++i)
+    {
+        ASL_TEST_EXPECT(destroyed[i]); // NOLINT
+    }
+}
 
-- 
cgit