• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2017 Google Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include <vector>
16 
17 #include "gmock/gmock.h"
18 
19 #include "source/util/bit_vector.h"
20 
21 namespace spvtools {
22 namespace utils {
23 namespace {
24 
25 using BitVectorTest = ::testing::Test;
26 
TEST(BitVectorTest,Initialize)27 TEST(BitVectorTest, Initialize) {
28   BitVector bvec;
29 
30   // Checks that all values are 0.  Also tests checking a  bit past the end of
31   // the vector containing the bits.
32   for (int i = 1; i < 10000; i *= 2) {
33     EXPECT_FALSE(bvec.Get(i));
34   }
35 }
36 
TEST(BitVectorTest,Set)37 TEST(BitVectorTest, Set) {
38   BitVector bvec;
39 
40   // Since 10,000 is larger than the initial size, this tests the resizing
41   // code.
42   for (int i = 3; i < 10000; i *= 2) {
43     bvec.Set(i);
44   }
45 
46   // Check that bits that were not set are 0.
47   for (int i = 1; i < 10000; i *= 2) {
48     EXPECT_FALSE(bvec.Get(i));
49   }
50 
51   // Check that bits that were set are 1.
52   for (int i = 3; i < 10000; i *= 2) {
53     EXPECT_TRUE(bvec.Get(i));
54   }
55 }
56 
TEST(BitVectorTest,SetReturnValue)57 TEST(BitVectorTest, SetReturnValue) {
58   BitVector bvec;
59 
60   // Make sure |Set| returns false when the bit was not set.
61   for (int i = 3; i < 10000; i *= 2) {
62     EXPECT_FALSE(bvec.Set(i));
63   }
64 
65   // Make sure |Set| returns true when the bit was already set.
66   for (int i = 3; i < 10000; i *= 2) {
67     EXPECT_TRUE(bvec.Set(i));
68   }
69 }
70 
TEST(BitVectorTest,Clear)71 TEST(BitVectorTest, Clear) {
72   BitVector bvec;
73   for (int i = 3; i < 10000; i *= 2) {
74     bvec.Set(i);
75   }
76 
77   // Check that the bits were properly set.
78   for (int i = 3; i < 10000; i *= 2) {
79     EXPECT_TRUE(bvec.Get(i));
80   }
81 
82   // Clear all of the bits except for bit 3.
83   for (int i = 6; i < 10000; i *= 2) {
84     bvec.Clear(i);
85   }
86 
87   // Make sure bit 3 was not cleared.
88   EXPECT_TRUE(bvec.Get(3));
89 
90   // Make sure all of the other bits that were set have been cleared.
91   for (int i = 6; i < 10000; i *= 2) {
92     EXPECT_FALSE(bvec.Get(i));
93   }
94 }
95 
TEST(BitVectorTest,ClearReturnValue)96 TEST(BitVectorTest, ClearReturnValue) {
97   BitVector bvec;
98   for (int i = 3; i < 10000; i *= 2) {
99     bvec.Set(i);
100   }
101 
102   // Make sure |Clear| returns true if the bit was set.
103   for (int i = 3; i < 10000; i *= 2) {
104     EXPECT_TRUE(bvec.Clear(i));
105   }
106 
107   // Make sure |Clear| returns false if the bit was not set.
108   for (int i = 3; i < 10000; i *= 2) {
109     EXPECT_FALSE(bvec.Clear(i));
110   }
111 }
112 
TEST(BitVectorTest,SimpleOrTest)113 TEST(BitVectorTest, SimpleOrTest) {
114   BitVector bvec1;
115   bvec1.Set(3);
116   bvec1.Set(4);
117 
118   BitVector bvec2;
119   bvec2.Set(2);
120   bvec2.Set(4);
121 
122   // Check that |bvec1| changed when doing the |Or| operation.
123   EXPECT_TRUE(bvec1.Or(bvec2));
124 
125   // Check that the values are all correct.
126   EXPECT_FALSE(bvec1.Get(0));
127   EXPECT_FALSE(bvec1.Get(1));
128   EXPECT_TRUE(bvec1.Get(2));
129   EXPECT_TRUE(bvec1.Get(3));
130   EXPECT_TRUE(bvec1.Get(4));
131 }
132 
TEST(BitVectorTest,ResizingOrTest)133 TEST(BitVectorTest, ResizingOrTest) {
134   BitVector bvec1;
135   bvec1.Set(3);
136   bvec1.Set(4);
137 
138   BitVector bvec2;
139   bvec2.Set(10000);
140 
141   // Similar to above except with a large value to test resizing.
142   EXPECT_TRUE(bvec1.Or(bvec2));
143   EXPECT_FALSE(bvec1.Get(0));
144   EXPECT_FALSE(bvec1.Get(1));
145   EXPECT_FALSE(bvec1.Get(2));
146   EXPECT_TRUE(bvec1.Get(3));
147   EXPECT_TRUE(bvec1.Get(10000));
148 }
149 
TEST(BitVectorTest,SubsetOrTest)150 TEST(BitVectorTest, SubsetOrTest) {
151   BitVector bvec1;
152   bvec1.Set(3);
153   bvec1.Set(4);
154 
155   BitVector bvec2;
156   bvec2.Set(3);
157 
158   // |Or| returns false if |bvec1| does not change.
159   EXPECT_FALSE(bvec1.Or(bvec2));
160 }
161 
162 }  // namespace
163 }  // namespace utils
164 }  // namespace spvtools
165