| // Copyright (c) 2017 Google Inc. | |
| // | |
| // 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 <vector> | |
| #include "gmock/gmock.h" | |
| #include "source/util/bit_vector.h" | |
| namespace spvtools { | |
| namespace utils { | |
| namespace { | |
| using BitVectorTest = ::testing::Test; | |
| TEST(BitVectorTest, Initialize) { | |
| BitVector bvec; | |
| // Checks that all values are 0. Also tests checking a bit past the end of | |
| // the vector containing the bits. | |
| for (int i = 1; i < 10000; i *= 2) { | |
| EXPECT_FALSE(bvec.Get(i)); | |
| } | |
| } | |
| TEST(BitVectorTest, Set) { | |
| BitVector bvec; | |
| // Since 10,000 is larger than the initial size, this tests the resizing | |
| // code. | |
| for (int i = 3; i < 10000; i *= 2) { | |
| bvec.Set(i); | |
| } | |
| // Check that bits that were not set are 0. | |
| for (int i = 1; i < 10000; i *= 2) { | |
| EXPECT_FALSE(bvec.Get(i)); | |
| } | |
| // Check that bits that were set are 1. | |
| for (int i = 3; i < 10000; i *= 2) { | |
| EXPECT_TRUE(bvec.Get(i)); | |
| } | |
| } | |
| TEST(BitVectorTest, SetReturnValue) { | |
| BitVector bvec; | |
| // Make sure |Set| returns false when the bit was not set. | |
| for (int i = 3; i < 10000; i *= 2) { | |
| EXPECT_FALSE(bvec.Set(i)); | |
| } | |
| // Make sure |Set| returns true when the bit was already set. | |
| for (int i = 3; i < 10000; i *= 2) { | |
| EXPECT_TRUE(bvec.Set(i)); | |
| } | |
| } | |
| TEST(BitVectorTest, Clear) { | |
| BitVector bvec; | |
| for (int i = 3; i < 10000; i *= 2) { | |
| bvec.Set(i); | |
| } | |
| // Check that the bits were properly set. | |
| for (int i = 3; i < 10000; i *= 2) { | |
| EXPECT_TRUE(bvec.Get(i)); | |
| } | |
| // Clear all of the bits except for bit 3. | |
| for (int i = 6; i < 10000; i *= 2) { | |
| bvec.Clear(i); | |
| } | |
| // Make sure bit 3 was not cleared. | |
| EXPECT_TRUE(bvec.Get(3)); | |
| // Make sure all of the other bits that were set have been cleared. | |
| for (int i = 6; i < 10000; i *= 2) { | |
| EXPECT_FALSE(bvec.Get(i)); | |
| } | |
| } | |
| TEST(BitVectorTest, ClearReturnValue) { | |
| BitVector bvec; | |
| for (int i = 3; i < 10000; i *= 2) { | |
| bvec.Set(i); | |
| } | |
| // Make sure |Clear| returns true if the bit was set. | |
| for (int i = 3; i < 10000; i *= 2) { | |
| EXPECT_TRUE(bvec.Clear(i)); | |
| } | |
| // Make sure |Clear| returns false if the bit was not set. | |
| for (int i = 3; i < 10000; i *= 2) { | |
| EXPECT_FALSE(bvec.Clear(i)); | |
| } | |
| } | |
| TEST(BitVectorTest, SimpleOrTest) { | |
| BitVector bvec1; | |
| bvec1.Set(3); | |
| bvec1.Set(4); | |
| BitVector bvec2; | |
| bvec2.Set(2); | |
| bvec2.Set(4); | |
| // Check that |bvec1| changed when doing the |Or| operation. | |
| EXPECT_TRUE(bvec1.Or(bvec2)); | |
| // Check that the values are all correct. | |
| EXPECT_FALSE(bvec1.Get(0)); | |
| EXPECT_FALSE(bvec1.Get(1)); | |
| EXPECT_TRUE(bvec1.Get(2)); | |
| EXPECT_TRUE(bvec1.Get(3)); | |
| EXPECT_TRUE(bvec1.Get(4)); | |
| } | |
| TEST(BitVectorTest, ResizingOrTest) { | |
| BitVector bvec1; | |
| bvec1.Set(3); | |
| bvec1.Set(4); | |
| BitVector bvec2; | |
| bvec2.Set(10000); | |
| // Similar to above except with a large value to test resizing. | |
| EXPECT_TRUE(bvec1.Or(bvec2)); | |
| EXPECT_FALSE(bvec1.Get(0)); | |
| EXPECT_FALSE(bvec1.Get(1)); | |
| EXPECT_FALSE(bvec1.Get(2)); | |
| EXPECT_TRUE(bvec1.Get(3)); | |
| EXPECT_TRUE(bvec1.Get(10000)); | |
| } | |
| TEST(BitVectorTest, SubsetOrTest) { | |
| BitVector bvec1; | |
| bvec1.Set(3); | |
| bvec1.Set(4); | |
| BitVector bvec2; | |
| bvec2.Set(3); | |
| // |Or| returns false if |bvec1| does not change. | |
| EXPECT_FALSE(bvec1.Or(bvec2)); | |
| } | |
| } // namespace | |
| } // namespace utils | |
| } // namespace spvtools |