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