test_policy.cpp
Go to the documentation of this file.
1 // Copyright 2024 Ekumen, Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include <gmock/gmock.h>
16 #include <gtest/gtest.h>
17 
18 #include <functional>
19 
21 
22 namespace {
23 
24 using testing::Return;
25 
26 struct MockPredicate {
27  MOCK_METHOD(bool, eval, ());
28  bool operator()() { return eval(); }
29  auto policy() { return beluga::make_policy(std::ref(*this)); }
30 };
31 
32 TEST(Policy, AndTrue) {
33  MockPredicate condition1;
34  MockPredicate condition2;
35  auto combined = condition1.policy() && condition2.policy();
36  EXPECT_CALL(condition1, eval()).WillOnce(Return(true));
37  EXPECT_CALL(condition2, eval()).WillOnce(Return(true));
38  ASSERT_TRUE(combined());
39 }
40 
41 TEST(Policy, AndFalseShortCircuit) {
42  MockPredicate condition1;
43  MockPredicate condition2;
44  auto combined = condition1.policy() && condition2.policy();
45  EXPECT_CALL(condition1, eval()).WillOnce(Return(false));
46  EXPECT_CALL(condition2, eval()).Times(0);
47  ASSERT_FALSE(combined());
48 }
49 
50 TEST(Policy, AndFalse) {
51  MockPredicate condition1;
52  MockPredicate condition2;
53  auto combined = condition1.policy() & condition2.policy();
54  EXPECT_CALL(condition1, eval()).WillOnce(Return(false));
55  EXPECT_CALL(condition2, eval()).WillOnce(Return(true));
56  ASSERT_FALSE(combined());
57 }
58 
59 TEST(Policy, OrFalse) {
60  MockPredicate condition1;
61  MockPredicate condition2;
62  auto combined = condition1.policy() || condition2.policy();
63  EXPECT_CALL(condition1, eval()).WillOnce(Return(false));
64  EXPECT_CALL(condition2, eval()).WillOnce(Return(false));
65  ASSERT_FALSE(combined());
66 }
67 
68 TEST(Policy, OrTrueShortCircuit) {
69  MockPredicate condition1;
70  MockPredicate condition2;
71  auto combined = condition1.policy() || condition2.policy();
72  EXPECT_CALL(condition1, eval()).WillOnce(Return(true));
73  EXPECT_CALL(condition2, eval()).Times(0);
74  ASSERT_TRUE(combined());
75 }
76 
77 TEST(Policy, OrTrue) {
78  MockPredicate condition1;
79  MockPredicate condition2;
80  auto combined = condition1.policy() | condition2.policy();
81  EXPECT_CALL(condition1, eval()).WillOnce(Return(true));
82  EXPECT_CALL(condition2, eval()).WillOnce(Return(false));
83  ASSERT_TRUE(combined());
84 }
85 
86 TEST(Policy, Not) {
87  MockPredicate condition;
88  auto negated = !condition.policy();
89  EXPECT_CALL(condition, eval()).WillOnce(Return(false));
90  ASSERT_TRUE(negated());
91  EXPECT_CALL(condition, eval()).WillOnce(Return(true));
92  ASSERT_FALSE(negated());
93 }
94 
95 TEST(Policy, SameArgumentCombinations) {
96  auto is_even = beluga::make_policy([](int n) { return n % 2 == 0; });
97  auto never = beluga::make_policy([](int) { return false; });
98  auto policy1 = is_even || never;
99  ASSERT_TRUE(policy1(2));
100  ASSERT_FALSE(policy1(3));
101  auto policy2 = never || is_even;
102  ASSERT_TRUE(policy2(2));
103  ASSERT_FALSE(policy2(3));
104 }
105 
106 TEST(Policy, DifferentArgumentCombinations) {
107  auto is_even = beluga::make_policy([](int n) { return n % 2 == 0; });
108  auto always = beluga::make_policy([]() { return true; });
109  auto policy1 = is_even && always;
110  ASSERT_TRUE(policy1(2));
111  ASSERT_FALSE(policy1(3));
112  auto policy2 = always && is_even;
113  ASSERT_TRUE(policy2(2));
114  ASSERT_FALSE(policy2(3));
115 }
116 
117 TEST(Policy, AnyAssignment) {
119  policy = beluga::make_policy([](double value) { return value > 0.0; });
120  ASSERT_TRUE(policy(1.0));
121  ASSERT_FALSE(policy(-1.0));
122  policy = beluga::make_policy([]() { return true; });
123  ASSERT_TRUE(policy(1.0));
124  ASSERT_TRUE(policy(-1.0));
125 }
126 
127 TEST(Policy, AnyComposition) {
129  policy = beluga::make_policy([](double value) { return value > 0.0; });
130  ASSERT_TRUE(policy(1.0));
131  ASSERT_FALSE(policy(-1.0));
132  policy = policy && beluga::make_policy([]() { return true; });
133  ASSERT_TRUE(policy(1.0));
134  ASSERT_FALSE(policy(-1.0));
135 }
136 
137 } // namespace
beluga::make_policy
constexpr detail::make_policy_fn make_policy
Make policy function objects.
Definition: policy.hpp:42
policy.hpp
beluga::policy
Forward declaration of policy.
Definition: policy.hpp:24
beluga::TEST
TEST(Bresenham, MultiPassGuarantee)
Definition: test_bresenham.cpp:27


beluga
Author(s):
autogenerated on Tue Jul 16 2024 02:59:53