]> git.ozlabs.org Git - ccan/blobdiff - ccan/intmap/test/run-order.c
intmap: new module.
[ccan] / ccan / intmap / test / run-order.c
diff --git a/ccan/intmap/test/run-order.c b/ccan/intmap/test/run-order.c
new file mode 100644 (file)
index 0000000..c44d2ba
--- /dev/null
@@ -0,0 +1,88 @@
+#include <ccan/intmap/intmap.c>
+#include <ccan/tap/tap.h>
+#include <stdio.h>
+
+#define NUM 1000
+
+typedef UINTMAP(unsigned int *) umap;
+typedef SINTMAP(int *) smap;
+
+static bool check_umap(const umap *map)
+{
+       /* This is a larger type than unsigned, and allows negative */
+       int64_t i, prev;
+
+       /* Must be in order, must contain value. */
+       prev = -1;
+       for (i = uintmap_first(map); i != -1ULL; i = uintmap_after(map, i)) {
+               if (i <= prev)
+                       return false;
+               if (*(unsigned int *)uintmap_get(map, i) != i)
+                       return false;
+               prev = i;
+       }
+       return true;
+}
+
+static bool check_smap(const smap *map)
+{
+       /* This is a larger type than int, and allows negative */
+       int64_t i, prev;
+
+       /* Must be in order, must contain value. */
+       prev = -0x80000001ULL;
+       for (i = sintmap_first(map);
+            i != 0x7FFFFFFFFFFFFFFFLL;
+            i = sintmap_after(map, i)) {
+               if (i <= prev)
+                       return false;
+               if (*(int *)sintmap_get(map, i) != i)
+                       return false;
+               prev = i;
+       }
+       return true;
+}
+
+int main(void)
+{
+       umap umap;
+       smap smap;
+       int i;
+       unsigned int urandoms[NUM];
+       int srandoms[NUM];
+
+       plan_tests(6 * NUM + 2);
+       uintmap_init(&umap);
+       sintmap_init(&smap);
+
+       for (i = 0; i < NUM; i++) {
+               urandoms[i] = random();
+               srandoms[i] = random();
+       }
+       for (i = 0; i < NUM; i++) {
+               /* In case we have duplicates. */
+               while (!uintmap_add(&umap, urandoms[i], urandoms+i))
+                       urandoms[i] = random();
+               ok1(check_umap(&umap));
+       }
+       for (i = 0; i < NUM; i++) {
+               ok1(uintmap_del(&umap, urandoms[i]) == urandoms+i);
+               ok1(check_umap(&umap));
+       }
+       ok1(uintmap_empty(&umap));
+
+       for (i = 0; i < NUM; i++) {
+               /* In case we have duplicates. */
+               while (!sintmap_add(&smap, srandoms[i], srandoms+i))
+                       srandoms[i] = random();
+               ok1(check_smap(&smap));
+       }
+       for (i = 0; i < NUM; i++) {
+               ok1(sintmap_del(&smap, srandoms[i]) == srandoms+i);
+               ok1(check_smap(&smap));
+       }
+       ok1(sintmap_empty(&smap));
+
+       /* This exits depending on whether all tests passed */
+       return exit_status();
+}