1 //===-- FlagsTest.cpp -------------------===---------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "gtest/gtest.h"
10 
11 #include "lldb/Utility/Flags.h"
12 
13 using namespace lldb_private;
14 
15 enum DummyFlags {
16   eFlag0     = 1 << 0,
17   eFlag1     = 1 << 1,
18   eFlag2     = 1 << 2,
19   eAllFlags  = (eFlag0 | eFlag1 | eFlag2)
20 };
21 
22 TEST(Flags, GetBitSize) {
23   Flags f;
24   // Methods like ClearCount depend on this specific value, so we test
25   // against it here.
26   EXPECT_EQ(32U, f.GetBitSize());
27 }
28 
29 TEST(Flags, Reset) {
30   Flags f;
31   f.Reset(0x3);
32   EXPECT_EQ(0x3U, f.Get());
33   EXPECT_EQ(2U, f.SetCount());
34 }
35 
36 TEST(Flags, Clear) {
37   Flags f;
38   f.Reset(0x3);
39   EXPECT_EQ(2U, f.SetCount());
40 
41   f.Clear(0x5);
42   EXPECT_EQ(1U, f.SetCount());
43 
44   f.Clear();
45   EXPECT_EQ(0U, f.SetCount());
46 }
47 
48 TEST(Flags, AllSet) {
49   Flags f;
50 
51   EXPECT_FALSE(f.AllSet(eFlag0 | eFlag1));
52 
53   f.Set(eFlag0);
54   EXPECT_FALSE(f.AllSet(eFlag0 | eFlag1));
55 
56   f.Set(eFlag1);
57   EXPECT_TRUE(f.AllSet(eFlag0 | eFlag1));
58 
59   f.Clear(eFlag1);
60   EXPECT_FALSE(f.AllSet(eFlag0 | eFlag1));
61 
62   f.Clear(eFlag0);
63   EXPECT_FALSE(f.AllSet(eFlag0 | eFlag1));
64 }
65 
66 TEST(Flags, AnySet) {
67   Flags f;
68 
69   EXPECT_FALSE(f.AnySet(eFlag0 | eFlag1));
70 
71   f.Set(eFlag0);
72   EXPECT_TRUE(f.AnySet(eFlag0 | eFlag1));
73 
74   f.Set(eFlag1);
75   EXPECT_TRUE(f.AnySet(eFlag0 | eFlag1));
76 
77   f.Clear(eFlag1);
78   EXPECT_TRUE(f.AnySet(eFlag0 | eFlag1));
79 
80   f.Clear(eFlag0);
81   EXPECT_FALSE(f.AnySet(eFlag0 | eFlag1));
82 }
83 
84 TEST(Flags, Test) {
85   Flags f;
86 
87   EXPECT_FALSE(f.Test(eFlag0));
88   EXPECT_FALSE(f.Test(eFlag1));
89   EXPECT_FALSE(f.Test(eFlag2));
90 
91   f.Set(eFlag0);
92   EXPECT_TRUE(f.Test(eFlag0));
93   EXPECT_FALSE(f.Test(eFlag1));
94   EXPECT_FALSE(f.Test(eFlag2));
95 
96   f.Set(eFlag1);
97   EXPECT_TRUE(f.Test(eFlag0));
98   EXPECT_TRUE(f.Test(eFlag1));
99   EXPECT_FALSE(f.Test(eFlag2));
100 
101   f.Clear(eFlag0);
102   EXPECT_FALSE(f.Test(eFlag0));
103   EXPECT_TRUE(f.Test(eFlag1));
104   EXPECT_FALSE(f.Test(eFlag2));
105 
106   // FIXME: Should Flags assert on Test(eFlag0 | eFlag1) (more than one bit)?
107 }
108 
109 TEST(Flags, AllClear) {
110   Flags f;
111 
112   EXPECT_TRUE(f.AllClear(eFlag0 | eFlag1));
113 
114   f.Set(eFlag0);
115   EXPECT_FALSE(f.AllClear(eFlag0 | eFlag1));
116 
117   f.Set(eFlag1);
118   f.Clear(eFlag0);
119   EXPECT_FALSE(f.AllClear(eFlag0 | eFlag1));
120 
121   f.Clear(eFlag1);
122   EXPECT_TRUE(f.AnyClear(eFlag0 | eFlag1));
123 }
124 
125 TEST(Flags, AnyClear) {
126   Flags f;
127   EXPECT_TRUE(f.AnyClear(eFlag0 | eFlag1));
128 
129   f.Set(eFlag0);
130   EXPECT_TRUE(f.AnyClear(eFlag0 | eFlag1));
131 
132   f.Set(eFlag1);
133   f.Set(eFlag0);
134   EXPECT_FALSE(f.AnyClear(eFlag0 | eFlag1));
135 
136   f.Clear(eFlag1);
137   EXPECT_TRUE(f.AnyClear(eFlag0 | eFlag1));
138 
139   f.Clear(eFlag0);
140   EXPECT_TRUE(f.AnyClear(eFlag0 | eFlag1));
141 }
142 
143 TEST(Flags, IsClear) {
144   Flags f;
145 
146   EXPECT_TRUE(f.IsClear(eFlag0));
147   EXPECT_TRUE(f.IsClear(eFlag1));
148 
149   f.Set(eFlag0);
150   EXPECT_FALSE(f.IsClear(eFlag0));
151   EXPECT_TRUE(f.IsClear(eFlag1));
152 
153   f.Set(eFlag1);
154   EXPECT_FALSE(f.IsClear(eFlag0));
155   EXPECT_FALSE(f.IsClear(eFlag1));
156 
157   f.Clear(eFlag0);
158   EXPECT_TRUE(f.IsClear(eFlag0));
159   EXPECT_FALSE(f.IsClear(eFlag1));
160 
161   f.Clear(eFlag1);
162   EXPECT_TRUE(f.IsClear(eFlag0));
163   EXPECT_TRUE(f.IsClear(eFlag1));
164 }
165 
166 TEST(Flags, ClearCount) {
167   Flags f;
168   EXPECT_EQ(32U, f.ClearCount());
169 
170   f.Set(eFlag0);
171   EXPECT_EQ(31U, f.ClearCount());
172 
173   f.Set(eFlag0);
174   EXPECT_EQ(31U, f.ClearCount());
175 
176   f.Set(eFlag1);
177   EXPECT_EQ(30U, f.ClearCount());
178 
179   f.Set(eAllFlags);
180   EXPECT_EQ(29U, f.ClearCount());
181 }
182 
183 TEST(Flags, SetCount) {
184   Flags f;
185   EXPECT_EQ(0U, f.SetCount());
186 
187   f.Set(eFlag0);
188   EXPECT_EQ(1U, f.SetCount());
189 
190   f.Set(eFlag0);
191   EXPECT_EQ(1U, f.SetCount());
192 
193   f.Set(eFlag1);
194   EXPECT_EQ(2U, f.SetCount());
195 
196   f.Set(eAllFlags);
197   EXPECT_EQ(3U, f.SetCount());
198 }
199