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>