139148330SRaphael Isemann //===-- FlagsTest.cpp -------------------===---------------------*- C++ -*-===//
239148330SRaphael Isemann //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
639148330SRaphael Isemann //
739148330SRaphael Isemann //===----------------------------------------------------------------------===//
839148330SRaphael Isemann 
939148330SRaphael Isemann #include "gtest/gtest.h"
1039148330SRaphael Isemann 
1139148330SRaphael Isemann #include "lldb/Utility/Flags.h"
1239148330SRaphael Isemann 
1339148330SRaphael Isemann using namespace lldb_private;
1439148330SRaphael Isemann 
1539148330SRaphael Isemann enum DummyFlags {
1639148330SRaphael Isemann   eFlag0     = 1 << 0,
1739148330SRaphael Isemann   eFlag1     = 1 << 1,
1839148330SRaphael Isemann   eFlag2     = 1 << 2,
1939148330SRaphael Isemann   eAllFlags  = (eFlag0 | eFlag1 | eFlag2)
2039148330SRaphael Isemann };
2139148330SRaphael Isemann 
2239148330SRaphael Isemann TEST(Flags, GetBitSize) {
2339148330SRaphael Isemann   Flags f;
2439148330SRaphael Isemann   // Methods like ClearCount depend on this specific value, so we test
2539148330SRaphael Isemann   // against it here.
2639148330SRaphael Isemann   EXPECT_EQ(32U, f.GetBitSize());
2739148330SRaphael Isemann }
2839148330SRaphael Isemann 
2939148330SRaphael Isemann TEST(Flags, Reset) {
3039148330SRaphael Isemann   Flags f;
3139148330SRaphael Isemann   f.Reset(0x3);
3239148330SRaphael Isemann   EXPECT_EQ(0x3U, f.Get());
3339148330SRaphael Isemann   EXPECT_EQ(2U, f.SetCount());
3439148330SRaphael Isemann }
3539148330SRaphael Isemann 
3639148330SRaphael Isemann TEST(Flags, Clear) {
3739148330SRaphael Isemann   Flags f;
3839148330SRaphael Isemann   f.Reset(0x3);
3939148330SRaphael Isemann   EXPECT_EQ(2U, f.SetCount());
4039148330SRaphael Isemann 
4139148330SRaphael Isemann   f.Clear(0x5);
4239148330SRaphael Isemann   EXPECT_EQ(1U, f.SetCount());
4339148330SRaphael Isemann 
4439148330SRaphael Isemann   f.Clear();
4539148330SRaphael Isemann   EXPECT_EQ(0U, f.SetCount());
4639148330SRaphael Isemann }
4739148330SRaphael Isemann 
4839148330SRaphael Isemann TEST(Flags, AllSet) {
4939148330SRaphael Isemann   Flags f;
5039148330SRaphael Isemann 
5139148330SRaphael Isemann   EXPECT_FALSE(f.AllSet(eFlag0 | eFlag1));
5239148330SRaphael Isemann 
5339148330SRaphael Isemann   f.Set(eFlag0);
5439148330SRaphael Isemann   EXPECT_FALSE(f.AllSet(eFlag0 | eFlag1));
5539148330SRaphael Isemann 
5639148330SRaphael Isemann   f.Set(eFlag1);
5739148330SRaphael Isemann   EXPECT_TRUE(f.AllSet(eFlag0 | eFlag1));
5839148330SRaphael Isemann 
5939148330SRaphael Isemann   f.Clear(eFlag1);
6039148330SRaphael Isemann   EXPECT_FALSE(f.AllSet(eFlag0 | eFlag1));
6139148330SRaphael Isemann 
6239148330SRaphael Isemann   f.Clear(eFlag0);
6339148330SRaphael Isemann   EXPECT_FALSE(f.AllSet(eFlag0 | eFlag1));
6439148330SRaphael Isemann }
6539148330SRaphael Isemann 
6639148330SRaphael Isemann TEST(Flags, AnySet) {
6739148330SRaphael Isemann   Flags f;
6839148330SRaphael Isemann 
6939148330SRaphael Isemann   EXPECT_FALSE(f.AnySet(eFlag0 | eFlag1));
7039148330SRaphael Isemann 
7139148330SRaphael Isemann   f.Set(eFlag0);
7239148330SRaphael Isemann   EXPECT_TRUE(f.AnySet(eFlag0 | eFlag1));
7339148330SRaphael Isemann 
7439148330SRaphael Isemann   f.Set(eFlag1);
7539148330SRaphael Isemann   EXPECT_TRUE(f.AnySet(eFlag0 | eFlag1));
7639148330SRaphael Isemann 
7739148330SRaphael Isemann   f.Clear(eFlag1);
7839148330SRaphael Isemann   EXPECT_TRUE(f.AnySet(eFlag0 | eFlag1));
7939148330SRaphael Isemann 
8039148330SRaphael Isemann   f.Clear(eFlag0);
8139148330SRaphael Isemann   EXPECT_FALSE(f.AnySet(eFlag0 | eFlag1));
8239148330SRaphael Isemann }
8339148330SRaphael Isemann 
8439148330SRaphael Isemann TEST(Flags, Test) {
8539148330SRaphael Isemann   Flags f;
8639148330SRaphael Isemann 
8739148330SRaphael Isemann   EXPECT_FALSE(f.Test(eFlag0));
8839148330SRaphael Isemann   EXPECT_FALSE(f.Test(eFlag1));
8939148330SRaphael Isemann   EXPECT_FALSE(f.Test(eFlag2));
9039148330SRaphael Isemann 
9139148330SRaphael Isemann   f.Set(eFlag0);
9239148330SRaphael Isemann   EXPECT_TRUE(f.Test(eFlag0));
9339148330SRaphael Isemann   EXPECT_FALSE(f.Test(eFlag1));
9439148330SRaphael Isemann   EXPECT_FALSE(f.Test(eFlag2));
9539148330SRaphael Isemann 
9639148330SRaphael Isemann   f.Set(eFlag1);
9739148330SRaphael Isemann   EXPECT_TRUE(f.Test(eFlag0));
9839148330SRaphael Isemann   EXPECT_TRUE(f.Test(eFlag1));
9939148330SRaphael Isemann   EXPECT_FALSE(f.Test(eFlag2));
10039148330SRaphael Isemann 
10139148330SRaphael Isemann   f.Clear(eFlag0);
10239148330SRaphael Isemann   EXPECT_FALSE(f.Test(eFlag0));
10339148330SRaphael Isemann   EXPECT_TRUE(f.Test(eFlag1));
10439148330SRaphael Isemann   EXPECT_FALSE(f.Test(eFlag2));
10539148330SRaphael Isemann 
10639148330SRaphael Isemann   // FIXME: Should Flags assert on Test(eFlag0 | eFlag1) (more than one bit)?
10739148330SRaphael Isemann }
10839148330SRaphael Isemann 
10939148330SRaphael Isemann TEST(Flags, AllClear) {
11039148330SRaphael Isemann   Flags f;
11139148330SRaphael Isemann 
11239148330SRaphael Isemann   EXPECT_TRUE(f.AllClear(eFlag0 | eFlag1));
11339148330SRaphael Isemann 
11439148330SRaphael Isemann   f.Set(eFlag0);
11539148330SRaphael Isemann   EXPECT_FALSE(f.AllClear(eFlag0 | eFlag1));
11639148330SRaphael Isemann 
11739148330SRaphael Isemann   f.Set(eFlag1);
11839148330SRaphael Isemann   f.Clear(eFlag0);
11939148330SRaphael Isemann   EXPECT_FALSE(f.AllClear(eFlag0 | eFlag1));
12039148330SRaphael Isemann 
12139148330SRaphael Isemann   f.Clear(eFlag1);
12239148330SRaphael Isemann   EXPECT_TRUE(f.AnyClear(eFlag0 | eFlag1));
12339148330SRaphael Isemann }
12439148330SRaphael Isemann 
12539148330SRaphael Isemann TEST(Flags, AnyClear) {
12639148330SRaphael Isemann   Flags f;
12739148330SRaphael Isemann   EXPECT_TRUE(f.AnyClear(eFlag0 | eFlag1));
12839148330SRaphael Isemann 
12939148330SRaphael Isemann   f.Set(eFlag0);
13039148330SRaphael Isemann   EXPECT_TRUE(f.AnyClear(eFlag0 | eFlag1));
13139148330SRaphael Isemann 
13239148330SRaphael Isemann   f.Set(eFlag1);
13339148330SRaphael Isemann   f.Set(eFlag0);
13439148330SRaphael Isemann   EXPECT_FALSE(f.AnyClear(eFlag0 | eFlag1));
13539148330SRaphael Isemann 
13639148330SRaphael Isemann   f.Clear(eFlag1);
13739148330SRaphael Isemann   EXPECT_TRUE(f.AnyClear(eFlag0 | eFlag1));
13839148330SRaphael Isemann 
13939148330SRaphael Isemann   f.Clear(eFlag0);
14039148330SRaphael Isemann   EXPECT_TRUE(f.AnyClear(eFlag0 | eFlag1));
14139148330SRaphael Isemann }
14239148330SRaphael Isemann 
14339148330SRaphael Isemann TEST(Flags, IsClear) {
14439148330SRaphael Isemann   Flags f;
14539148330SRaphael Isemann 
14639148330SRaphael Isemann   EXPECT_TRUE(f.IsClear(eFlag0));
14739148330SRaphael Isemann   EXPECT_TRUE(f.IsClear(eFlag1));
14839148330SRaphael Isemann 
14939148330SRaphael Isemann   f.Set(eFlag0);
15039148330SRaphael Isemann   EXPECT_FALSE(f.IsClear(eFlag0));
15139148330SRaphael Isemann   EXPECT_TRUE(f.IsClear(eFlag1));
15239148330SRaphael Isemann 
15339148330SRaphael Isemann   f.Set(eFlag1);
15439148330SRaphael Isemann   EXPECT_FALSE(f.IsClear(eFlag0));
15539148330SRaphael Isemann   EXPECT_FALSE(f.IsClear(eFlag1));
15639148330SRaphael Isemann 
15739148330SRaphael Isemann   f.Clear(eFlag0);
15839148330SRaphael Isemann   EXPECT_TRUE(f.IsClear(eFlag0));
15939148330SRaphael Isemann   EXPECT_FALSE(f.IsClear(eFlag1));
16039148330SRaphael Isemann 
16139148330SRaphael Isemann   f.Clear(eFlag1);
16239148330SRaphael Isemann   EXPECT_TRUE(f.IsClear(eFlag0));
16339148330SRaphael Isemann   EXPECT_TRUE(f.IsClear(eFlag1));
16439148330SRaphael Isemann }
16539148330SRaphael Isemann 
16639148330SRaphael Isemann TEST(Flags, ClearCount) {
16739148330SRaphael Isemann   Flags f;
16839148330SRaphael Isemann   EXPECT_EQ(32U, f.ClearCount());
16939148330SRaphael Isemann 
17039148330SRaphael Isemann   f.Set(eFlag0);
17139148330SRaphael Isemann   EXPECT_EQ(31U, f.ClearCount());
17239148330SRaphael Isemann 
17339148330SRaphael Isemann   f.Set(eFlag0);
17439148330SRaphael Isemann   EXPECT_EQ(31U, f.ClearCount());
17539148330SRaphael Isemann 
17639148330SRaphael Isemann   f.Set(eFlag1);
17739148330SRaphael Isemann   EXPECT_EQ(30U, f.ClearCount());
17839148330SRaphael Isemann 
17939148330SRaphael Isemann   f.Set(eAllFlags);
18039148330SRaphael Isemann   EXPECT_EQ(29U, f.ClearCount());
18139148330SRaphael Isemann }
18239148330SRaphael Isemann 
18339148330SRaphael Isemann TEST(Flags, SetCount) {
18439148330SRaphael Isemann   Flags f;
18539148330SRaphael Isemann   EXPECT_EQ(0U, f.SetCount());
18639148330SRaphael Isemann 
18739148330SRaphael Isemann   f.Set(eFlag0);
18839148330SRaphael Isemann   EXPECT_EQ(1U, f.SetCount());
18939148330SRaphael Isemann 
19039148330SRaphael Isemann   f.Set(eFlag0);
19139148330SRaphael Isemann   EXPECT_EQ(1U, f.SetCount());
19239148330SRaphael Isemann 
19339148330SRaphael Isemann   f.Set(eFlag1);
19439148330SRaphael Isemann   EXPECT_EQ(2U, f.SetCount());
19539148330SRaphael Isemann 
19639148330SRaphael Isemann   f.Set(eAllFlags);
19739148330SRaphael Isemann   EXPECT_EQ(3U, f.SetCount());
19839148330SRaphael Isemann }
199