]> git.ozlabs.org Git - ccan/blob - ccan/foreach/test/run-nested.c
0bb21c980057d29af5ac34680a15ca1cbf39f83d
[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, max_iters = 0 /* keep gcc happy */;
48         const char *istr, *jstr;
49
50         plan_tests(13);
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 = 0;
72         foreach_ptr(istr, "0", "1", "2", "3", "4")
73                 foreach_ptr(jstr, "0", "1", "2", "3", "4")
74                         sum += atoi(istr)*atoi(jstr);
75         diag("sum = %i\n", sum);
76         diag("iters = %i\n", count_iters());
77         ok1(sum == 100);
78         ok1(count_iters() <= 2 + 2);
79
80         /* Same again... reusing iterators. */
81         sum = 0;
82         foreach_ptr(istr, "0", "1", "2", "3", "4")
83                 foreach_ptr(jstr, "0", "1", "2", "3", "4")
84                         sum += atoi(istr)*atoi(jstr);
85         diag("sum = %i\n", sum);
86         diag("iters = %i\n", count_iters());
87         ok1(sum == 100);
88         ok1(count_iters() <= 2 + 2);
89
90         /* Do this twice, second time shouldn't increase iterators. */
91         for (i = 0; i < 2; i++) {
92                 sum = test_int_recursion(0);
93                 diag("sum = %i\n", sum);
94                 diag("iters = %i\n", count_iters());
95                 ok1(sum == 160);
96
97                 sum = test_ptr_recursion("0");
98                 diag("sum = %i\n", sum);
99                 diag("iters = %i\n", count_iters());
100                 ok1(sum == 160);
101                 if (i == 0)
102                         max_iters = count_iters();
103                 else
104                         ok1(count_iters() <= max_iters);
105         }
106         return exit_status();
107 }
108