00001
00002
00003
00004
00005
00006 #include <boost/test/auto_unit_test.hpp>
00007
00008 #include "Bitset.hpp"
00009
00010 using namespace benzene;
00011
00012
00013
00014 namespace {
00015
00016 BOOST_AUTO_TEST_CASE(Bitset_Basics)
00017 {
00018
00019
00020
00021 bitset_t b1, b2;
00022 BOOST_REQUIRE(BITSETSIZE > 1);
00023 BOOST_CHECK_EQUAL(b1.count(), 0u);
00024 b1.flip();
00025 BOOST_CHECK_EQUAL(b1.count(), (std::size_t)BITSETSIZE);
00026 BOOST_CHECK(b1.test(0));
00027 BOOST_CHECK(b1.test(BITSETSIZE-1));
00028 BOOST_CHECK(!b2.test(0));
00029 BOOST_CHECK(!b2.test(BITSETSIZE-1));
00030 BOOST_CHECK(!b2.any());
00031 BOOST_CHECK(b2.none());
00032 BOOST_CHECK_EQUAL(b1.size(), (std::size_t)BITSETSIZE);
00033 BOOST_CHECK(!b1.none());
00034 b1.reset();
00035 BOOST_CHECK(b1.none());
00036 b1.set(0);
00037 BOOST_CHECK_EQUAL(b1.count(), 1u);
00038 b2.set(1);
00039 BOOST_CHECK_EQUAL(b2.count(), 1u);
00040 b2 |= b1;
00041 BOOST_CHECK_EQUAL(b2.count(), 2u);
00042 b1 ^= b2;
00043 BOOST_CHECK_EQUAL(b1.count(), 1u);
00044 BOOST_CHECK(!b1.test(0));
00045 BOOST_CHECK(b1.test(1));
00046 BOOST_CHECK(b2.test(0));
00047 BOOST_CHECK(b2.test(1));
00048 b2 &= b1;
00049 BOOST_CHECK_EQUAL(b1, b2);
00050 b1 ^= b2;
00051 BOOST_CHECK(b1.none());
00052 }
00053
00054 BOOST_AUTO_TEST_CASE(Bitset_ConversionToBytes)
00055 {
00056 bitset_t b1, b2;
00057 byte byteArray[8];
00058 BOOST_REQUIRE(BITSETSIZE >= 64);
00059 int numBits = 64;
00060 BitsetUtil::BitsetToBytes(b1, byteArray, numBits);
00061 b2 = BitsetUtil::BytesToBitset(byteArray, numBits);
00062 BOOST_CHECK_EQUAL(b1, b2);
00063 BOOST_CHECK_EQUAL(byteArray[0], 0);
00064 BOOST_CHECK_EQUAL(byteArray[1], 0);
00065 b1.set(0);
00066 b1.set(3);
00067 BitsetUtil::BitsetToBytes(b1, byteArray, numBits);
00068 b2 = BitsetUtil::BytesToBitset(byteArray, numBits);
00069 BOOST_CHECK_EQUAL(b1, b2);
00070 BOOST_CHECK_EQUAL(byteArray[0], 9);
00071 BOOST_CHECK_EQUAL(byteArray[1], 0);
00072 b1.set(7);
00073 b1.set(8);
00074 BitsetUtil::BitsetToBytes(b1, byteArray, numBits);
00075 b2 = BitsetUtil::BytesToBitset(byteArray, numBits);
00076 BOOST_CHECK_EQUAL(b1, b2);
00077 BOOST_CHECK_EQUAL(byteArray[0], 137);
00078 BOOST_CHECK_EQUAL(byteArray[1], 1);
00079 }
00080
00081 BOOST_AUTO_TEST_CASE(Bitset_ConversionToHex)
00082 {
00083 bitset_t b;
00084 std::string s;
00085 BOOST_REQUIRE(BITSETSIZE >= 128);
00086 s = BitsetUtil::BitsetToHex(b, 124);
00087 BOOST_CHECK_EQUAL(BitsetUtil::HexToBitset(s), b);
00088 BOOST_CHECK_EQUAL(s, "0000000000000000000000000000000");
00089 b.set(3);
00090 b.set(5);
00091 b.set(6);
00092 s = BitsetUtil::BitsetToHex(b, 124);
00093 BOOST_CHECK_EQUAL(BitsetUtil::HexToBitset(s), b);
00094 BOOST_CHECK_EQUAL(s, "8600000000000000000000000000000");
00095 b.set(4);
00096 b.flip(6);
00097 b.set(8);
00098 s = BitsetUtil::BitsetToHex(b, 64);
00099 BOOST_CHECK_EQUAL(BitsetUtil::HexToBitset(s), b);
00100 BOOST_CHECK_EQUAL(s, "8310000000000000");
00101 b.set(65);
00102 s = BitsetUtil::BitsetToHex(b, 64);
00103 BOOST_CHECK_EQUAL(s, "8310000000000000");
00104 BOOST_CHECK(BitsetUtil::HexToBitset(s) != b);
00105 BOOST_CHECK(BitsetUtil::IsSubsetOf(BitsetUtil::HexToBitset(s), b));
00106 }
00107
00108 BOOST_AUTO_TEST_CASE(Bitset_Subtraction)
00109 {
00110 bitset_t b1, b2;
00111 BOOST_REQUIRE(BITSETSIZE > 2);
00112 b1.set(0);
00113 b2.set(1);
00114 BOOST_CHECK_EQUAL(BitsetUtil::Subtract(b1, b2), b1);
00115 BOOST_CHECK_EQUAL(b1 - b2, b1);
00116 BOOST_CHECK_EQUAL(BitsetUtil::Subtract(b2, b1), b2);
00117 BOOST_CHECK_EQUAL(b2 - b1, b2);
00118 b2 |= b1;
00119
00120 BOOST_CHECK(BitsetUtil::Subtract(b1, b2).none());
00121 BOOST_CHECK((b1 - b2).none());
00122 BOOST_CHECK_EQUAL(BitsetUtil::Subtract(b2, b1).count(), 1u);
00123 BOOST_CHECK_EQUAL((b2 - b1).count(), 1u);
00124 b2 ^= b1;
00125 b1.flip();
00126
00127 BOOST_CHECK(BitsetUtil::Subtract(b2, b1).none());
00128 BOOST_CHECK((b2 - b1).none());
00129 BOOST_CHECK_EQUAL(BitsetUtil::Subtract(b1, b2).count(),
00130 (std::size_t)(BITSETSIZE-2));
00131 BOOST_CHECK_EQUAL((b1 - b2).count(), (std::size_t)(BITSETSIZE-2));
00132 b2.flip();
00133 BOOST_CHECK_EQUAL(BitsetUtil::Subtract(b1, b2).count(), 1u);
00134 BOOST_CHECK_EQUAL((b1 - b2).count(), 1u);
00135 BOOST_CHECK(BitsetUtil::Subtract(b1, b2).test(1));
00136 BOOST_CHECK((b1 - b2).test(1));
00137 BOOST_CHECK_EQUAL(BitsetUtil::Subtract(b2, b1).count(), 1u);
00138 BOOST_CHECK_EQUAL((b2 - b1).count(), 1u);
00139 BOOST_CHECK(BitsetUtil::Subtract(b2, b1).test(0));
00140 BOOST_CHECK((b2 - b1).test(0));
00141 }
00142
00143 BOOST_AUTO_TEST_CASE(Bitset_Comparison)
00144 {
00145
00146
00147 bitset_t b1, b2, b3;
00148 bool order1, order2, order3, order4, order5, order6;
00149 BOOST_CHECK(!BitsetUtil::IsLessThan(b1, b2));
00150 BOOST_CHECK(BitsetUtil::IsSubsetOf(b1, b2));
00151 BOOST_REQUIRE(BITSETSIZE >= 8);
00152 b2.set(0);
00153
00154 BOOST_CHECK(BitsetUtil::IsLessThan(b1, b2) !=
00155 BitsetUtil::IsLessThan(b2, b1));
00156 BOOST_CHECK(BitsetUtil::IsSubsetOf(b1, b2));
00157 b1.set(1);
00158 BOOST_CHECK(BitsetUtil::IsLessThan(b1, b2) !=
00159 BitsetUtil::IsLessThan(b2, b1));
00160 BOOST_CHECK(!BitsetUtil::IsSubsetOf(b1, b2));
00161 BOOST_CHECK(BitsetUtil::IsSubsetOf(b3, b1));
00162 BOOST_CHECK(BitsetUtil::IsSubsetOf(b3, b2));
00163 b3 = b2;
00164 b2.flip();
00165
00166 BOOST_CHECK(!BitsetUtil::IsLessThan(b1, b1));
00167 BOOST_CHECK(!BitsetUtil::IsLessThan(b2, b2));
00168 BOOST_CHECK(!BitsetUtil::IsLessThan(b3, b3));
00169 order1 = BitsetUtil::IsLessThan(b1, b2);
00170 order2 = BitsetUtil::IsLessThan(b1, b3);
00171 order3 = BitsetUtil::IsLessThan(b2, b1);
00172 order4 = BitsetUtil::IsLessThan(b2, b3);
00173 order5 = BitsetUtil::IsLessThan(b3, b1);
00174 order6 = BitsetUtil::IsLessThan(b3, b2);
00175 BOOST_CHECK(order1 != order3);
00176 BOOST_CHECK(order2 != order5);
00177 BOOST_CHECK(order4 != order6);
00178 BOOST_CHECK_EQUAL(order1 && order4 && order5, false);
00179 BOOST_CHECK_EQUAL(order2 && order3 && order6, false);
00180 BOOST_CHECK(BitsetUtil::IsSubsetOf(b1, b2));
00181 BOOST_CHECK(!BitsetUtil::IsSubsetOf(b1, b3));
00182 b2.flip(1);
00183
00184 BOOST_CHECK(!BitsetUtil::IsLessThan(b1, b1));
00185 BOOST_CHECK(!BitsetUtil::IsLessThan(b2, b2));
00186 BOOST_CHECK(!BitsetUtil::IsLessThan(b3, b3));
00187 order1 = BitsetUtil::IsLessThan(b1, b2);
00188 order2 = BitsetUtil::IsLessThan(b1, b3);
00189 order3 = BitsetUtil::IsLessThan(b2, b1);
00190 order4 = BitsetUtil::IsLessThan(b2, b3);
00191 order5 = BitsetUtil::IsLessThan(b3, b1);
00192 order6 = BitsetUtil::IsLessThan(b3, b2);
00193 BOOST_CHECK(order1 != order3);
00194 BOOST_CHECK(order2 != order5);
00195 BOOST_CHECK(order4 != order6);
00196 BOOST_CHECK_EQUAL(order1 && order4 && order5, false);
00197 BOOST_CHECK_EQUAL(order2 && order3 && order6, false);
00198 BOOST_CHECK(!BitsetUtil::IsSubsetOf(b1, b2));
00199 b1.flip();
00200 b3.flip(2);
00201
00202 BOOST_CHECK(!BitsetUtil::IsLessThan(b1, b1));
00203 BOOST_CHECK(!BitsetUtil::IsLessThan(b2, b2));
00204 BOOST_CHECK(!BitsetUtil::IsLessThan(b3, b3));
00205 order1 = BitsetUtil::IsLessThan(b1, b2);
00206 order2 = BitsetUtil::IsLessThan(b1, b3);
00207 order3 = BitsetUtil::IsLessThan(b2, b1);
00208 order4 = BitsetUtil::IsLessThan(b2, b3);
00209 order5 = BitsetUtil::IsLessThan(b3, b1);
00210 order6 = BitsetUtil::IsLessThan(b3, b2);
00211 BOOST_CHECK(order1 != order3);
00212 BOOST_CHECK(order2 != order5);
00213 BOOST_CHECK(order4 != order6);
00214 BOOST_CHECK_EQUAL(order1 && order4 && order5, false);
00215 BOOST_CHECK_EQUAL(order2 && order3 && order6, false);
00216 BOOST_CHECK(!BitsetUtil::IsSubsetOf(b1, b2));
00217 BOOST_CHECK(BitsetUtil::IsSubsetOf(b2, b1));
00218 BOOST_CHECK(BitsetUtil::IsSubsetOf(b3, b1));
00219 BOOST_CHECK(!BitsetUtil::IsSubsetOf(b3, b2));
00220 b2.flip();
00221
00222 BOOST_CHECK(!BitsetUtil::IsLessThan(b1, b1));
00223 BOOST_CHECK(!BitsetUtil::IsLessThan(b2, b2));
00224 BOOST_CHECK(!BitsetUtil::IsLessThan(b3, b3));
00225 order1 = BitsetUtil::IsLessThan(b1, b2);
00226 order2 = BitsetUtil::IsLessThan(b1, b3);
00227 order3 = BitsetUtil::IsLessThan(b2, b1);
00228 order4 = BitsetUtil::IsLessThan(b2, b3);
00229 order5 = BitsetUtil::IsLessThan(b3, b1);
00230 order6 = BitsetUtil::IsLessThan(b3, b2);
00231 BOOST_CHECK(order1 != order3);
00232 BOOST_CHECK(order2 != order5);
00233 BOOST_CHECK(order4 != order6);
00234 BOOST_CHECK_EQUAL(order1 && order4 && order5, false);
00235 BOOST_CHECK_EQUAL(order2 && order3 && order6, false);
00236 BOOST_CHECK(!BitsetUtil::IsSubsetOf(b1, b2));
00237 BOOST_CHECK(!BitsetUtil::IsSubsetOf(b2, b1));
00238 BOOST_CHECK(BitsetUtil::IsSubsetOf(b3, b1));
00239 BOOST_CHECK(!BitsetUtil::IsSubsetOf(b3, b2));
00240 b1.set(1);
00241 b2.set();
00242
00243 BOOST_CHECK_EQUAL(b1, b2);
00244 BOOST_CHECK(!BitsetUtil::IsLessThan(b2, b1));
00245 BOOST_CHECK(!BitsetUtil::IsLessThan(b3, b3));
00246 order1 = BitsetUtil::IsLessThan(b1, b3);
00247 order2 = BitsetUtil::IsLessThan(b3, b1);
00248 BOOST_CHECK(order1 != order2);
00249 BOOST_CHECK(BitsetUtil::IsSubsetOf(b1, b2));
00250 BOOST_CHECK(BitsetUtil::IsSubsetOf(b2, b1));
00251 BOOST_CHECK(!BitsetUtil::IsSubsetOf(b2, b3));
00252 BOOST_CHECK(BitsetUtil::IsSubsetOf(b3, b2));
00253 }
00254
00255 BOOST_AUTO_TEST_CASE(Bitset_ConversionToVector)
00256 {
00257 bitset_t b;
00258 std::vector<int> moves;
00259 BitsetUtil::BitsetToVector(b, moves);
00260 BOOST_CHECK(moves.empty());
00261 BOOST_REQUIRE(BITSETSIZE >= 16);
00262 b.set(1);
00263 BitsetUtil::BitsetToVector(b, moves);
00264 BOOST_CHECK_EQUAL(moves.size(), 1u);
00265 BOOST_CHECK_EQUAL(moves[0], 1);
00266 b.set(14);
00267 BitsetUtil::BitsetToVector(b, moves);
00268 BOOST_CHECK_EQUAL(moves.size(), 2u);
00269 BOOST_CHECK_EQUAL(moves[0], 1);
00270 BOOST_CHECK_EQUAL(moves[1], 14);
00271 b.flip();
00272 BitsetUtil::BitsetToVector(b, moves);
00273 BOOST_CHECK_EQUAL(moves.size(), (std::size_t)(BITSETSIZE-2));
00274 BOOST_CHECK_EQUAL(moves[moves.size()-1], BITSETSIZE-1);
00275 }
00276
00277 BOOST_AUTO_TEST_CASE(Bitset_FindSingleton)
00278 {
00279 bitset_t b;
00280 BOOST_REQUIRE(BITSETSIZE > 2);
00281 b.set(0);
00282 BOOST_CHECK_EQUAL(BitsetUtil::FindSetBit(b), 0);
00283 b.flip(1);
00284 b.flip(0);
00285 BOOST_CHECK_EQUAL(BitsetUtil::FindSetBit(b), 1);
00286 b.reset();
00287 b.set(BITSETSIZE-1);
00288 BOOST_CHECK_EQUAL(BitsetUtil::FindSetBit(b), BITSETSIZE-1);
00289 }
00290
00291 }
00292
00293