Index: lldb/trunk/unittests/Utility/CMakeLists.txt =================================================================== --- lldb/trunk/unittests/Utility/CMakeLists.txt +++ lldb/trunk/unittests/Utility/CMakeLists.txt @@ -8,6 +8,7 @@ CompletionRequestTest.cpp EnvironmentTest.cpp FileSpecTest.cpp + FlagsTest.cpp JSONTest.cpp LogTest.cpp NameMatchesTest.cpp Index: lldb/trunk/unittests/Utility/FlagsTest.cpp =================================================================== --- lldb/trunk/unittests/Utility/FlagsTest.cpp +++ lldb/trunk/unittests/Utility/FlagsTest.cpp @@ -0,0 +1,199 @@ +//===-- FlagsTest.cpp -------------------===---------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "gtest/gtest.h" + +#include "lldb/Utility/Flags.h" + +using namespace lldb_private; + +enum DummyFlags { + eFlag0 = 1 << 0, + eFlag1 = 1 << 1, + eFlag2 = 1 << 2, + eAllFlags = (eFlag0 | eFlag1 | eFlag2) +}; + +TEST(Flags, GetBitSize) { + Flags f; + // Methods like ClearCount depend on this specific value, so we test + // against it here. + EXPECT_EQ(32U, f.GetBitSize()); +} + +TEST(Flags, Reset) { + Flags f; + f.Reset(0x3); + EXPECT_EQ(0x3U, f.Get()); + EXPECT_EQ(2U, f.SetCount()); +} + +TEST(Flags, Clear) { + Flags f; + f.Reset(0x3); + EXPECT_EQ(2U, f.SetCount()); + + f.Clear(0x5); + EXPECT_EQ(1U, f.SetCount()); + + f.Clear(); + EXPECT_EQ(0U, f.SetCount()); +} + +TEST(Flags, AllSet) { + Flags f; + + EXPECT_FALSE(f.AllSet(eFlag0 | eFlag1)); + + f.Set(eFlag0); + EXPECT_FALSE(f.AllSet(eFlag0 | eFlag1)); + + f.Set(eFlag1); + EXPECT_TRUE(f.AllSet(eFlag0 | eFlag1)); + + f.Clear(eFlag1); + EXPECT_FALSE(f.AllSet(eFlag0 | eFlag1)); + + f.Clear(eFlag0); + EXPECT_FALSE(f.AllSet(eFlag0 | eFlag1)); +} + +TEST(Flags, AnySet) { + Flags f; + + EXPECT_FALSE(f.AnySet(eFlag0 | eFlag1)); + + f.Set(eFlag0); + EXPECT_TRUE(f.AnySet(eFlag0 | eFlag1)); + + f.Set(eFlag1); + EXPECT_TRUE(f.AnySet(eFlag0 | eFlag1)); + + f.Clear(eFlag1); + EXPECT_TRUE(f.AnySet(eFlag0 | eFlag1)); + + f.Clear(eFlag0); + EXPECT_FALSE(f.AnySet(eFlag0 | eFlag1)); +} + +TEST(Flags, Test) { + Flags f; + + EXPECT_FALSE(f.Test(eFlag0)); + EXPECT_FALSE(f.Test(eFlag1)); + EXPECT_FALSE(f.Test(eFlag2)); + + f.Set(eFlag0); + EXPECT_TRUE(f.Test(eFlag0)); + EXPECT_FALSE(f.Test(eFlag1)); + EXPECT_FALSE(f.Test(eFlag2)); + + f.Set(eFlag1); + EXPECT_TRUE(f.Test(eFlag0)); + EXPECT_TRUE(f.Test(eFlag1)); + EXPECT_FALSE(f.Test(eFlag2)); + + f.Clear(eFlag0); + EXPECT_FALSE(f.Test(eFlag0)); + EXPECT_TRUE(f.Test(eFlag1)); + EXPECT_FALSE(f.Test(eFlag2)); + + // FIXME: Should Flags assert on Test(eFlag0 | eFlag1) (more than one bit)? +} + +TEST(Flags, AllClear) { + Flags f; + + EXPECT_TRUE(f.AllClear(eFlag0 | eFlag1)); + + f.Set(eFlag0); + EXPECT_FALSE(f.AllClear(eFlag0 | eFlag1)); + + f.Set(eFlag1); + f.Clear(eFlag0); + EXPECT_FALSE(f.AllClear(eFlag0 | eFlag1)); + + f.Clear(eFlag1); + EXPECT_TRUE(f.AnyClear(eFlag0 | eFlag1)); +} + +TEST(Flags, AnyClear) { + Flags f; + EXPECT_TRUE(f.AnyClear(eFlag0 | eFlag1)); + + f.Set(eFlag0); + EXPECT_TRUE(f.AnyClear(eFlag0 | eFlag1)); + + f.Set(eFlag1); + f.Set(eFlag0); + EXPECT_FALSE(f.AnyClear(eFlag0 | eFlag1)); + + f.Clear(eFlag1); + EXPECT_TRUE(f.AnyClear(eFlag0 | eFlag1)); + + f.Clear(eFlag0); + EXPECT_TRUE(f.AnyClear(eFlag0 | eFlag1)); +} + +TEST(Flags, IsClear) { + Flags f; + + EXPECT_TRUE(f.IsClear(eFlag0)); + EXPECT_TRUE(f.IsClear(eFlag1)); + + f.Set(eFlag0); + EXPECT_FALSE(f.IsClear(eFlag0)); + EXPECT_TRUE(f.IsClear(eFlag1)); + + f.Set(eFlag1); + EXPECT_FALSE(f.IsClear(eFlag0)); + EXPECT_FALSE(f.IsClear(eFlag1)); + + f.Clear(eFlag0); + EXPECT_TRUE(f.IsClear(eFlag0)); + EXPECT_FALSE(f.IsClear(eFlag1)); + + f.Clear(eFlag1); + EXPECT_TRUE(f.IsClear(eFlag0)); + EXPECT_TRUE(f.IsClear(eFlag1)); +} + +TEST(Flags, ClearCount) { + Flags f; + EXPECT_EQ(32U, f.ClearCount()); + + f.Set(eFlag0); + EXPECT_EQ(31U, f.ClearCount()); + + f.Set(eFlag0); + EXPECT_EQ(31U, f.ClearCount()); + + f.Set(eFlag1); + EXPECT_EQ(30U, f.ClearCount()); + + f.Set(eAllFlags); + EXPECT_EQ(29U, f.ClearCount()); +} + +TEST(Flags, SetCount) { + Flags f; + EXPECT_EQ(0U, f.SetCount()); + + f.Set(eFlag0); + EXPECT_EQ(1U, f.SetCount()); + + f.Set(eFlag0); + EXPECT_EQ(1U, f.SetCount()); + + f.Set(eFlag1); + EXPECT_EQ(2U, f.SetCount()); + + f.Set(eAllFlags); + EXPECT_EQ(3U, f.SetCount()); +}