blob: 12d5fcf01571f2d8d920b085b3207c8db4674f1f [file] [log] [blame]
#include <gtest/gtest.h>
#include <c10/util/Bitset.h>
using c10::utils::bitset;
TEST(BitsetTest, givenEmptyBitset_whenGettingBit_thenIsZero) {
bitset b;
for (size_t i = 0; i < bitset::NUM_BITS(); ++i) {
EXPECT_FALSE(b.get(i));
}
}
TEST(BitsetTest, givenEmptyBitset_whenUnsettingBit_thenIsZero) {
bitset b;
b.unset(4);
for (size_t i = 0; i < bitset::NUM_BITS(); ++i) {
EXPECT_FALSE(b.get(i));
}
}
TEST(BitsetTest, givenEmptyBitset_whenSettingAndUnsettingBit_thenIsZero) {
bitset b;
b.set(4);
b.unset(4);
for (size_t i = 0; i < bitset::NUM_BITS(); ++i) {
EXPECT_FALSE(b.get(i));
}
}
TEST(BitsetTest, givenEmptyBitset_whenSettingBit_thenIsSet) {
bitset b;
b.set(6);
EXPECT_TRUE(b.get(6));
}
TEST(BitsetTest, givenEmptyBitset_whenSettingBit_thenOthersStayUnset) {
bitset b;
b.set(6);
for (size_t i = 0; i < 6; ++i) {
EXPECT_FALSE(b.get(i));
}
for (size_t i = 7; i < bitset::NUM_BITS(); ++i) {
EXPECT_FALSE(b.get(i));
}
}
TEST(BitsetTest, givenNonemptyBitset_whenSettingBit_thenIsSet) {
bitset b;
b.set(6);
b.set(30);
EXPECT_TRUE(b.get(30));
}
TEST(BitsetTest, givenNonemptyBitset_whenSettingBit_thenOthersStayAtOldValue) {
bitset b;
b.set(6);
b.set(30);
for (size_t i = 0; i < 6; ++i) {
EXPECT_FALSE(b.get(i));
}
for (size_t i = 7; i < 30; ++i) {
EXPECT_FALSE(b.get(i));
}
for (size_t i = 31; i < bitset::NUM_BITS(); ++i) {
EXPECT_FALSE(b.get(i));
}
}
TEST(BitsetTest, givenNonemptyBitset_whenUnsettingBit_thenIsUnset) {
bitset b;
b.set(6);
b.set(30);
b.unset(6);
EXPECT_FALSE(b.get(6));
}
TEST(
BitsetTest,
givenNonemptyBitset_whenUnsettingBit_thenOthersStayAtOldValue) {
bitset b;
b.set(6);
b.set(30);
b.unset(6);
for (size_t i = 0; i < 30; ++i) {
EXPECT_FALSE(b.get(i));
}
EXPECT_TRUE(b.get(30));
for (size_t i = 31; i < bitset::NUM_BITS(); ++i) {
EXPECT_FALSE(b.get(i));
}
}
struct IndexCallbackMock final {
std::vector<size_t> called_for_indices;
void operator()(size_t index) {
called_for_indices.push_back(index);
}
void expect_was_called_for_indices(std::vector<size_t> expected_indices) {
EXPECT_EQ(expected_indices.size(), called_for_indices.size());
for (size_t i = 0; i < expected_indices.size(); ++i) {
EXPECT_EQ(expected_indices[i], called_for_indices[i]);
}
}
};
TEST(BitsetTest, givenEmptyBitset_whenCallingForEachBit_thenDoesntCall) {
IndexCallbackMock callback;
bitset b;
b.for_each_set_bit(callback);
callback.expect_was_called_for_indices({});
}
TEST(
BitsetTest,
givenBitsetWithOneBitSet_whenCallingForEachBit_thenCallsForEachBit) {
IndexCallbackMock callback;
bitset b;
b.set(5);
b.for_each_set_bit(callback);
callback.expect_was_called_for_indices({5});
}
TEST(
BitsetTest,
givenBitsetWithMultipleBitsSet_whenCallingForEachBit_thenCallsForEachBit) {
IndexCallbackMock callback;
bitset b;
b.set(5);
b.set(2);
b.set(25);
b.set(32);
b.set(50);
b.set(0);
b.unset(25);
b.set(10);
b.for_each_set_bit(callback);
callback.expect_was_called_for_indices({0, 2, 5, 10, 32, 50});
}