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