| //===-- Unittests for bitset ----------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "src/__support/CPP/bitset.h" |
| #include "test/UnitTest/Test.h" |
| |
| TEST(LlvmLibcBitsetTest, SetBitForSizeEqualToOne) { |
| LIBC_NAMESPACE::cpp::bitset<1> bitset; |
| EXPECT_FALSE(bitset.test(0)); |
| bitset.set(0); |
| EXPECT_TRUE(bitset.test(0)); |
| } |
| |
| TEST(LlvmLibcBitsetTest, SetsBitsForSizeEqualToTwo) { |
| LIBC_NAMESPACE::cpp::bitset<2> bitset; |
| bitset.set(0); |
| EXPECT_TRUE(bitset.test(0)); |
| bitset.set(1); |
| EXPECT_TRUE(bitset.test(1)); |
| } |
| |
| TEST(LlvmLibcBitsetTest, SetsAllBitsForSizeLessThanEight) { |
| LIBC_NAMESPACE::cpp::bitset<7> bitset; |
| for (size_t i = 0; i < 7; ++i) |
| bitset.set(i); |
| // Verify all bits are now set. |
| for (size_t j = 0; j < 7; ++j) |
| EXPECT_TRUE(bitset.test(j)); |
| } |
| |
| TEST(LlvmLibcBitsetTest, SetsAllBitsForSizeLessThanSixteen) { |
| LIBC_NAMESPACE::cpp::bitset<15> bitset; |
| for (size_t i = 0; i < 15; ++i) |
| bitset.set(i); |
| // Verify all bits are now set. |
| for (size_t j = 0; j < 15; ++j) |
| EXPECT_TRUE(bitset.test(j)); |
| } |
| |
| TEST(LlvmLibcBitsetTest, SetsAllBitsForSizeLessThanThirtyTwo) { |
| LIBC_NAMESPACE::cpp::bitset<31> bitset; |
| for (size_t i = 0; i < 31; ++i) |
| bitset.set(i); |
| // Verify all bits are now set. |
| for (size_t j = 0; j < 31; ++j) |
| EXPECT_TRUE(bitset.test(j)); |
| } |
| |
| TEST(LlvmLibcBitsetTest, DefaultHasNoSetBits) { |
| LIBC_NAMESPACE::cpp::bitset<64> bitset; |
| for (size_t i = 0; i < 64; ++i) { |
| EXPECT_FALSE(bitset.test(i)); |
| } |
| // Same for odd number. |
| LIBC_NAMESPACE::cpp::bitset<65> odd_bitset; |
| for (size_t i = 0; i < 65; ++i) { |
| EXPECT_FALSE(odd_bitset.test(i)); |
| } |
| } |
| |
| TEST(LlvmLibcBitsetTest, SettingBitXDoesNotSetBitY) { |
| for (size_t i = 0; i < 256; ++i) { |
| // Initialize within the loop to start with a fresh bitset. |
| LIBC_NAMESPACE::cpp::bitset<256> bitset; |
| bitset.set(i); |
| |
| for (size_t neighbor = 0; neighbor < 256; ++neighbor) { |
| if (neighbor == i) |
| EXPECT_TRUE(bitset.test(neighbor)); |
| else |
| EXPECT_FALSE(bitset.test(neighbor)); |
| } |
| } |
| // Same for odd number. |
| for (size_t i = 0; i < 255; ++i) { |
| |
| LIBC_NAMESPACE::cpp::bitset<255> bitset; |
| bitset.set(i); |
| |
| for (size_t neighbor = 0; neighbor < 255; ++neighbor) { |
| if (neighbor == i) |
| EXPECT_TRUE(bitset.test(neighbor)); |
| else |
| EXPECT_FALSE(bitset.test(neighbor)); |
| } |
| } |
| } |
| |
| TEST(LlvmLibcBitsetTest, SettingBitXDoesNotResetBitY) { |
| LIBC_NAMESPACE::cpp::bitset<128> bitset; |
| for (size_t i = 0; i < 128; ++i) |
| bitset.set(i); |
| |
| // Verify all bits are now set. |
| for (size_t j = 0; j < 128; ++j) |
| EXPECT_TRUE(bitset.test(j)); |
| } |
| |
| TEST(LlvmLibcBitsetTest, FlipTest) { |
| LIBC_NAMESPACE::cpp::bitset<128> bitset; |
| |
| bitset.flip(); |
| |
| // Verify all bits are now set. |
| for (size_t j = 0; j < 128; ++j) |
| EXPECT_TRUE(bitset.test(j)); |
| |
| bitset.flip(); |
| |
| // Verify all bits are now unset. |
| for (size_t j = 0; j < 128; ++j) |
| EXPECT_FALSE(bitset.test(j)); |
| |
| // Set the even bits |
| for (size_t j = 0; j < 64; ++j) |
| bitset.set(j * 2); |
| |
| // Verify |
| for (size_t j = 0; j < 128; ++j) |
| EXPECT_EQ(bitset.test(j), (j % 2) == 0); |
| |
| bitset.flip(); |
| |
| // Check that the odd set of bits is now true. |
| for (size_t j = 0; j < 128; ++j) |
| EXPECT_EQ(bitset.test(j), j % 2 != 0); |
| |
| // Set the first half of the bits. |
| for (size_t j = 0; j < 64; ++j) |
| bitset.set(j); |
| |
| // The pattern should now be 111...1110101...010 |
| |
| // Flip to get 000...0001010...101 |
| bitset.flip(); |
| |
| // Verify that the first half of bits are false and the even bits in the |
| // second half are true. |
| for (size_t j = 0; j < 128; ++j) |
| EXPECT_EQ(bitset.test(j), (j > 63) && (j % 2 == 0)); |
| } |
| |
| TEST(LlvmLibcBitsetTest, EqualTest) { |
| LIBC_NAMESPACE::cpp::bitset<128> bitset_a; |
| LIBC_NAMESPACE::cpp::bitset<128> bitset_b; |
| |
| // New sets should be empty, and so they should be equal. |
| ASSERT_TRUE(bitset_a == bitset_b); |
| |
| bitset_a.set(0); |
| |
| // Setting one bit should be enough. |
| ASSERT_FALSE(bitset_a == bitset_b); |
| |
| bitset_b.set(64); |
| |
| // Setting the same bit on a different unit shouldn't be equal. |
| ASSERT_FALSE(bitset_a == bitset_b); |
| |
| bitset_b.set(0); |
| |
| // The first unit matching shouldn't be equal. |
| ASSERT_FALSE(bitset_a == bitset_b); |
| |
| bitset_a.set(64); |
| |
| // Now they should be equal. |
| ASSERT_TRUE(bitset_a == bitset_b); |
| } |
| |
| TEST(LlvmLibcBitsetTest, SetRangeTest) { |
| LIBC_NAMESPACE::cpp::bitset<256> bitset; |
| |
| // Range from 1 to 1 should only set bit 1 |
| bitset.set_range(1, 1); |
| |
| for (size_t j = 0; j < 256; ++j) |
| EXPECT_EQ(bitset.test(j), j == 1); |
| |
| // reset all bits back to 0. |
| bitset.reset(); |
| |
| // Range from 2 to 5 should set bits 2-5 |
| bitset.set_range(2, 5); |
| for (size_t j = 0; j < 256; ++j) |
| EXPECT_EQ(bitset.test(j), (j >= 2 && j <= 5)); |
| bitset.reset(); |
| |
| // Check setting exactly one unit |
| bitset.set_range(0, 63); |
| for (size_t j = 0; j < 256; ++j) |
| EXPECT_EQ(bitset.test(j), j <= 63); |
| bitset.reset(); |
| |
| // Check ranges across unit boundaries work. |
| bitset.set_range(1, 64); |
| for (size_t j = 0; j < 256; ++j) |
| EXPECT_EQ(bitset.test(j), (j >= 1 && j <= 64)); |
| bitset.reset(); |
| |
| // Same, but closer together. |
| bitset.set_range(63, 64); |
| for (size_t j = 0; j < 256; ++j) |
| EXPECT_EQ(bitset.test(j), (j >= 63 && j <= 64)); |
| bitset.reset(); |
| |
| // Check that ranges with a unit in the middle work. |
| bitset.set_range(63, 129); |
| for (size_t j = 0; j < 256; ++j) |
| EXPECT_EQ(bitset.test(j), (j >= 63 && j <= 129)); |
| bitset.reset(); |
| |
| // Check that the whole range being set works. |
| bitset.set_range(0, 255); |
| for (size_t j = 0; j < 256; ++j) |
| EXPECT_TRUE(bitset.test(j)); |
| bitset.reset(); |
| } |