Add basic Set implementation - TODO: add iterators for Set and HashTable
[cgds.git] / test / t.Set.c
diff --git a/test/t.Set.c b/test/t.Set.c
new file mode 100644 (file)
index 0000000..d85b0c6
--- /dev/null
@@ -0,0 +1,143 @@
+#include <stdlib.h>
+#include "cgds/Set.h"
+#include "helpers.h"
+#include "lut.h"
+
+UInt getHash_int(void* item, size_t hashSize) {
+  return *((int*)item) % hashSize;
+}
+
+void t_set_clear()
+{
+  Set* s = set_new(int, 16, getHash_int);
+  lu_assert(set_empty(s));
+
+  set_add(s, 0);
+  set_add(s, 1);
+  set_add(s, 2);
+
+  set_destroy(s);
+  s = set_new(int, 8, getHash_int);
+
+  set_add(s, 1);
+  set_add(s, 2);
+  set_add(s, 3);
+
+  set_clear(s);
+  lu_assert(set_empty(s));
+
+  set_destroy(s);
+}
+
+void t_set_size()
+{
+  Set* s = set_new(int, 16, getHash_int);
+  lu_assert(set_empty(s));
+
+  set_add(s, 0);
+  set_add(s, 1);
+  set_add(s, 2);
+  lu_assert_int_eq(set_size(s), 3);
+
+  set_add(s, 3);
+  set_add(s, 4);
+  lu_assert_int_eq(set_size(s), 5);
+
+  set_add(s, 5);
+  set_add(s, 6);
+  set_add(s, 7);
+  lu_assert_int_eq(set_size(s), 8);
+
+  set_destroy(s);
+}
+
+void t_set_add_remove_basic()
+{
+  int n = 10;
+
+  Set* s = set_new(double, 4, NULL);
+  for (double i = 0.0; i < n; i++)
+    set_add(s, i);
+  lu_assert_int_eq(set_size(s), n);
+
+  // Check values
+  for (double i = 0.0; i < n; i++)
+    lu_assert(set_has(s, &i));
+
+  // Remove items
+  for (double i = 0.0; i < n; i++)
+    set_delete(s, i);
+  lu_assert_int_eq(set_size(s), 0);
+
+  set_destroy(s);
+}
+
+void t_set_getnull_modify()
+{
+  int n = 10;
+
+  Set* s = set_new(StructTest1, 4, NULL);
+  // NOTE: using calloc() because probably StructTest1 is 4 + 8 bytes,
+  // aligned to 8 + 8 ==> 4 are left uninitialized ==> memcpy compares
+  // some junk values. TODO: custom equality function instead.
+  StructTest1* st1 = (StructTest1*) calloc(n , sizeof(StructTest1));
+  for (int i = 0; i < n; i++)
+  {
+    st1[i].a = random() % 42;
+    st1[i].b = (double) random() / RAND_MAX;
+    set_add(s, *(st1 + i));
+  }
+  for (int i = 0; i < n; i++)
+  {
+    // Another way to access elements
+    StructTest1* st1Cell = (StructTest1*) calloc(1, sizeof(StructTest1));
+    st1Cell->a = st1[7].a;
+    st1Cell->b = st1[7].b;
+    lu_assert(set_has(s, st1Cell));
+    free(st1Cell);
+  }
+
+  // has / has not:
+  StructTest1* stmp = (StructTest1*) calloc(1, sizeof(StructTest1));
+  stmp->a = 51;
+  stmp->b = 2.0;
+  lu_assert(!set_has(s, stmp));
+  free(stmp);
+  lu_assert(set_has(s, st1 + 4));
+  free(st1);
+
+  set_destroy(s);
+}
+
+void t_set_copy()
+{
+  int n = 10;
+
+  Set* s = set_new(int, 8, getHash_int);
+  for (int i = 0; i < n; i++)
+    set_add(s, i + 1);
+  Set* sc = set_copy(s);
+
+  lu_assert_int_eq(s->size, sc->size);
+  int *a, *b;
+  for (int i = 0; i < n; i++) {
+    int item = i + 1;
+    lu_assert(set_has(sc, &item));
+  }
+  set_destroy(s);
+  set_destroy(sc);
+}
+
+void t_set_tovect()
+{
+  int n = 10;
+
+  Set* s = set_new(int, 8, getHash_int);
+  for (int i = 0; i < n; i++)
+    set_add(s, i);
+
+  Vector* v = set_to_vector(s);
+  lu_assert(vector_size(v) == set_size(s));
+  vector_destroy(v);
+  set_destroy(s);
+}