224 lines · cpp
1//===-- Unittests for bitset ----------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/__support/CPP/bitset.h"10#include "test/UnitTest/Test.h"11 12TEST(LlvmLibcBitsetTest, SetBitForSizeEqualToOne) {13 LIBC_NAMESPACE::cpp::bitset<1> bitset;14 EXPECT_FALSE(bitset.test(0));15 bitset.set(0);16 EXPECT_TRUE(bitset.test(0));17}18 19TEST(LlvmLibcBitsetTest, SetsBitsForSizeEqualToTwo) {20 LIBC_NAMESPACE::cpp::bitset<2> bitset;21 bitset.set(0);22 EXPECT_TRUE(bitset.test(0));23 bitset.set(1);24 EXPECT_TRUE(bitset.test(1));25}26 27TEST(LlvmLibcBitsetTest, SetsAllBitsForSizeLessThanEight) {28 LIBC_NAMESPACE::cpp::bitset<7> bitset;29 for (size_t i = 0; i < 7; ++i)30 bitset.set(i);31 // Verify all bits are now set.32 for (size_t j = 0; j < 7; ++j)33 EXPECT_TRUE(bitset.test(j));34}35 36TEST(LlvmLibcBitsetTest, SetsAllBitsForSizeLessThanSixteen) {37 LIBC_NAMESPACE::cpp::bitset<15> bitset;38 for (size_t i = 0; i < 15; ++i)39 bitset.set(i);40 // Verify all bits are now set.41 for (size_t j = 0; j < 15; ++j)42 EXPECT_TRUE(bitset.test(j));43}44 45TEST(LlvmLibcBitsetTest, SetsAllBitsForSizeLessThanThirtyTwo) {46 LIBC_NAMESPACE::cpp::bitset<31> bitset;47 for (size_t i = 0; i < 31; ++i)48 bitset.set(i);49 // Verify all bits are now set.50 for (size_t j = 0; j < 31; ++j)51 EXPECT_TRUE(bitset.test(j));52}53 54TEST(LlvmLibcBitsetTest, DefaultHasNoSetBits) {55 LIBC_NAMESPACE::cpp::bitset<64> bitset;56 for (size_t i = 0; i < 64; ++i) {57 EXPECT_FALSE(bitset.test(i));58 }59 // Same for odd number.60 LIBC_NAMESPACE::cpp::bitset<65> odd_bitset;61 for (size_t i = 0; i < 65; ++i) {62 EXPECT_FALSE(odd_bitset.test(i));63 }64}65 66TEST(LlvmLibcBitsetTest, SettingBitXDoesNotSetBitY) {67 for (size_t i = 0; i < 256; ++i) {68 // Initialize within the loop to start with a fresh bitset.69 LIBC_NAMESPACE::cpp::bitset<256> bitset;70 bitset.set(i);71 72 for (size_t neighbor = 0; neighbor < 256; ++neighbor) {73 if (neighbor == i)74 EXPECT_TRUE(bitset.test(neighbor));75 else76 EXPECT_FALSE(bitset.test(neighbor));77 }78 }79 // Same for odd number.80 for (size_t i = 0; i < 255; ++i) {81 82 LIBC_NAMESPACE::cpp::bitset<255> bitset;83 bitset.set(i);84 85 for (size_t neighbor = 0; neighbor < 255; ++neighbor) {86 if (neighbor == i)87 EXPECT_TRUE(bitset.test(neighbor));88 else89 EXPECT_FALSE(bitset.test(neighbor));90 }91 }92}93 94TEST(LlvmLibcBitsetTest, SettingBitXDoesNotResetBitY) {95 LIBC_NAMESPACE::cpp::bitset<128> bitset;96 for (size_t i = 0; i < 128; ++i)97 bitset.set(i);98 99 // Verify all bits are now set.100 for (size_t j = 0; j < 128; ++j)101 EXPECT_TRUE(bitset.test(j));102}103 104TEST(LlvmLibcBitsetTest, FlipTest) {105 LIBC_NAMESPACE::cpp::bitset<128> bitset;106 107 bitset.flip();108 109 // Verify all bits are now set.110 for (size_t j = 0; j < 128; ++j)111 EXPECT_TRUE(bitset.test(j));112 113 bitset.flip();114 115 // Verify all bits are now unset.116 for (size_t j = 0; j < 128; ++j)117 EXPECT_FALSE(bitset.test(j));118 119 // Set the even bits120 for (size_t j = 0; j < 64; ++j)121 bitset.set(j * 2);122 123 // Verify124 for (size_t j = 0; j < 128; ++j)125 EXPECT_EQ(bitset.test(j), (j % 2) == 0);126 127 bitset.flip();128 129 // Check that the odd set of bits is now true.130 for (size_t j = 0; j < 128; ++j)131 EXPECT_EQ(bitset.test(j), j % 2 != 0);132 133 // Set the first half of the bits.134 for (size_t j = 0; j < 64; ++j)135 bitset.set(j);136 137 // The pattern should now be 111...1110101...010138 139 // Flip to get 000...0001010...101140 bitset.flip();141 142 // Verify that the first half of bits are false and the even bits in the143 // second half are true.144 for (size_t j = 0; j < 128; ++j)145 EXPECT_EQ(bitset.test(j), (j > 63) && (j % 2 == 0));146}147 148TEST(LlvmLibcBitsetTest, EqualTest) {149 LIBC_NAMESPACE::cpp::bitset<128> bitset_a;150 LIBC_NAMESPACE::cpp::bitset<128> bitset_b;151 152 // New sets should be empty, and so they should be equal.153 ASSERT_TRUE(bitset_a == bitset_b);154 155 bitset_a.set(0);156 157 // Setting one bit should be enough.158 ASSERT_FALSE(bitset_a == bitset_b);159 160 bitset_b.set(64);161 162 // Setting the same bit on a different unit shouldn't be equal.163 ASSERT_FALSE(bitset_a == bitset_b);164 165 bitset_b.set(0);166 167 // The first unit matching shouldn't be equal.168 ASSERT_FALSE(bitset_a == bitset_b);169 170 bitset_a.set(64);171 172 // Now they should be equal.173 ASSERT_TRUE(bitset_a == bitset_b);174}175 176TEST(LlvmLibcBitsetTest, SetRangeTest) {177 LIBC_NAMESPACE::cpp::bitset<256> bitset;178 179 // Range from 1 to 1 should only set bit 1180 bitset.set_range(1, 1);181 182 for (size_t j = 0; j < 256; ++j)183 EXPECT_EQ(bitset.test(j), j == 1);184 185 // reset all bits back to 0.186 bitset.reset();187 188 // Range from 2 to 5 should set bits 2-5189 bitset.set_range(2, 5);190 for (size_t j = 0; j < 256; ++j)191 EXPECT_EQ(bitset.test(j), (j >= 2 && j <= 5));192 bitset.reset();193 194 // Check setting exactly one unit195 bitset.set_range(0, 63);196 for (size_t j = 0; j < 256; ++j)197 EXPECT_EQ(bitset.test(j), j <= 63);198 bitset.reset();199 200 // Check ranges across unit boundaries work.201 bitset.set_range(1, 64);202 for (size_t j = 0; j < 256; ++j)203 EXPECT_EQ(bitset.test(j), (j >= 1 && j <= 64));204 bitset.reset();205 206 // Same, but closer together.207 bitset.set_range(63, 64);208 for (size_t j = 0; j < 256; ++j)209 EXPECT_EQ(bitset.test(j), (j >= 63 && j <= 64));210 bitset.reset();211 212 // Check that ranges with a unit in the middle work.213 bitset.set_range(63, 129);214 for (size_t j = 0; j < 256; ++j)215 EXPECT_EQ(bitset.test(j), (j >= 63 && j <= 129));216 bitset.reset();217 218 // Check that the whole range being set works.219 bitset.set_range(0, 255);220 for (size_t j = 0; j < 256; ++j)221 EXPECT_TRUE(bitset.test(j));222 bitset.reset();223}224