blob: 6f19399dc21b3665be213f581323fbb80526f7ce [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// Copyright 2014 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Emily Bernierd0a1eb72015-03-24 16:35:39 -04005#include <stdint.h>
Ben Murdochb8a8cc12014-11-26 15:28:44 +00006#include "src/base/flags.h"
7#include "testing/gtest/include/gtest/gtest.h"
8
9namespace v8 {
10namespace base {
11
12namespace {
13
14enum Flag1 {
15 kFlag1None = 0,
16 kFlag1First = 1u << 1,
17 kFlag1Second = 1u << 2,
18 kFlag1All = kFlag1None | kFlag1First | kFlag1Second
19};
20typedef Flags<Flag1> Flags1;
21
22
23DEFINE_OPERATORS_FOR_FLAGS(Flags1)
24
25
26Flags1 bar(Flags1 flags1) { return flags1; }
27
28} // namespace
29
30
31TEST(FlagsTest, BasicOperations) {
32 Flags1 a;
33 EXPECT_EQ(kFlag1None, static_cast<int>(a));
34 a |= kFlag1First;
35 EXPECT_EQ(kFlag1First, static_cast<int>(a));
36 a = a | kFlag1Second;
37 EXPECT_EQ(kFlag1All, static_cast<int>(a));
38 a &= kFlag1Second;
39 EXPECT_EQ(kFlag1Second, static_cast<int>(a));
40 a = kFlag1None & a;
41 EXPECT_EQ(kFlag1None, static_cast<int>(a));
42 a ^= (kFlag1All | kFlag1None);
43 EXPECT_EQ(kFlag1All, static_cast<int>(a));
44 Flags1 b = ~a;
45 EXPECT_EQ(kFlag1All, static_cast<int>(a));
46 EXPECT_EQ(~static_cast<int>(a), static_cast<int>(b));
47 Flags1 c = a;
48 EXPECT_EQ(a, c);
49 EXPECT_NE(a, b);
50 EXPECT_EQ(a, bar(a));
51 EXPECT_EQ(a, bar(kFlag1All));
52}
53
54
55namespace {
56namespace foo {
57
58enum Option {
59 kNoOptions = 0,
60 kOption1 = 1,
61 kOption2 = 2,
62 kAllOptions = kNoOptions | kOption1 | kOption2
63};
64typedef Flags<Option> Options;
65
66} // namespace foo
67
68
69DEFINE_OPERATORS_FOR_FLAGS(foo::Options)
70
71} // namespace
72
73
74TEST(FlagsTest, NamespaceScope) {
75 foo::Options options;
76 options ^= foo::kNoOptions;
77 options |= foo::kOption1 | foo::kOption2;
78 EXPECT_EQ(foo::kAllOptions, static_cast<int>(options));
79}
80
81
82namespace {
83
84struct Foo {
85 enum Enum { kEnum1 = 1, kEnum2 = 2 };
86 typedef Flags<Enum, uint32_t> Enums;
87};
88
89
90DEFINE_OPERATORS_FOR_FLAGS(Foo::Enums)
91
92} // namespace
93
94
95TEST(FlagsTest, ClassScope) {
96 Foo::Enums enums;
97 enums |= Foo::kEnum1;
98 enums |= Foo::kEnum2;
99 EXPECT_TRUE(enums & Foo::kEnum1);
100 EXPECT_TRUE(enums & Foo::kEnum2);
101}
102
103} // namespace base
104} // namespace v8