Files
filament/libs/utils/test/test_bitset.cpp

245 lines
4.4 KiB
C++

/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <gtest/gtest.h>
#include <utils/bitset.h>
using namespace utils;
TEST(BitSetTest, bitset256) {
bitset256 b;
EXPECT_EQ(0, b.count());
EXPECT_TRUE(b == b);
b.set(0);
EXPECT_EQ(1, b.count());
EXPECT_TRUE(b == b);
b.set(64);
EXPECT_EQ(2, b.count());
EXPECT_TRUE(b == b);
b.set(128);
EXPECT_EQ(3, b.count());
EXPECT_TRUE(b == b);
b.set(192);
EXPECT_EQ(4, b.count());
EXPECT_TRUE(b == b);
b = ~b;
EXPECT_EQ(252, b.count());
EXPECT_TRUE(b == b);
EXPECT_TRUE(b.any());
EXPECT_TRUE((b & ~b).none());
EXPECT_TRUE((b | ~b).all());
}
TEST(BitSetTest, LargeBitset) {
bitset<uint64_t, 2 * 31> b;
b = ~b;
EXPECT_EQ(64 * 2 * 31, b.count());
}
TEST(BitSetTest, SetBit) {
bitset8 b;
b.set(1, true);
EXPECT_TRUE(b.test(1));
b.set(1, false);
EXPECT_FALSE(b.test(1));
}
TEST(BitSetTest, TestOperator) {
bitset8 b;
b.set(1, true);
EXPECT_TRUE(b[1]);
b.set(1, false);
EXPECT_FALSE(b[1]);
}
TEST(BitSetTest, Count) {
bitset8 b;
EXPECT_EQ(0, b.count());
b.set(1, true);
b.set(3, true);
b.set(4, true);
EXPECT_EQ(3, b.count());
}
TEST(BitSetTest, Reset) {
bitset8 b;
b.set(1, true);
b.set(3, true);
b.set(4, true);
b.reset();
EXPECT_TRUE(b.none());
}
TEST(BitSetTest, AnyBit) {
bitset8 b;
EXPECT_FALSE(b.any());
b.set(1, true);
EXPECT_TRUE(b.any());
}
TEST(BitSetTest, None) {
bitset8 b;
EXPECT_TRUE(b.none());
b.set(1, true);
b.reset();
EXPECT_TRUE(b.none());
}
TEST(BitSetTest, All) {
bitset8 b;
EXPECT_FALSE(b.all());
b.set(1, true);
EXPECT_FALSE(b.all());
b.set(0, true);
b.set(2, true);
b.set(3, true);
b.set(4, true);
b.set(5, true);
b.set(6, true);
b.set(7, true);
EXPECT_TRUE(b.all());
}
TEST(BitSetTest, FlipBit) {
bitset8 b;
b.flip(1);
EXPECT_TRUE(b.test(1));
b.flip(1);
EXPECT_FALSE(b.test(1));
}
TEST(BitSetTest, SetUnset) {
bitset8 b;
b.set(1);
EXPECT_TRUE(b.test(1));
b.unset(1);
EXPECT_FALSE(b.test(1));
}
TEST(BitSetTest, AndOperator) {
bitset8 b1;
b1.set(1);
bitset8 b2;
b2.set(2);
bitset8 b3 = b1 & b2;
EXPECT_FALSE(b3[1]);
EXPECT_FALSE(b3[2]);
EXPECT_TRUE(b3.none());
b2.reset();
b2.set(1);
b3 = b1 & b2;
EXPECT_TRUE(b3[1]);
b1 &= b2;
EXPECT_EQ(b3, b1);
}
TEST(BitSetTest, OrOperator) {
bitset8 b1;
b1.set(1);
bitset8 b2;
b2.set(2);
bitset8 b3 = b1 | b2;
EXPECT_TRUE(b3[1]);
EXPECT_TRUE(b3[2]);
b1 |= b2;
EXPECT_EQ(b3, b1);
}
TEST(BitSetTest, XorOperator) {
bitset8 b1;
b1.set(1);
bitset8 b2;
b2.set(2);
bitset8 b3 = b1 ^ b2;
EXPECT_TRUE(b3[1]);
EXPECT_TRUE(b3[2]);
b2.reset();
b2.set(1);
b3 = b1 ^ b2;
EXPECT_FALSE(b3[1]);
EXPECT_FALSE(b3[2]);
b1 ^= b2;
EXPECT_EQ(b3, b1);
}
TEST(BitSetTest, NotOperator) {
bitset8 b1;
b1.set(1);
bitset8 b3 = ~b1;
EXPECT_FALSE(b3[1]);
EXPECT_TRUE(b3[0]);
EXPECT_TRUE(b3[2]);
}
TEST(BitSetTest, FirstSetBit) {
bitset256 b;
// Without a set bit, we expect an value out-of-bounds.
EXPECT_GT(b.firstSetBit(), b.size() - 1);
b.set(64);
EXPECT_EQ(64, b.firstSetBit());
b.set(63);
EXPECT_EQ(63, b.firstSetBit());
b.set(0);
EXPECT_EQ(0, b.firstSetBit());
b.set(128);
EXPECT_EQ(0, b.firstSetBit());
b.set(255);
EXPECT_EQ(0, b.firstSetBit());
b.unset(0);
EXPECT_EQ(63, b.firstSetBit());
b.unset(63);
EXPECT_EQ(64, b.firstSetBit());
b.unset(64);
EXPECT_EQ(128, b.firstSetBit());
b.unset(128);
EXPECT_EQ(255, b.firstSetBit());
b.unset(255);
// Without a set bit, we expect an value out-of-bounds.
EXPECT_GT(b.firstSetBit(), b.size() - 1);
}