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