Adding 'compound assignment union operator' for folly::WriteFlags enum class
[folly.git] / folly / io / async / test / WriteFlagsTest.cpp
1 /*
2  * Copyright 2017 Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #include <folly/io/async/AsyncTransport.h>
17
18 //#include <folly/io/async/test/MockAsyncTransport.h>
19 #include <folly/portability/GTest.h>
20
21 using namespace testing;
22
23 namespace folly {
24
25 TEST(WriteFlagsTest, isSet) {
26   WriteFlags flags = WriteFlags::NONE;
27   ASSERT_FALSE(isSet(flags, WriteFlags::CORK));
28   ASSERT_FALSE(isSet(flags, WriteFlags::EOR));
29
30   flags = WriteFlags::CORK;
31   ASSERT_TRUE(isSet(flags, WriteFlags::CORK));
32   ASSERT_FALSE(isSet(flags, WriteFlags::EOR));
33
34   flags = static_cast<WriteFlags>(
35       static_cast<uint32_t>(WriteFlags::CORK) |
36       static_cast<uint32_t>(WriteFlags::EOR));
37   ASSERT_TRUE(isSet(flags, WriteFlags::CORK));
38   ASSERT_TRUE(isSet(flags, WriteFlags::EOR));
39 }
40
41 TEST(WriteFlagsTest, unionOperator) {
42   WriteFlags flags = WriteFlags::CORK | WriteFlags::NONE;
43   ASSERT_EQ(flags, WriteFlags::CORK);
44
45   flags = static_cast<WriteFlags>(
46       static_cast<uint32_t>(WriteFlags::CORK) |
47       static_cast<uint32_t>(WriteFlags::EOR));
48   ASSERT_EQ(flags, WriteFlags::CORK | WriteFlags::EOR);
49 }
50
51 TEST(WriteFlagsTest, intersectionOperator) {
52   ASSERT_EQ(WriteFlags::NONE & WriteFlags::CORK, WriteFlags::NONE);
53
54   WriteFlags flags =
55       WriteFlags::CORK | WriteFlags::EOR | WriteFlags::WRITE_SHUTDOWN;
56   ASSERT_EQ(flags & WriteFlags::CORK, WriteFlags::CORK);
57   ASSERT_EQ(flags & WriteFlags::EOR, WriteFlags::EOR);
58   ASSERT_EQ(flags & WriteFlags::WRITE_SHUTDOWN, WriteFlags::WRITE_SHUTDOWN);
59 }
60
61 TEST(WriteFlagsTest, exclusionOperator) {
62   ASSERT_FALSE(isSet(~WriteFlags::CORK, WriteFlags::CORK));
63   ASSERT_TRUE(isSet(~WriteFlags::CORK, WriteFlags::EOR));
64   ASSERT_TRUE(isSet(~WriteFlags::CORK, WriteFlags::WRITE_SHUTDOWN));
65
66   ASSERT_FALSE(isSet(~WriteFlags::EOR, WriteFlags::EOR));
67   ASSERT_TRUE(isSet(~WriteFlags::EOR, WriteFlags::CORK));
68   ASSERT_TRUE(isSet(~WriteFlags::EOR, WriteFlags::WRITE_SHUTDOWN));
69 }
70
71 TEST(WriteFlagsTest, unsetOperator) {
72   WriteFlags flags =
73       WriteFlags::CORK | WriteFlags::EOR | WriteFlags::WRITE_SHUTDOWN;
74   ASSERT_TRUE(isSet(flags, WriteFlags::CORK));
75   ASSERT_TRUE(isSet(flags, WriteFlags::EOR));
76   ASSERT_TRUE(isSet(flags, WriteFlags::WRITE_SHUTDOWN));
77
78   flags = WriteFlags::CORK;
79   ASSERT_TRUE(isSet(flags, WriteFlags::CORK));
80   ASSERT_FALSE(isSet(flags, WriteFlags::EOR));
81   ASSERT_FALSE(isSet(flags, WriteFlags::WRITE_SHUTDOWN));
82 }
83
84 TEST(WriteFlagsTest, compoundAssignmentUnionOperator) {
85   WriteFlags flags = WriteFlags::NONE;
86   flags |= WriteFlags::CORK;
87   ASSERT_EQ(flags, WriteFlags::CORK);
88
89   flags = WriteFlags::CORK;
90   flags |= WriteFlags::EOR;
91   ASSERT_EQ(flags, WriteFlags::CORK | WriteFlags::EOR);
92
93   flags = WriteFlags::CORK | WriteFlags::EOR;
94   flags |= WriteFlags::CORK;
95   ASSERT_EQ(flags, WriteFlags::CORK | WriteFlags::EOR);
96 }
97
98 TEST(WriteFlagsTest, compoundAssignmentIntersectionOperator) {
99   WriteFlags flags = WriteFlags::CORK | WriteFlags::EOR;
100   flags &= WriteFlags::CORK;
101   ASSERT_EQ(flags, WriteFlags::CORK);
102
103   flags = WriteFlags::CORK | WriteFlags::EOR;
104   flags &= WriteFlags::EOR;
105   ASSERT_EQ(flags, WriteFlags::EOR);
106
107   flags = WriteFlags::NONE;
108   flags &= WriteFlags::EOR;
109   ASSERT_EQ(flags, WriteFlags::NONE);
110 }
111
112 } // namespace