blob: 6f19399dc21b3665be213f581323fbb80526f7ce [file] [log] [blame]
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stdint.h>
#include "src/base/flags.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace v8 {
namespace base {
namespace {
enum Flag1 {
kFlag1None = 0,
kFlag1First = 1u << 1,
kFlag1Second = 1u << 2,
kFlag1All = kFlag1None | kFlag1First | kFlag1Second
};
typedef Flags<Flag1> Flags1;
DEFINE_OPERATORS_FOR_FLAGS(Flags1)
Flags1 bar(Flags1 flags1) { return flags1; }
} // namespace
TEST(FlagsTest, BasicOperations) {
Flags1 a;
EXPECT_EQ(kFlag1None, static_cast<int>(a));
a |= kFlag1First;
EXPECT_EQ(kFlag1First, static_cast<int>(a));
a = a | kFlag1Second;
EXPECT_EQ(kFlag1All, static_cast<int>(a));
a &= kFlag1Second;
EXPECT_EQ(kFlag1Second, static_cast<int>(a));
a = kFlag1None & a;
EXPECT_EQ(kFlag1None, static_cast<int>(a));
a ^= (kFlag1All | kFlag1None);
EXPECT_EQ(kFlag1All, static_cast<int>(a));
Flags1 b = ~a;
EXPECT_EQ(kFlag1All, static_cast<int>(a));
EXPECT_EQ(~static_cast<int>(a), static_cast<int>(b));
Flags1 c = a;
EXPECT_EQ(a, c);
EXPECT_NE(a, b);
EXPECT_EQ(a, bar(a));
EXPECT_EQ(a, bar(kFlag1All));
}
namespace {
namespace foo {
enum Option {
kNoOptions = 0,
kOption1 = 1,
kOption2 = 2,
kAllOptions = kNoOptions | kOption1 | kOption2
};
typedef Flags<Option> Options;
} // namespace foo
DEFINE_OPERATORS_FOR_FLAGS(foo::Options)
} // namespace
TEST(FlagsTest, NamespaceScope) {
foo::Options options;
options ^= foo::kNoOptions;
options |= foo::kOption1 | foo::kOption2;
EXPECT_EQ(foo::kAllOptions, static_cast<int>(options));
}
namespace {
struct Foo {
enum Enum { kEnum1 = 1, kEnum2 = 2 };
typedef Flags<Enum, uint32_t> Enums;
};
DEFINE_OPERATORS_FOR_FLAGS(Foo::Enums)
} // namespace
TEST(FlagsTest, ClassScope) {
Foo::Enums enums;
enums |= Foo::kEnum1;
enums |= Foo::kEnum2;
EXPECT_TRUE(enums & Foo::kEnum1);
EXPECT_TRUE(enums & Foo::kEnum2);
}
} // namespace base
} // namespace v8