Annotation of embedaddon/bird2/lib/bitops_test.c, revision 1.1.1.1
1.1 misho 1: /*
2: * BIRD Library -- Generic Bit Operations Tests
3: *
4: * (c) 2015 CZ.NIC z.s.p.o.
5: *
6: * Can be freely distributed and used under the terms of the GNU GPL.
7: */
8:
9: #include "test/birdtest.h"
10: #include "test/bt-utils.h" /* naive_pow() */
11:
12: #include "lib/bitops.h"
13:
14: #define MAX_NUM 1000
15: #define CHECK_BIT(var,pos) ((var) & (u32)(1<<(pos)))
16:
17: static int
18: t_mkmask(void)
19: {
20: int i;
21: u32 compute, expect;
22:
23: bt_assert(u32_mkmask(0) == 0x00000000);
24: for (i = 1; i <= 32; i++)
25: {
26: compute = u32_mkmask(i);
27: expect = (u32) (0xffffffff << (32-i));
28: bt_assert_msg(compute == expect, "u32_mkmask(%d) = 0x%08X, expected 0x%08X", i, compute, expect);
29: }
30:
31: return 1;
32: }
33:
34: static int
35: u32_masklen_expected(u32 mask)
36: {
37: int j, expect = 0;
38:
39: int valid = 0;
40: for (j = 0; j <= 32; j++)
41: if (mask == (j ? (0xffffffff << (32-j)) : 0)) /* Shifting 32-bit value by 32 bits is undefined behavior */
42: valid = 1;
43:
44: if (!valid && mask != 0)
45: expect = 255;
46: else
47: for (j = 0; j <= 31; j++)
48: if (CHECK_BIT(mask, (31-j)))
49: expect = j+1;
50: else
51: break;
52: return expect;
53: }
54:
55: static void
56: check_mask(u32 mask)
57: {
58: int expected, masklen;
59:
60: expected = u32_masklen_expected(mask);
61: masklen = u32_masklen(mask);
62: int ok = (expected == masklen);
63: bt_debug("u32_masklen(Ox%08x) = %d, expected %d %s\n", mask, masklen, expected, ok ? "OK" : "FAIL!");
64: bt_assert(ok);
65: }
66:
67: static int
68: t_masklen(void)
69: {
70: u32 i;
71:
72: check_mask(0x82828282);
73: check_mask(0x00000000);
74:
75: for (i = 0; i <= 32; i++)
76: check_mask(((u32) (i ? (0xffffffff << (32-i)) : 0)) & 0xffffffff); /* Shifting 32-bit value by 32 bits is undefined behavior */
77:
78: for (i = 0; i <= MAX_NUM; i++)
79: check_mask(bt_random());
80:
81: return 1;
82: }
83:
84: static void
85: check_log2(u32 n)
86: {
87: u32 log = u32_log2(n);
88: u32 low = bt_naive_pow(2, log);
89: u32 high = bt_naive_pow(2, log+1);
90:
91: bt_assert_msg(n >= low && n < high,
92: "u32_log2(%u) = %u, %u should be in the range <%u, %u)",
93: n, log, n, low, high);
94: }
95:
96: static int
97: t_log2(void)
98: {
99: u32 i;
100:
101: for (i = 0; i < 31; i++)
102: bt_assert(u32_log2(bt_naive_pow(2, i+1)) == i+1);
103:
104: for (i = 1; i < MAX_NUM; i++)
105: check_log2(i);
106:
107: for (i = 1; i < MAX_NUM; i++)
108: check_log2(((u32) bt_random()) % 0x0fffffff);
109:
110: return 1;
111: }
112:
113: int
114: main(int argc, char *argv[])
115: {
116: bt_init(argc, argv);
117:
118: bt_test_suite(t_mkmask, "u32_mkmask()");
119: bt_test_suite(t_masklen, "u32_masklen()");
120: bt_test_suite(t_log2, "u32_log2()");
121:
122: return bt_exit_value();
123: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>