| // | |
| // Copyright 2015 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| // bitset_utils_unittest: | |
| // Tests bitset helpers and custom classes. | |
| // | |
| #include <gtest/gtest.h> | |
| #include "common/bitset_utils.h" | |
| using namespace angle; | |
| namespace | |
| { | |
| class BitSetIteratorTest : public testing::Test | |
| { | |
| protected: | |
| BitSet<40> mStateBits; | |
| }; | |
| // Simple iterator test. | |
| TEST_F(BitSetIteratorTest, Iterator) | |
| { | |
| std::set<size_t> originalValues; | |
| originalValues.insert(2); | |
| originalValues.insert(6); | |
| originalValues.insert(8); | |
| originalValues.insert(35); | |
| for (size_t value : originalValues) | |
| { | |
| mStateBits.set(value); | |
| } | |
| std::set<size_t> readValues; | |
| for (size_t bit : mStateBits) | |
| { | |
| EXPECT_EQ(1u, originalValues.count(bit)); | |
| EXPECT_EQ(0u, readValues.count(bit)); | |
| readValues.insert(bit); | |
| } | |
| EXPECT_EQ(originalValues.size(), readValues.size()); | |
| } | |
| // Test an empty iterator. | |
| TEST_F(BitSetIteratorTest, EmptySet) | |
| { | |
| // We don't use the FAIL gtest macro here since it returns immediately, | |
| // causing an unreachable code warning in MSVS | |
| bool sawBit = false; | |
| for (size_t bit : mStateBits) | |
| { | |
| sawBit = true; | |
| ANGLE_UNUSED_VARIABLE(bit); | |
| } | |
| EXPECT_FALSE(sawBit); | |
| } | |
| // Test iterating a result of combining two bitsets. | |
| TEST_F(BitSetIteratorTest, NonLValueBitset) | |
| { | |
| BitSet<40> otherBits; | |
| mStateBits.set(1); | |
| mStateBits.set(2); | |
| mStateBits.set(3); | |
| mStateBits.set(4); | |
| otherBits.set(0); | |
| otherBits.set(1); | |
| otherBits.set(3); | |
| otherBits.set(5); | |
| std::set<size_t> seenBits; | |
| angle::BitSet<40> maskedBits = (mStateBits & otherBits); | |
| for (size_t bit : maskedBits) | |
| { | |
| EXPECT_EQ(0u, seenBits.count(bit)); | |
| seenBits.insert(bit); | |
| EXPECT_TRUE(mStateBits[bit]); | |
| EXPECT_TRUE(otherBits[bit]); | |
| } | |
| EXPECT_EQ((mStateBits & otherBits).count(), seenBits.size()); | |
| } | |
| // Test bit assignments. | |
| TEST_F(BitSetIteratorTest, BitAssignment) | |
| { | |
| std::set<size_t> originalValues; | |
| originalValues.insert(2); | |
| originalValues.insert(6); | |
| originalValues.insert(8); | |
| originalValues.insert(35); | |
| for (size_t value : originalValues) | |
| { | |
| (mStateBits[value] = false) = true; | |
| } | |
| for (size_t value : originalValues) | |
| { | |
| EXPECT_TRUE(mStateBits.test(value)); | |
| } | |
| } | |
| } // anonymous namespace |