test-bits.c revision cbc01fc844fa307e565cc81fd78536d7afca05a9
9fe07780492524a34423686794bc1b4061206246Phil Carmody/* Copyright (c) 2001-2014 Dovecot authors, see the included COPYING file */
9fe07780492524a34423686794bc1b4061206246Phil Carmody/* Unit tests for bit twiddles library */
9fe07780492524a34423686794bc1b4061206246Phil Carmody/* nearest_power(0) = error bits_requiredXX(0) = 0
9fe07780492524a34423686794bc1b4061206246Phil Carmody nearest_power(1) = 1 = 1<<0 bits_requiredXX(1) = 1
9fe07780492524a34423686794bc1b4061206246Phil Carmody nearest_power(2) = 2 = 1<<1 bits_requiredXX(2) = 2
9fe07780492524a34423686794bc1b4061206246Phil Carmody nearest_power(3) = 4 = 1<<2 bits_requiredXX(3) = 2
9fe07780492524a34423686794bc1b4061206246Phil Carmody nearest_power(4) = 4 = 1<<2 bits_requiredXX(4) = 3
9fe07780492524a34423686794bc1b4061206246Phil Carmody nearest_power(5) = 8 = 1<<3 bits_requiredXX(5) = 3
9fe07780492524a34423686794bc1b4061206246Phil Carmody nearest_power(7) = 8 = 1<<3 bits_requiredXX(7) = 3
9fe07780492524a34423686794bc1b4061206246Phil Carmody nearest_power(8) = 8 = 1<<3 bits_requiredXX(8) = 4
9fe07780492524a34423686794bc1b4061206246Phil Carmody/* nearest_power(num) == 1ULL << bits_required64(num-1) */
9fe07780492524a34423686794bc1b4061206246Phil Carmodystatic void test_nearest_power(void)
9fe07780492524a34423686794bc1b4061206246Phil Carmody unsigned int b;
147dbf5e74344caf9baf4048999ce0e5419f9e51Phil Carmody for (b = 2; b < CHAR_BIT*sizeof(size_t) - 1; ++b) {
147dbf5e74344caf9baf4048999ce0e5419f9e51Phil Carmody /* b=2 tests 3,4,5; b=3 tests 7,8,9; ... b=30 tests ~1G */
9fe07780492524a34423686794bc1b4061206246Phil Carmody test_assert_idx(nearest_power(num-1) == num, b);
9fe07780492524a34423686794bc1b4061206246Phil Carmody test_assert_idx(nearest_power(num ) == num, b);
9fe07780492524a34423686794bc1b4061206246Phil Carmody test_assert_idx(nearest_power(num+1) == num<<1, b);
147dbf5e74344caf9baf4048999ce0e5419f9e51Phil Carmody /* With 32-bit size_t, now: b=31 tests 2G-1, 2G, not 2G+1. */
147dbf5e74344caf9baf4048999ce0e5419f9e51Phil Carmody test_assert_idx(nearest_power(num-1) == num, b);
147dbf5e74344caf9baf4048999ce0e5419f9e51Phil Carmody test_assert_idx(nearest_power(num ) == num, b);
147dbf5e74344caf9baf4048999ce0e5419f9e51Phil Carmody /* i_assert()s: test_assert_idx(nearest_power(num+1) == num<<1, b); */
9fe07780492524a34423686794bc1b4061206246Phil Carmodystatic void test_bits_requiredXX(void)
9fe07780492524a34423686794bc1b4061206246Phil Carmody /* As ..64 depends on ..32 and tests it twice,
9fe07780492524a34423686794bc1b4061206246Phil Carmody * and ..32 depends on ..16 and tests it twice,
9fe07780492524a34423686794bc1b4061206246Phil Carmody * etc., we only test ..64
9fe07780492524a34423686794bc1b4061206246Phil Carmody unsigned int b;
9fe07780492524a34423686794bc1b4061206246Phil Carmody /* b=2 tests 3,4,5; b=3 tests 7,8,9; ... */
9fe07780492524a34423686794bc1b4061206246Phil Carmody test_assert_idx(bits_required64(num-1) == b, b);
9fe07780492524a34423686794bc1b4061206246Phil Carmody test_assert_idx(bits_required64(num ) == b+1, b);
9fe07780492524a34423686794bc1b4061206246Phil Carmody test_assert_idx(bits_required64(num+1) == b+1, b);
cbc01fc844fa307e565cc81fd78536d7afca05a9Timo Sirainenstatic void test_sum_overflows(void)
cbc01fc844fa307e565cc81fd78536d7afca05a9Timo Sirainen static const struct {
cbc01fc844fa307e565cc81fd78536d7afca05a9Timo Sirainen unsigned int i;