You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
srsRAN_4G/lib/test/adt/bounded_bitset_test.cc

199 lines
5.3 KiB
C++

/**
* Copyright 2013-2021 Software Radio Systems Limited
*
* This file is part of srsLTE.
*
* srsLTE is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* srsLTE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* A copy of the GNU Affero General Public License can be found in
* the LICENSE file in the top-level directory of this distribution
* and at http://www.gnu.org/licenses/.
*
*/
#include "srsran/adt/bounded_bitset.h"
#include "srsran/common/test_common.h"
int test_zero_bitset()
{
srsran::bounded_bitset<25> mask;
srsran::bounded_bitset<25> mask2{23};
TESTASSERT(mask.max_size() == 25);
TESTASSERT(mask.size() == 0);
TESTASSERT(mask.count() == 0);
TESTASSERT(mask.none());
TESTASSERT(not mask.any());
TESTASSERT(mask.all());
TESTASSERT(mask != mask2);
TESTASSERT(mask2.max_size() == 25);
TESTASSERT(mask2.size() == 23);
TESTASSERT(mask2.count() == 0);
TESTASSERT(mask2.none());
TESTASSERT(not mask2.any());
TESTASSERT(not mask2.all());
mask = mask2;
TESTASSERT(mask == mask2);
return SRSRAN_SUCCESS;
}
int test_ones_bitset()
{
srsran::bounded_bitset<25> mask;
// Flipping empty bitset is noop
TESTASSERT(mask.none() and mask.all() and not mask.any());
mask.flip();
TESTASSERT(mask.none() and mask.all() and not mask.any());
// Flipping zeros bitset with size>0 will set all bits to one
mask.resize(23);
TESTASSERT(mask.none() and not mask.all() and not mask.any());
mask.flip();
TESTASSERT(not mask.none() and mask.all() and mask.any());
return SRSRAN_SUCCESS;
}
int test_bitset_set()
{
srsran::bounded_bitset<25> mask{23};
mask.set(10);
TESTASSERT(mask.any());
TESTASSERT(not mask.all());
TESTASSERT(not mask.test(0));
TESTASSERT(mask.test(10));
mask.flip();
TESTASSERT(not mask.test(10));
TESTASSERT(mask.test(0));
return SRSRAN_SUCCESS;
}
int test_bitset_bitwise_oper()
{
srsran::bounded_bitset<25> mask{23};
srsran::bounded_bitset<25> mask2{23};
mask.set(10);
TESTASSERT(mask != mask2);
mask2 |= mask;
TESTASSERT(mask == mask2);
mask.set(11);
mask2 &= mask;
TESTASSERT(mask != mask2);
TESTASSERT(mask2.test(10) and not mask2.test(11));
#if EXCEPTIONS_ENABLED
bool caught = false;
mask2.resize(24);
try {
mask2 |= mask;
} catch (srsran::bad_type_access& c) {
printf("Received exception \"%s\" (as expected)\n", c.what());
caught = true;
}
TESTASSERT(caught);
#endif
return SRSRAN_SUCCESS;
}
int test_bitset_print()
{
{
srsran::bounded_bitset<100> bitset(100);
bitset.set(0);
bitset.set(5);
TESTASSERT(fmt::format("{:x}", bitset) == "0000000000000000000000021");
TESTASSERT(fmt::format("{:b}", bitset) ==
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100001");
bitset.set(99);
TESTASSERT(fmt::format("{:x}", bitset) == "8000000000000000000000021");
TESTASSERT(fmt::format("{:b}", bitset) ==
"1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100001");
}
{
srsran::bounded_bitset<100> bitset(25);
bitset.set(0);
bitset.set(4);
TESTASSERT(fmt::format("{:x}", bitset) == "0000011");
TESTASSERT(fmt::format("{:b}", bitset) == "0000000000000000000010001");
bitset.set(24);
TESTASSERT(fmt::format("{:x}", bitset) == "1000011");
TESTASSERT(fmt::format("{:b}", bitset) == "1000000000000000000010001");
}
return SRSRAN_SUCCESS;
}
int test_bitset_resize()
{
{
srsran::bounded_bitset<100> bitset;
TESTASSERT(bitset.none() and bitset.size() == 0);
bitset.resize(100);
TESTASSERT(bitset.none() and bitset.size() == 100);
bitset.fill(0, 100);
TESTASSERT(bitset.all() and bitset.size() == 100);
bitset.resize(25);
TESTASSERT(bitset.to_uint64() == 0x1ffffff);
TESTASSERT(bitset.all() and bitset.size() == 25); // keeps the data it had for the non-erased bits
bitset.resize(100);
TESTASSERT(bitset.count() == 25 and bitset.size() == 100);
}
{
// TEST: Reverse case
srsran::bounded_bitset<100, true> bitset;
TESTASSERT(bitset.none() and bitset.size() == 0);
bitset.resize(100);
TESTASSERT(bitset.none() and bitset.size() == 100);
bitset.fill(0, 100);
TESTASSERT(bitset.all() and bitset.size() == 100);
bitset.resize(25);
TESTASSERT(bitset.to_uint64() == 0x1ffffff);
TESTASSERT(bitset.all() and bitset.size() == 25); // keeps the data it had for the non-erased bits
bitset.resize(100);
TESTASSERT(bitset.count() == 25 and bitset.size() == 100);
}
return SRSRAN_SUCCESS;
}
int main()
{
TESTASSERT(test_zero_bitset() == SRSRAN_SUCCESS);
TESTASSERT(test_ones_bitset() == SRSRAN_SUCCESS);
TESTASSERT(test_bitset_set() == SRSRAN_SUCCESS);
TESTASSERT(test_bitset_bitwise_oper() == SRSRAN_SUCCESS);
TESTASSERT(test_bitset_print() == SRSRAN_SUCCESS);
TESTASSERT(test_bitset_resize() == SRSRAN_SUCCESS);
printf("Success\n");
return 0;
}