foreach: fix HAVE_FOR_LOOP_DECLARATION case.
[ccan] / ccan / foreach / test / run-nested.c
1 #include <ccan/foreach/foreach.h>
2 #include <ccan/tap/tap.h>
3 #include <stdio.h>
4 #include <string.h>
5 #include <stdlib.h>
6 #include <ccan/foreach/foreach.c>
7
8 static int test_int_recursion(unsigned int level)
9 {
10         int i, sum = 0;
11
12         foreach_int(i, 0, 1, 2, 3, 4) {
13                 sum += i;
14                 if (i > level)
15                         sum += test_int_recursion(i);
16         }
17         return sum;
18 }
19
20 static int test_ptr_recursion(const char *level)
21 {
22         int sum = 0;
23         const char *i;
24
25         foreach_ptr(i, "0", "1", "2", "3", "4") {
26                 sum += atoi(i);
27                 if (atoi(i) > atoi(level))
28                         sum += test_ptr_recursion(i);
29         }
30         return sum;
31 }
32
33 static int count_iters(void)
34 {
35         unsigned int count = 0;
36 #if !HAVE_COMPOUND_LITERALS || !HAVE_FOR_LOOP_DECLARATION
37         struct iter_info *i;
38         
39         list_for_each(&iters, i, list)
40                 count++;
41 #endif
42         return count;
43 }
44
45 int main(void)
46 {
47         int i, j, sum;
48         const char *istr, *jstr;
49
50         plan_tests(12);
51
52         sum = 0;
53         foreach_int(i, 0, 1, 2, 3, 4)
54                 foreach_int(j, 0, 1, 2, 3, 4)
55                         sum += i*j;
56         diag("sum = %i\n", sum);
57         diag("iters = %i\n", count_iters());
58         ok1(sum == 100);
59         ok1(count_iters() <= 2);
60
61         /* Same again... reusing iterators. */
62         sum = 0;
63         foreach_int(i, 0, 1, 2, 3, 4)
64                 foreach_int(j, 0, 1, 2, 3, 4)
65                         sum += i*j;
66         diag("sum = %i\n", sum);
67         diag("iters = %i\n", count_iters());
68         ok1(sum == 100);
69         ok1(count_iters() <= 2);
70
71         sum = test_int_recursion(0);
72         diag("sum = %i\n", sum);
73         diag("iters = %i\n", count_iters());
74         ok1(sum == 160);
75         ok1(count_iters() <= 2 + 5); /* 5 is max depth of recursion. */
76
77         sum = 0;
78         foreach_ptr(istr, "0", "1", "2", "3", "4")
79                 foreach_ptr(jstr, "0", "1", "2", "3", "4")
80                         sum += atoi(istr)*atoi(jstr);
81         diag("sum = %i\n", sum);
82         diag("iters = %i\n", count_iters());
83         ok1(sum == 100);
84         ok1(count_iters() <= 2 + 5 + 2);
85
86         /* Same again... reusing iterators. */
87         sum = 0;
88         foreach_ptr(istr, "0", "1", "2", "3", "4")
89                 foreach_ptr(jstr, "0", "1", "2", "3", "4")
90                         sum += atoi(istr)*atoi(jstr);
91         diag("sum = %i\n", sum);
92         diag("iters = %i\n", count_iters());
93         ok1(sum == 100);
94         ok1(count_iters() <= 2 + 5 + 2);
95
96         sum = test_ptr_recursion("0");
97         diag("sum = %i\n", sum);
98         diag("iters = %i\n", count_iters());
99         ok1(sum == 160);
100         ok1(count_iters() <= 2 + 5 + 2);
101         return exit_status();
102 }
103