Added SILC Thread Queue API
[silc.git] / lib / silcutil / tests / test_silcbitops.c
1 /* Bit operation tests */
2
3 #include "silc.h"
4
5 int main(int argc, char **argv)
6 {
7   SilcBool success = FALSE;
8   SILC_BITMAP_DECLARE(bitmap, 500);
9   int size = SILC_BITMAP_SIZE(500), bit;
10
11   if (argc > 1 && !strcmp(argv[1], "-d")) {
12     silc_log_debug(TRUE);
13     silc_log_quick(TRUE);
14     silc_log_debug_hexdump(TRUE);
15     silc_log_set_debug_string("*bit*,*err*");
16   }
17
18   silc_bit_clear_bitmap(bitmap, size);
19
20   SILC_LOG_DEBUG(("Setting bit 0"));
21   if (!silc_bit_set(bitmap, size, 0))
22     goto err;
23   bit = silc_bit_get(bitmap, size, 0);
24   SILC_LOG_DEBUG(("Get bit 0: %d", bit));
25   if (bit < 0)
26     goto err;
27   if (bit != 1)
28     goto err;
29
30   SILC_LOG_DEBUG(("Setting bit 100"));
31   if (!silc_bit_set(bitmap, size, 100))
32     goto err;
33   bit = silc_bit_get(bitmap, size, 100);
34   SILC_LOG_DEBUG(("Get bit 100: %d", bit));
35   if (bit < 0)
36     goto err;
37   if (bit != 1)
38     goto err;
39
40   SILC_LOG_DEBUG(("Clear bit 100"));
41   if (!silc_bit_clear(bitmap, size, 100))
42     goto err;
43   bit = silc_bit_get(bitmap, size, 100);
44   SILC_LOG_DEBUG(("Get bit 100: %d", bit));
45   if (bit < 0)
46     goto err;
47   if (bit != 0)
48     goto err;
49
50   SILC_LOG_DEBUG(("Toggle bit 99"));
51   if (!silc_bit_toggle(bitmap, size, 99))
52     goto err;
53   bit = silc_bit_get(bitmap, size, 99);
54   SILC_LOG_DEBUG(("Get bit 99: %d", bit));
55   if (bit < 0)
56     goto err;
57   if (bit != 1)
58     goto err;
59
60   SILC_LOG_DEBUG(("Test and toggle bit 499"));
61   bit = silc_bit_test_and_toggle(bitmap, size, 499);
62   if (bit != 0)
63     goto err;
64   bit = silc_bit_get(bitmap, size, 499);
65   SILC_LOG_DEBUG(("Get bit 499: %d", bit));
66   if (bit < 0)
67     goto err;
68   if (bit != 1)
69     goto err;
70
71   SILC_LOG_DEBUG(("Test and set bit 10"));
72   bit = silc_bit_test_and_set(bitmap, size, 10);
73   if (bit != 0)
74     goto err;
75   bit = silc_bit_get(bitmap, size, 10);
76   SILC_LOG_DEBUG(("Get bit 10: %d", bit));
77   if (bit < 0)
78     goto err;
79   if (bit != 1)
80     goto err;
81
82   SILC_LOG_DEBUG(("Test overflow"));
83   if (silc_bit_set(bitmap, size, 1500))
84     goto err;
85   if (silc_errno == SILC_ERR_OVERFLOW)
86     SILC_LOG_DEBUG(("Overflow detected"));
87
88   SILC_LOG_DEBUG(("Find first set bit"));
89   bit = silc_bit_ffs(bitmap, size);
90   SILC_LOG_DEBUG(("First set bit: %d", bit));
91   if (bit != 0)
92     goto err;
93
94   SILC_LOG_DEBUG(("Find next set bit"));
95   bit = silc_bit_fns(bitmap, size, bit + 1);
96   SILC_LOG_DEBUG(("Next set bit: %d", bit));
97   if (bit != 10)
98     goto err;
99
100   SILC_LOG_DEBUG(("Find all set bits"));
101   bit = 0;
102   do {
103     bit = silc_bit_fns(bitmap, size, bit);
104     if (bit != -1) {
105       SILC_LOG_DEBUG(("Set bit: %d", bit));
106       bit++;
107     }
108   } while (bit != -1);
109
110   SILC_LOG_DEBUG(("Find first zero bit"));
111   bit = silc_bit_ffz(bitmap, size);
112   SILC_LOG_DEBUG(("First zero bit: %d", bit));
113   if (bit != 1)
114     goto err;
115
116   SILC_LOG_DEBUG(("Find next zero bit"));
117   bit = silc_bit_fnz(bitmap, size, bit + 1);
118   SILC_LOG_DEBUG(("Next zero bit: %d", bit));
119   if (bit != 2)
120     goto err;
121
122   SILC_LOG_DEBUG(("Clear bitmap"));
123   silc_bit_clear_bitmap(bitmap, size);
124
125   SILC_LOG_DEBUG(("Check for set bits"));
126   bit = silc_bit_ffs(bitmap, size);
127   if (bit > 0)
128     goto err;
129   SILC_LOG_DEBUG(("No set bits"));
130
131   success = TRUE;
132
133  err:
134   SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
135   fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
136
137   return success;
138 }