]> git.ozlabs.org Git - ccan/blobdiff - ccan/strset/test/run-prefix.c
strset: new module using critbit trees.
[ccan] / ccan / strset / test / run-prefix.c
diff --git a/ccan/strset/test/run-prefix.c b/ccan/strset/test/run-prefix.c
new file mode 100644 (file)
index 0000000..87ce98f
--- /dev/null
@@ -0,0 +1,87 @@
+#include <ccan/strset/strset.h>
+#include <ccan/strset/strset.c>
+#include <ccan/tap/tap.h>
+#include <stdio.h>
+
+/* Must be > 100, see below. */
+#define NUM 200
+
+static bool in_order(const char *value, unsigned int *count)
+{
+       int i = atoi(value);
+       ok1(*count == i);
+       (*count)++;
+       return false;
+}
+
+static bool find_empty(const char *value, char *empty)
+{
+       if (value == empty)
+               pass("Found empty entry!");
+       return false;
+}
+
+int main(void)
+{
+       struct strset set;
+       const struct strset *sub;
+       unsigned int i;
+       char *str[NUM], *empty;
+
+       plan_tests(7 + 1 + 10 + 100);
+       strset_init(&set);
+
+       for (i = 0; i < NUM; i++) {
+               char template[10];
+               sprintf(template, "%08u", i);
+               str[i] = strdup(template);
+       }
+
+       for (i = 0; i < NUM; i++)
+               strset_set(&set, str[i]);
+
+       /* Nothing */
+       sub = strset_prefix(&set, "a");
+       ok1(strset_empty(sub));
+
+       /* Everything */
+       sub = strset_prefix(&set, "0");
+       ok1(sub->u.n == set.u.n);
+       sub = strset_prefix(&set, "");
+       ok1(sub->u.n == set.u.n);
+
+       /* Singleton. */
+       sub = strset_prefix(&set, "00000000");
+       i = 0;
+       strset_iterate(sub, in_order, &i);
+       ok1(i == 1);
+
+       /* First 10. */
+       sub = strset_prefix(&set, "0000000");
+       i = 0;
+       strset_iterate(sub, in_order, &i);
+       ok1(i == 10);
+
+       /* First 100. */
+       sub = strset_prefix(&set, "000000");
+       i = 0;
+       strset_iterate(sub, in_order, &i);
+       ok1(i == 100);
+
+       /* Everything, *plus* empty string. */
+       empty = strdup("");
+       strset_set(&set, empty);
+
+       sub = strset_prefix(&set, "");
+       /* Check we get *our* empty string back! */
+       strset_iterate(sub, find_empty, empty);
+
+       strset_destroy(&set);
+
+       for (i = 0; i < NUM; i++)
+               free(str[i]);
+       free(empty);
+
+       /* This exits depending on whether all tests passed */
+       return exit_status();
+}