]> git.ozlabs.org Git - ccan/blobdiff - ccan/foreach/test/run-nested.c
foreach: new module
[ccan] / ccan / foreach / test / run-nested.c
diff --git a/ccan/foreach/test/run-nested.c b/ccan/foreach/test/run-nested.c
new file mode 100644 (file)
index 0000000..13ab466
--- /dev/null
@@ -0,0 +1,102 @@
+#include <ccan/foreach/foreach.h>
+#include <ccan/tap/tap.h>
+#include <stdio.h>
+#include <string.h>
+#include <ccan/foreach/foreach.c>
+
+static int test_int_recursion(unsigned int level)
+{
+       int i, sum = 0;
+
+       foreach_int(i, 0, 1, 2, 3, 4) {
+               sum += i;
+               if (i > level)
+                       sum += test_int_recursion(i);
+       }
+       return sum;
+}
+
+static int test_ptr_recursion(const char *level)
+{
+       int sum = 0;
+       const char *i;
+
+       foreach_ptr(i, "0", "1", "2", "3", "4") {
+               sum += atoi(i);
+               if (atoi(i) > atoi(level))
+                       sum += test_ptr_recursion(i);
+       }
+       return sum;
+}
+
+static int count_iters(void)
+{
+       unsigned int count = 0;
+#if !HAVE_COMPOUND_LITERALS || !HAVE_FOR_LOOP_DECLARATION
+       struct iter_info *i;
+       
+       list_for_each(&iters, i, list)
+               count++;
+#endif
+       return count;
+}
+
+int main(void)
+{
+       int i, j, sum;
+       const char *istr, *jstr;
+
+       plan_tests(12);
+
+       sum = 0;
+       foreach_int(i, 0, 1, 2, 3, 4)
+               foreach_int(j, 0, 1, 2, 3, 4)
+                       sum += i*j;
+       diag("sum = %i\n", sum);
+       diag("iters = %i\n", count_iters());
+       ok1(sum == 100);
+       ok1(count_iters() <= 2);
+
+       /* Same again... reusing iterators. */
+       sum = 0;
+       foreach_int(i, 0, 1, 2, 3, 4)
+               foreach_int(j, 0, 1, 2, 3, 4)
+                       sum += i*j;
+       diag("sum = %i\n", sum);
+       diag("iters = %i\n", count_iters());
+       ok1(sum == 100);
+       ok1(count_iters() <= 2);
+
+       sum = test_int_recursion(0);
+       diag("sum = %i\n", sum);
+       diag("iters = %i\n", count_iters());
+       ok1(sum == 160);
+       ok1(count_iters() <= 2 + 5); /* 5 is max depth of recursion. */
+
+       sum = 0;
+       foreach_ptr(istr, "0", "1", "2", "3", "4")
+               foreach_ptr(jstr, "0", "1", "2", "3", "4")
+                       sum += atoi(istr)*atoi(jstr);
+       diag("sum = %i\n", sum);
+       diag("iters = %i\n", count_iters());
+       ok1(sum == 100);
+       ok1(count_iters() <= 2 + 5 + 2);
+
+       /* Same again... reusing iterators. */
+       sum = 0;
+       foreach_ptr(istr, "0", "1", "2", "3", "4")
+               foreach_ptr(jstr, "0", "1", "2", "3", "4")
+                       sum += atoi(istr)*atoi(jstr);
+       diag("sum = %i\n", sum);
+       diag("iters = %i\n", count_iters());
+       ok1(sum == 100);
+       ok1(count_iters() <= 2 + 5 + 2);
+
+       sum = test_ptr_recursion("0");
+       diag("sum = %i\n", sum);
+       diag("iters = %i\n", count_iters());
+       ok1(sum == 160);
+       ok1(count_iters() <= 2 + 5 + 2);
+       return exit_status();
+}
+