timer: change to use time_mono (api break!)
[ccan] / ccan / timer / test / run-add.c
1 #include <ccan/timer/timer.h>
2 /* Include the C files directly. */
3 #include <ccan/timer/timer.c>
4 #include <ccan/tap/tap.h>
5
6 /* More than 32 bits */
7 #define MAX_ORD 34
8
9 /* 0...17, 63, 64, 65, 127, 128, 129, 255, 256, 257, ... */
10 static uint64_t next(uint64_t base)
11 {
12         if (base > 16 && ((base - 1) & ((base - 1) >> 1)) == 0)
13                 return base * 2 - 3;
14         return base+1;
15 }
16
17 int main(void)
18 {
19         struct timers timers;
20         struct timer t;
21         uint64_t diff;
22         unsigned int i;
23         struct timemono epoch = { { 0, 0 } };
24
25         /* This is how many tests you plan to run */
26         plan_tests(2 + (18 + (MAX_ORD - 4) * 3) * (18 + (MAX_ORD - 4) * 3));
27
28         timers_init(&timers, epoch);
29         ok1(timers_check(&timers, NULL));
30
31         for (i = 0; i < 4; i++)
32                 add_level(&timers, i);
33
34         i = 0;
35         timer_init(&t);
36         for (diff = 0; diff < (1ULL << MAX_ORD)+2; diff = next(diff)) {
37                 i++;
38                 for (timers.base = 0;
39                      timers.base < (1ULL << MAX_ORD)+2;
40                      timers.base = next(timers.base)) {
41                         timer_addmono(&timers, &t, grains_to_time(timers.base + diff));
42                         ok1(timers_check(&timers, NULL));
43                         timer_del(&timers, &t);
44                 }
45         }
46
47         ok1(timers_check(&timers, NULL));
48
49         timers_cleanup(&timers);
50
51         /* This exits depending on whether all tests passed */
52         return exit_status();
53 }