/* * Copyright (C) 2010 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU General Public License v.2. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "units.h" enum { NR_BITS = 137 }; static struct dm_pool *mem; int bitset_init(void) { mem = dm_pool_create("bitset test", 1024); return mem == NULL; } int bitset_fini(void) { dm_pool_destroy(mem); return 0; } static void test_get_next(void) { int i, j, last = 0, first; dm_bitset_t bs = dm_bitset_create(mem, NR_BITS); for (i = 0; i < NR_BITS; i++) CU_ASSERT(!dm_bit(bs, i)); for (i = 0, j = 1; i < NR_BITS; i += j, j++) dm_bit_set(bs, i); first = 1; for (i = 0, j = 1; i < NR_BITS; i += j, j++) { if (first) { last = dm_bit_get_first(bs); first = 0; } else last = dm_bit_get_next(bs, last); CU_ASSERT(last == i); } CU_ASSERT(dm_bit_get_next(bs, last) == -1); } static void bit_flip(dm_bitset_t bs, int bit) { int old = dm_bit(bs, bit); if (old) dm_bit_clear(bs, bit); else dm_bit_set(bs, bit); } static void test_equal(void) { dm_bitset_t bs1 = dm_bitset_create(mem, NR_BITS); dm_bitset_t bs2 = dm_bitset_create(mem, NR_BITS); int i, j; for (i = 0, j = 1; i < NR_BITS; i += j, j++) { dm_bit_set(bs1, i); dm_bit_set(bs2, i); } CU_ASSERT(dm_bitset_equal(bs1, bs2)); CU_ASSERT(dm_bitset_equal(bs2, bs1)); for (i = 0; i < NR_BITS; i++) { bit_flip(bs1, i); CU_ASSERT(!dm_bitset_equal(bs1, bs2)); CU_ASSERT(!dm_bitset_equal(bs2, bs1)); CU_ASSERT(dm_bitset_equal(bs1, bs1)); /* comparing with self */ bit_flip(bs1, i); } } static void test_and(void) { dm_bitset_t bs1 = dm_bitset_create(mem, NR_BITS); dm_bitset_t bs2 = dm_bitset_create(mem, NR_BITS); dm_bitset_t bs3 = dm_bitset_create(mem, NR_BITS); int i, j; for (i = 0, j = 1; i < NR_BITS; i += j, j++) { dm_bit_set(bs1, i); dm_bit_set(bs2, i); } dm_bit_and(bs3, bs1, bs2); CU_ASSERT(dm_bitset_equal(bs1, bs2)); CU_ASSERT(dm_bitset_equal(bs1, bs3)); CU_ASSERT(dm_bitset_equal(bs2, bs3)); dm_bit_clear_all(bs1); dm_bit_clear_all(bs2); for (i = 0; i < NR_BITS; i++) { if (i % 2) dm_bit_set(bs1, i); else dm_bit_set(bs2, i); } dm_bit_and(bs3, bs1, bs2); for (i = 0; i < NR_BITS; i++) CU_ASSERT(!dm_bit(bs3, i)); } CU_TestInfo bitset_list[] = { { (char*)"get_next", test_get_next }, { (char*)"equal", test_equal }, { (char*)"and", test_and }, CU_TEST_INFO_NULL };