15 #include <gmock/gmock.h>
16 #include <gtest/gtest.h>
24 using testing::Return;
26 struct MockPredicate {
27 MOCK_METHOD(
bool, eval, ());
28 bool operator()() {
return eval(); }
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());
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());
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());
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());
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());
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());
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());
95 TEST(Policy, SameArgumentCombinations) {
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));
106 TEST(Policy, DifferentArgumentCombinations) {
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));
117 TEST(Policy, AnyAssignment) {
120 ASSERT_TRUE(policy(1.0));
121 ASSERT_FALSE(policy(-1.0));
123 ASSERT_TRUE(policy(1.0));
124 ASSERT_TRUE(policy(-1.0));
127 TEST(Policy, AnyComposition) {
130 ASSERT_TRUE(policy(1.0));
131 ASSERT_FALSE(policy(-1.0));
133 ASSERT_TRUE(policy(1.0));
134 ASSERT_FALSE(policy(-1.0));