]> git.ozlabs.org Git - ccan/blob - ccan/generator/test/api.c
str/base32: new module.
[ccan] / ccan / generator / test / api.c
1 #include <ccan/generator/generator.h>
2 #include <ccan/tap/tap.h>
3 #include <ccan/str/str.h>
4
5 #include "example-gens.h"
6
7 generator_def_static(genx, const char *)
8 {
9         generator_yield("one");
10         generator_yield("two");
11         generator_yield("three");
12         generator_yield("four");
13 }
14
15 static void test1(void)
16 {
17         generator_t(int) state1 = gen1();
18         int *ret;
19
20         ok1((ret = generator_next(state1)) != NULL);
21         ok1(*ret == 1);
22         ok1((ret = generator_next(state1)) != NULL);
23         ok1(*ret == 3);
24         ok1((ret = generator_next(state1)) != NULL);
25         ok1(*ret == 17);
26         ok1((ret = generator_next(state1)) == NULL);
27
28         /* Test that things don't go bad if we try to invoke an
29          * already completed generator */
30         ok1((ret = generator_next(state1)) == NULL);
31
32         generator_free(state1);
33 }
34
35 static void test2(void)
36 {
37         generator_t(int) state2 = gen2(100);
38         int *ret;
39
40         ok1((ret = generator_next(state2)) != NULL);
41         ok1(*ret == 101);
42         ok1((ret = generator_next(state2)) != NULL);
43         ok1(*ret == 103);
44         ok1((ret = generator_next(state2)) != NULL);
45         ok1(*ret == 117);
46         ok1((ret = generator_next(state2)) == NULL);
47
48         generator_free(state2);
49 }
50
51 static void test3(void)
52 {
53         int i;
54
55         for (i = 0; i < 4; i++) {
56                 generator_t(const char *) state3 = gen3("test", i);
57                 const char *s;
58                 int j;
59
60                 for (j = 0; j < i; j++) {
61                         ok1(generator_next_val(s, state3));
62                         ok1(streq(s, "test"));
63                 }
64                 ok1(!generator_next_val(s, state3));
65                 generator_free(state3);
66         }
67 }
68
69 static void testx(void)
70 {
71         generator_t(const char *) statex = genx();
72         const char *val;
73
74         ok1(generator_next_val(val, statex));
75         ok1(streq(val, "one"));
76         ok1(generator_next_val(val, statex));
77         ok1(streq(val, "two"));
78         ok1(generator_next_val(val, statex));
79         ok1(streq(val, "three"));
80         ok1(generator_next_val(val, statex));
81         ok1(streq(val, "four"));
82         ok1(!generator_next_val(val, statex));
83         generator_free(statex);
84 }
85
86 int main(void)
87 {
88         /* This is how many tests you plan to run */
89         plan_tests(8 + 7 + 16 + 9);
90
91         test1();
92         test2();
93         test3();
94         testx();
95
96         /* This exits depending on whether all tests passed */
97         return exit_status();
98 }