1*61c4878aSAndroid Build Coastguard Worker // Copyright 2020 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker // This test directly verifies the facade logic, by leveraging a fake backend
16*61c4878aSAndroid Build Coastguard Worker // that captures arguments and returns rather than aborting execution.
17*61c4878aSAndroid Build Coastguard Worker
18*61c4878aSAndroid Build Coastguard Worker #include "pw_assert_test/fake_backend.h"
19*61c4878aSAndroid Build Coastguard Worker
20*61c4878aSAndroid Build Coastguard Worker // This directly includes the assert facade implementation header rather than
21*61c4878aSAndroid Build Coastguard Worker // going through the backend header indirection mechanism, to prevent the real
22*61c4878aSAndroid Build Coastguard Worker // assert backend from triggering.
23*61c4878aSAndroid Build Coastguard Worker //
24*61c4878aSAndroid Build Coastguard Worker // clang-format off
25*61c4878aSAndroid Build Coastguard Worker #include "pw_assert/internal/check_impl.h"
26*61c4878aSAndroid Build Coastguard Worker // clang-format on
27*61c4878aSAndroid Build Coastguard Worker
28*61c4878aSAndroid Build Coastguard Worker #include "pw_compilation_testing/negative_compilation.h"
29*61c4878aSAndroid Build Coastguard Worker #include "pw_result/result.h"
30*61c4878aSAndroid Build Coastguard Worker #include "pw_status/status.h"
31*61c4878aSAndroid Build Coastguard Worker #include "pw_status/status_with_size.h"
32*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
33*61c4878aSAndroid Build Coastguard Worker
34*61c4878aSAndroid Build Coastguard Worker namespace {
35*61c4878aSAndroid Build Coastguard Worker
36*61c4878aSAndroid Build Coastguard Worker #define EXPECT_MESSAGE(expected_assert_message) \
37*61c4878aSAndroid Build Coastguard Worker do { \
38*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ(pw_captured_assert.message, expected_assert_message); \
39*61c4878aSAndroid Build Coastguard Worker } while (0)
40*61c4878aSAndroid Build Coastguard Worker
41*61c4878aSAndroid Build Coastguard Worker class AssertFailTest : public ::testing::Test {
42*61c4878aSAndroid Build Coastguard Worker protected:
SetUp()43*61c4878aSAndroid Build Coastguard Worker void SetUp() override { pw_captured_assert.triggered = 0; }
TearDown()44*61c4878aSAndroid Build Coastguard Worker void TearDown() override { EXPECT_EQ(pw_captured_assert.triggered, 1); }
45*61c4878aSAndroid Build Coastguard Worker };
46*61c4878aSAndroid Build Coastguard Worker
47*61c4878aSAndroid Build Coastguard Worker class AssertPassTest : public ::testing::Test {
48*61c4878aSAndroid Build Coastguard Worker protected:
SetUp()49*61c4878aSAndroid Build Coastguard Worker void SetUp() override { pw_captured_assert.triggered = 0; }
TearDown()50*61c4878aSAndroid Build Coastguard Worker void TearDown() override { EXPECT_EQ(pw_captured_assert.triggered, 0); }
51*61c4878aSAndroid Build Coastguard Worker };
52*61c4878aSAndroid Build Coastguard Worker
53*61c4878aSAndroid Build Coastguard Worker // PW_CRASH(...)
TEST_F(AssertFailTest,CrashMessageNoArguments)54*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, CrashMessageNoArguments) {
55*61c4878aSAndroid Build Coastguard Worker PW_CRASH("Goodbye");
56*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Goodbye");
57*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,CrashMessageWithArguments)58*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, CrashMessageWithArguments) {
59*61c4878aSAndroid Build Coastguard Worker PW_CRASH("Goodbye cruel %s", "world");
60*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Goodbye cruel world");
61*61c4878aSAndroid Build Coastguard Worker }
62*61c4878aSAndroid Build Coastguard Worker
63*61c4878aSAndroid Build Coastguard Worker // PW_CHECK(...) - No message
TEST_F(AssertPassTest,CheckNoMessage)64*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, CheckNoMessage) { PW_CHECK(true); }
TEST_F(AssertFailTest,CheckNoMessage)65*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, CheckNoMessage) {
66*61c4878aSAndroid Build Coastguard Worker PW_CHECK(false);
67*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: false. ");
68*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertPassTest,CheckNoMessageComplexExpression)69*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, CheckNoMessageComplexExpression) { PW_CHECK(2 == 2); }
TEST_F(AssertFailTest,CheckNoMessageComplexExpression)70*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, CheckNoMessageComplexExpression) {
71*61c4878aSAndroid Build Coastguard Worker PW_CHECK(1 == 2);
72*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: 1 == 2. ");
73*61c4878aSAndroid Build Coastguard Worker }
74*61c4878aSAndroid Build Coastguard Worker
75*61c4878aSAndroid Build Coastguard Worker // PW_CHECK(..., msg) - With message; with and without arguments.
TEST_F(AssertPassTest,CheckMessageNoArguments)76*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, CheckMessageNoArguments) { PW_CHECK(true, "Hello"); }
TEST_F(AssertFailTest,CheckMessageNoArguments)77*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, CheckMessageNoArguments) {
78*61c4878aSAndroid Build Coastguard Worker PW_CHECK(false, "Hello");
79*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: false. Hello");
80*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertPassTest,CheckMessageWithArguments)81*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, CheckMessageWithArguments) {
82*61c4878aSAndroid Build Coastguard Worker PW_CHECK(true, "Hello %d", 5);
83*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,CheckMessageWithArguments)84*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, CheckMessageWithArguments) {
85*61c4878aSAndroid Build Coastguard Worker PW_CHECK(false, "Hello %d", 5);
86*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: false. Hello 5");
87*61c4878aSAndroid Build Coastguard Worker }
88*61c4878aSAndroid Build Coastguard Worker
89*61c4878aSAndroid Build Coastguard Worker // PW_CHECK_INT_*(...)
90*61c4878aSAndroid Build Coastguard Worker // Binary checks with ints, comparisons: <, <=, =, !=, >, >=.
91*61c4878aSAndroid Build Coastguard Worker
92*61c4878aSAndroid Build Coastguard Worker // Test message formatting separate from the triggering.
93*61c4878aSAndroid Build Coastguard Worker // Only test formatting for the type once.
TEST_F(AssertFailTest,IntLessThanNoMessageNoArguments)94*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, IntLessThanNoMessageNoArguments) {
95*61c4878aSAndroid Build Coastguard Worker PW_CHECK_INT_LT(5, -2);
96*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: 5 (=5) < -2 (=-2). ");
97*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,IntLessThanMessageNoArguments)98*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, IntLessThanMessageNoArguments) {
99*61c4878aSAndroid Build Coastguard Worker PW_CHECK_INT_LT(5, -2, "msg");
100*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: 5 (=5) < -2 (=-2). msg");
101*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,IntLessThanMessageArguments)102*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, IntLessThanMessageArguments) {
103*61c4878aSAndroid Build Coastguard Worker PW_CHECK_INT_LT(5, -2, "msg: %d", 6);
104*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: 5 (=5) < -2 (=-2). msg: 6");
105*61c4878aSAndroid Build Coastguard Worker }
106*61c4878aSAndroid Build Coastguard Worker
107*61c4878aSAndroid Build Coastguard Worker // Test comparison boundaries.
108*61c4878aSAndroid Build Coastguard Worker
109*61c4878aSAndroid Build Coastguard Worker // INT <
TEST_F(AssertPassTest,IntLt1)110*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, IntLt1) { PW_CHECK_INT_LT(-1, 2); }
TEST_F(AssertPassTest,IntLt2)111*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, IntLt2) { PW_CHECK_INT_LT(1, 2); }
TEST_F(AssertFailTest,IntLt3)112*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, IntLt3) { PW_CHECK_INT_LT(-1, -2); }
TEST_F(AssertFailTest,IntLt4)113*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, IntLt4) { PW_CHECK_INT_LT(1, 1); }
114*61c4878aSAndroid Build Coastguard Worker
115*61c4878aSAndroid Build Coastguard Worker // INT <=
TEST_F(AssertPassTest,IntLe1)116*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, IntLe1) { PW_CHECK_INT_LE(-1, 2); }
TEST_F(AssertPassTest,IntLe2)117*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, IntLe2) { PW_CHECK_INT_LE(1, 2); }
TEST_F(AssertFailTest,IntLe3)118*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, IntLe3) { PW_CHECK_INT_LE(-1, -2); }
TEST_F(AssertPassTest,IntLe4)119*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, IntLe4) { PW_CHECK_INT_LE(1, 1); }
120*61c4878aSAndroid Build Coastguard Worker
121*61c4878aSAndroid Build Coastguard Worker // INT ==
TEST_F(AssertFailTest,IntEq1)122*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, IntEq1) { PW_CHECK_INT_EQ(-1, 2); }
TEST_F(AssertFailTest,IntEq2)123*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, IntEq2) { PW_CHECK_INT_EQ(1, 2); }
TEST_F(AssertFailTest,IntEq3)124*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, IntEq3) { PW_CHECK_INT_EQ(-1, -2); }
TEST_F(AssertPassTest,IntEq4)125*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, IntEq4) { PW_CHECK_INT_EQ(1, 1); }
126*61c4878aSAndroid Build Coastguard Worker
127*61c4878aSAndroid Build Coastguard Worker // INT !=
TEST_F(AssertPassTest,IntNe1)128*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, IntNe1) { PW_CHECK_INT_NE(-1, 2); }
TEST_F(AssertPassTest,IntNe2)129*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, IntNe2) { PW_CHECK_INT_NE(1, 2); }
TEST_F(AssertPassTest,IntNe3)130*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, IntNe3) { PW_CHECK_INT_NE(-1, -2); }
TEST_F(AssertFailTest,IntNe4)131*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, IntNe4) { PW_CHECK_INT_NE(1, 1); }
132*61c4878aSAndroid Build Coastguard Worker
133*61c4878aSAndroid Build Coastguard Worker // INT >
TEST_F(AssertFailTest,IntGt1)134*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, IntGt1) { PW_CHECK_INT_GT(-1, 2); }
TEST_F(AssertFailTest,IntGt2)135*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, IntGt2) { PW_CHECK_INT_GT(1, 2); }
TEST_F(AssertPassTest,IntGt3)136*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, IntGt3) { PW_CHECK_INT_GT(-1, -2); }
TEST_F(AssertFailTest,IntGt4)137*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, IntGt4) { PW_CHECK_INT_GT(1, 1); }
138*61c4878aSAndroid Build Coastguard Worker
139*61c4878aSAndroid Build Coastguard Worker // INT >=
TEST_F(AssertFailTest,IntGe1)140*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, IntGe1) { PW_CHECK_INT_GE(-1, 2); }
TEST_F(AssertFailTest,IntGe2)141*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, IntGe2) { PW_CHECK_INT_GE(1, 2); }
TEST_F(AssertPassTest,IntGe3)142*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, IntGe3) { PW_CHECK_INT_GE(-1, -2); }
TEST_F(AssertPassTest,IntGe4)143*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, IntGe4) { PW_CHECK_INT_GE(1, 1); }
144*61c4878aSAndroid Build Coastguard Worker
145*61c4878aSAndroid Build Coastguard Worker // PW_CHECK_UINT_*(...)
146*61c4878aSAndroid Build Coastguard Worker // Binary checks with uints, comparisons: <, <=, =, !=, >, >=.
147*61c4878aSAndroid Build Coastguard Worker
148*61c4878aSAndroid Build Coastguard Worker // Test message formatting separate from the triggering.
149*61c4878aSAndroid Build Coastguard Worker // Only test formatting for the type once.
TEST_F(AssertFailTest,UintLessThanNoMessageNoArguments)150*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, UintLessThanNoMessageNoArguments) {
151*61c4878aSAndroid Build Coastguard Worker PW_CHECK_UINT_LT(5, 2);
152*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: 5 (=5) < 2 (=2). ");
153*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,UintLessThanMessageNoArguments)154*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, UintLessThanMessageNoArguments) {
155*61c4878aSAndroid Build Coastguard Worker PW_CHECK_UINT_LT(5, 2, "msg");
156*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: 5 (=5) < 2 (=2). msg");
157*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,UintLessThanMessageArguments)158*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, UintLessThanMessageArguments) {
159*61c4878aSAndroid Build Coastguard Worker PW_CHECK_UINT_LT(5, 2, "msg: %d", 6);
160*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: 5 (=5) < 2 (=2). msg: 6");
161*61c4878aSAndroid Build Coastguard Worker }
162*61c4878aSAndroid Build Coastguard Worker
163*61c4878aSAndroid Build Coastguard Worker // Test comparison boundaries.
164*61c4878aSAndroid Build Coastguard Worker
165*61c4878aSAndroid Build Coastguard Worker // UINT <
TEST_F(AssertPassTest,UintLt1)166*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, UintLt1) { PW_CHECK_UINT_LT(1, 2); }
TEST_F(AssertFailTest,UintLt2)167*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, UintLt2) { PW_CHECK_UINT_LT(2, 2); }
TEST_F(AssertFailTest,UintLt3)168*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, UintLt3) { PW_CHECK_UINT_LT(2, 1); }
169*61c4878aSAndroid Build Coastguard Worker
170*61c4878aSAndroid Build Coastguard Worker // UINT <=
TEST_F(AssertPassTest,UintLe1)171*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, UintLe1) { PW_CHECK_UINT_LE(1, 2); }
TEST_F(AssertPassTest,UintLe2)172*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, UintLe2) { PW_CHECK_UINT_LE(2, 2); }
TEST_F(AssertFailTest,UintLe3)173*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, UintLe3) { PW_CHECK_UINT_LE(2, 1); }
174*61c4878aSAndroid Build Coastguard Worker
175*61c4878aSAndroid Build Coastguard Worker // UINT ==
TEST_F(AssertFailTest,UintEq1)176*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, UintEq1) { PW_CHECK_UINT_EQ(1, 2); }
TEST_F(AssertPassTest,UintEq2)177*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, UintEq2) { PW_CHECK_UINT_EQ(2, 2); }
TEST_F(AssertFailTest,UintEq3)178*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, UintEq3) { PW_CHECK_UINT_EQ(2, 1); }
179*61c4878aSAndroid Build Coastguard Worker
180*61c4878aSAndroid Build Coastguard Worker // UINT !=
TEST_F(AssertPassTest,UintNe1)181*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, UintNe1) { PW_CHECK_UINT_NE(1, 2); }
TEST_F(AssertFailTest,UintNe2)182*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, UintNe2) { PW_CHECK_UINT_NE(2, 2); }
TEST_F(AssertPassTest,UintNe3)183*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, UintNe3) { PW_CHECK_UINT_NE(2, 1); }
184*61c4878aSAndroid Build Coastguard Worker
185*61c4878aSAndroid Build Coastguard Worker // UINT >
TEST_F(AssertFailTest,UintGt1)186*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, UintGt1) { PW_CHECK_UINT_GT(1, 2); }
TEST_F(AssertFailTest,UintGt2)187*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, UintGt2) { PW_CHECK_UINT_GT(2, 2); }
TEST_F(AssertPassTest,UintGt3)188*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, UintGt3) { PW_CHECK_UINT_GT(2, 1); }
189*61c4878aSAndroid Build Coastguard Worker
190*61c4878aSAndroid Build Coastguard Worker // UINT >=
TEST_F(AssertFailTest,UintGe1)191*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, UintGe1) { PW_CHECK_UINT_GE(1, 2); }
TEST_F(AssertPassTest,UintGe2)192*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, UintGe2) { PW_CHECK_UINT_GE(2, 2); }
TEST_F(AssertPassTest,UintGe3)193*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, UintGe3) { PW_CHECK_UINT_GE(2, 1); }
194*61c4878aSAndroid Build Coastguard Worker
195*61c4878aSAndroid Build Coastguard Worker // PW_CHECK_PTR_*(...)
196*61c4878aSAndroid Build Coastguard Worker // Binary checks with uints, comparisons: <, <=, =, !=, >, >=.
197*61c4878aSAndroid Build Coastguard Worker // Note: The format checks are skipped since they're not portable.
198*61c4878aSAndroid Build Coastguard Worker
199*61c4878aSAndroid Build Coastguard Worker // Test comparison boundaries.
200*61c4878aSAndroid Build Coastguard Worker
201*61c4878aSAndroid Build Coastguard Worker // PTR <
TEST_F(AssertPassTest,PtrLt1)202*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, PtrLt1) {
203*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_LT(reinterpret_cast<void*>(0xa), reinterpret_cast<void*>(0xb));
204*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,PtrLt2)205*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, PtrLt2) {
206*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_LT(reinterpret_cast<void*>(0xb), reinterpret_cast<void*>(0xb));
207*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,PtrLt3)208*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, PtrLt3) {
209*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_LT(reinterpret_cast<void*>(0xb), reinterpret_cast<void*>(0xa));
210*61c4878aSAndroid Build Coastguard Worker }
211*61c4878aSAndroid Build Coastguard Worker
212*61c4878aSAndroid Build Coastguard Worker // PTR <=
TEST_F(AssertPassTest,PtrLe1)213*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, PtrLe1) {
214*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_LE(reinterpret_cast<void*>(0xa), reinterpret_cast<void*>(0xb));
215*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertPassTest,PtrLe2)216*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, PtrLe2) {
217*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_LE(reinterpret_cast<void*>(0xb), reinterpret_cast<void*>(0xb));
218*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,PtrLe3)219*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, PtrLe3) {
220*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_LE(reinterpret_cast<void*>(0xb), reinterpret_cast<void*>(0xa));
221*61c4878aSAndroid Build Coastguard Worker }
222*61c4878aSAndroid Build Coastguard Worker
223*61c4878aSAndroid Build Coastguard Worker // PTR ==
TEST_F(AssertFailTest,PtrEq1)224*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, PtrEq1) {
225*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_EQ(reinterpret_cast<void*>(0xa), reinterpret_cast<void*>(0xb));
226*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertPassTest,PtrEq2)227*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, PtrEq2) {
228*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_EQ(reinterpret_cast<void*>(0xb), reinterpret_cast<void*>(0xb));
229*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,PtrEq3)230*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, PtrEq3) {
231*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_EQ(reinterpret_cast<void*>(0xb), reinterpret_cast<void*>(0xa));
232*61c4878aSAndroid Build Coastguard Worker }
233*61c4878aSAndroid Build Coastguard Worker
234*61c4878aSAndroid Build Coastguard Worker // PTR !=
TEST_F(AssertPassTest,PtrNe1)235*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, PtrNe1) {
236*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_NE(reinterpret_cast<void*>(0xa), reinterpret_cast<void*>(0xb));
237*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,PtrNe2)238*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, PtrNe2) {
239*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_NE(reinterpret_cast<void*>(0xb), reinterpret_cast<void*>(0xb));
240*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertPassTest,PtrNe3)241*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, PtrNe3) {
242*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_NE(reinterpret_cast<void*>(0xb), reinterpret_cast<void*>(0xa));
243*61c4878aSAndroid Build Coastguard Worker }
244*61c4878aSAndroid Build Coastguard Worker
245*61c4878aSAndroid Build Coastguard Worker // PTR >
TEST_F(AssertFailTest,PtrGt1)246*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, PtrGt1) {
247*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_GT(reinterpret_cast<void*>(0xa), reinterpret_cast<void*>(0xb));
248*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,PtrGt2)249*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, PtrGt2) {
250*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_GT(reinterpret_cast<void*>(0xb), reinterpret_cast<void*>(0xb));
251*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertPassTest,PtrGt3)252*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, PtrGt3) {
253*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_GT(reinterpret_cast<void*>(0xb), reinterpret_cast<void*>(0xa));
254*61c4878aSAndroid Build Coastguard Worker }
255*61c4878aSAndroid Build Coastguard Worker
256*61c4878aSAndroid Build Coastguard Worker // PTR >=
TEST_F(AssertFailTest,PtrGe1)257*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, PtrGe1) {
258*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_GE(reinterpret_cast<void*>(0xa), reinterpret_cast<void*>(0xb));
259*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertPassTest,PtrGe2)260*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, PtrGe2) {
261*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_GE(reinterpret_cast<void*>(0xb), reinterpret_cast<void*>(0xb));
262*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertPassTest,PtrGe3)263*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, PtrGe3) {
264*61c4878aSAndroid Build Coastguard Worker PW_CHECK_PTR_GE(reinterpret_cast<void*>(0xb), reinterpret_cast<void*>(0xa));
265*61c4878aSAndroid Build Coastguard Worker }
266*61c4878aSAndroid Build Coastguard Worker
267*61c4878aSAndroid Build Coastguard Worker // NOTNULL
TEST_F(AssertPassTest,PtrNotNull)268*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, PtrNotNull) {
269*61c4878aSAndroid Build Coastguard Worker PW_CHECK_NOTNULL(reinterpret_cast<void*>(0xa));
270*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,PtrNotNull)271*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, PtrNotNull) {
272*61c4878aSAndroid Build Coastguard Worker PW_CHECK_NOTNULL(reinterpret_cast<void*>(0x0));
273*61c4878aSAndroid Build Coastguard Worker }
274*61c4878aSAndroid Build Coastguard Worker
Function1()275*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] void Function1() {}
Function2(int)276*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] bool Function2(int) { return false; }
277*61c4878aSAndroid Build Coastguard Worker
278*61c4878aSAndroid Build Coastguard Worker // NOTNULL for function poionters
TEST_F(AssertPassTest,FunctionPtrNotNull)279*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, FunctionPtrNotNull) {
280*61c4878aSAndroid Build Coastguard Worker PW_CHECK_NOTNULL(&Function1);
281*61c4878aSAndroid Build Coastguard Worker PW_CHECK_NOTNULL(&Function2);
282*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,FunctionPtrNotNull)283*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FunctionPtrNotNull) {
284*61c4878aSAndroid Build Coastguard Worker void (*const function)() = nullptr;
285*61c4878aSAndroid Build Coastguard Worker PW_CHECK_NOTNULL(function);
286*61c4878aSAndroid Build Coastguard Worker }
287*61c4878aSAndroid Build Coastguard Worker
CompareIntWithString()288*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] void CompareIntWithString() {
289*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(CompareIntWithString)
290*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("cannot initialize|invalid conversion");
291*61c4878aSAndroid Build Coastguard Worker
292*61c4878aSAndroid Build Coastguard Worker PW_CHECK_INT_EQ(123l, "This check message is accidentally compared to 123!");
293*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
294*61c4878aSAndroid Build Coastguard Worker }
295*61c4878aSAndroid Build Coastguard Worker
296*61c4878aSAndroid Build Coastguard Worker // Note: Due to platform inconsistencies, the below test for the NOTNULL
297*61c4878aSAndroid Build Coastguard Worker // message doesn't work. Some platforms print NULL formatted as %p as "(nil)",
298*61c4878aSAndroid Build Coastguard Worker // others "0x0". Leaving this here for reference.
299*61c4878aSAndroid Build Coastguard Worker //
300*61c4878aSAndroid Build Coastguard Worker // TEST_F(AssertFailTest, PtrNotNullDescription) {
301*61c4878aSAndroid Build Coastguard Worker // intptr_t intptr = 0;
302*61c4878aSAndroid Build Coastguard Worker // PW_CHECK_NOTNULL(intptr);
303*61c4878aSAndroid Build Coastguard Worker // EXPECT_MESSAGE("Check failed: intptr (=0x0) != nullptr (=0x0). ");
304*61c4878aSAndroid Build Coastguard Worker // }
305*61c4878aSAndroid Build Coastguard Worker
306*61c4878aSAndroid Build Coastguard Worker // PW_CHECK_FLOAT_*(...)
307*61c4878aSAndroid Build Coastguard Worker // Binary checks with floats, comparisons: EXACT_LT, EXACT_LE, NEAR, EXACT_EQ,
308*61c4878aSAndroid Build Coastguard Worker // EXACT_NE, EXACT_GE, EXACT_GT.
309*61c4878aSAndroid Build Coastguard Worker
310*61c4878aSAndroid Build Coastguard Worker // Test message formatting separate from the triggering.
311*61c4878aSAndroid Build Coastguard Worker // Only test formatting for the type once.
TEST_F(AssertFailTest,FloatLessThanNoMessageNoArguments)312*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatLessThanNoMessageNoArguments) {
313*61c4878aSAndroid Build Coastguard Worker PW_CHECK_FLOAT_EXACT_LT(5.2, 2.3);
314*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: 5.2 (=5.200000) < 2.3 (=2.300000). ");
315*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,FloatLessThanMessageNoArguments)316*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatLessThanMessageNoArguments) {
317*61c4878aSAndroid Build Coastguard Worker PW_CHECK_FLOAT_EXACT_LT(5.2, 2.3, "msg");
318*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: 5.2 (=5.200000) < 2.3 (=2.300000). msg");
319*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,FloatLessThanMessageArguments)320*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatLessThanMessageArguments) {
321*61c4878aSAndroid Build Coastguard Worker PW_CHECK_FLOAT_EXACT_LT(5.2, 2.3, "msg: %d", 6);
322*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: 5.2 (=5.200000) < 2.3 (=2.300000). msg: 6");
323*61c4878aSAndroid Build Coastguard Worker }
324*61c4878aSAndroid Build Coastguard Worker // Check float NEAR both above and below the permitted range.
TEST_F(AssertFailTest,FloatNearAboveNoMessageNoArguments)325*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatNearAboveNoMessageNoArguments) {
326*61c4878aSAndroid Build Coastguard Worker PW_CHECK_FLOAT_NEAR(5.2, 2.3, 0.1);
327*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE(
328*61c4878aSAndroid Build Coastguard Worker "Check failed: 5.2 (=5.200000) <= 2.3 + abs_tolerance (=2.400000). ");
329*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,FloatNearAboveMessageNoArguments)330*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatNearAboveMessageNoArguments) {
331*61c4878aSAndroid Build Coastguard Worker PW_CHECK_FLOAT_NEAR(5.2, 2.3, 0.1, "msg");
332*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE(
333*61c4878aSAndroid Build Coastguard Worker "Check failed: 5.2 (=5.200000) <= 2.3 + abs_tolerance (=2.400000). msg");
334*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,FloatNearAboveMessageArguments)335*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatNearAboveMessageArguments) {
336*61c4878aSAndroid Build Coastguard Worker PW_CHECK_FLOAT_NEAR(5.2, 2.3, 0.1, "msg: %d", 6);
337*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE(
338*61c4878aSAndroid Build Coastguard Worker "Check failed: 5.2 (=5.200000) <= 2.3 + abs_tolerance (=2.400000). msg: "
339*61c4878aSAndroid Build Coastguard Worker "6");
340*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,FloatNearBelowNoMessageNoArguments)341*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatNearBelowNoMessageNoArguments) {
342*61c4878aSAndroid Build Coastguard Worker PW_CHECK_FLOAT_NEAR(1.2, 2.3, 0.1);
343*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE(
344*61c4878aSAndroid Build Coastguard Worker "Check failed: 1.2 (=1.200000) >= 2.3 - abs_tolerance (=2.200000). ");
345*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,FloatNearBelowMessageNoArguments)346*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatNearBelowMessageNoArguments) {
347*61c4878aSAndroid Build Coastguard Worker PW_CHECK_FLOAT_NEAR(1.2, 2.3, 0.1, "msg");
348*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE(
349*61c4878aSAndroid Build Coastguard Worker "Check failed: 1.2 (=1.200000) >= 2.3 - abs_tolerance (=2.200000). msg");
350*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,FloatNearBelowMessageArguments)351*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatNearBelowMessageArguments) {
352*61c4878aSAndroid Build Coastguard Worker PW_CHECK_FLOAT_NEAR(1.2, 2.3, 0.1, "msg: %d", 6);
353*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE(
354*61c4878aSAndroid Build Coastguard Worker "Check failed: 1.2 (=1.200000) >= 2.3 - abs_tolerance (=2.200000). msg: "
355*61c4878aSAndroid Build Coastguard Worker "6");
356*61c4878aSAndroid Build Coastguard Worker }
357*61c4878aSAndroid Build Coastguard Worker // Test comparison boundaries.
358*61c4878aSAndroid Build Coastguard Worker // Note: The below example numbers all round to integer 1, to detect accidental
359*61c4878aSAndroid Build Coastguard Worker // integer conversions in the asserts.
360*61c4878aSAndroid Build Coastguard Worker
361*61c4878aSAndroid Build Coastguard Worker // FLOAT <
TEST_F(AssertPassTest,FloatLt1)362*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, FloatLt1) { PW_CHECK_FLOAT_EXACT_LT(1.1, 1.2); }
TEST_F(AssertFailTest,FloatLt2)363*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatLt2) { PW_CHECK_FLOAT_EXACT_LT(1.2, 1.2); }
TEST_F(AssertFailTest,FloatLt3)364*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatLt3) { PW_CHECK_FLOAT_EXACT_LT(1.2, 1.1); }
365*61c4878aSAndroid Build Coastguard Worker
366*61c4878aSAndroid Build Coastguard Worker // FLOAT <=
TEST_F(AssertPassTest,FloatLe1)367*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, FloatLe1) { PW_CHECK_FLOAT_EXACT_LE(1.1, 1.2); }
TEST_F(AssertPassTest,FloatLe2)368*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, FloatLe2) { PW_CHECK_FLOAT_EXACT_LE(1.2, 1.2); }
TEST_F(AssertFailTest,FloatLe3)369*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatLe3) { PW_CHECK_FLOAT_EXACT_LE(1.2, 1.1); }
370*61c4878aSAndroid Build Coastguard Worker
371*61c4878aSAndroid Build Coastguard Worker // FLOAT ~= based on absolute error.
TEST_F(AssertFailTest,FloatNearAbs1)372*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatNearAbs1) { PW_CHECK_FLOAT_NEAR(1.09, 1.2, 0.1); }
TEST_F(AssertPassTest,FloatNearAbs2)373*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, FloatNearAbs2) { PW_CHECK_FLOAT_NEAR(1.1, 1.2, 0.1); }
TEST_F(AssertPassTest,FloatNearAbs3)374*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, FloatNearAbs3) { PW_CHECK_FLOAT_NEAR(1.2, 1.2, 0.1); }
TEST_F(AssertPassTest,FloatNearAbs4)375*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, FloatNearAbs4) { PW_CHECK_FLOAT_NEAR(1.2, 1.1, 0.1); }
TEST_F(AssertFailTest,FloatNearAbs5)376*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatNearAbs5) { PW_CHECK_FLOAT_NEAR(1.21, 1.1, 0.1); }
377*61c4878aSAndroid Build Coastguard Worker // Make sure the abs_tolerance is asserted to be >= 0.
TEST_F(AssertFailTest,FloatNearAbs6)378*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatNearAbs6) { PW_CHECK_FLOAT_NEAR(1.2, 1.2, -0.1); }
TEST_F(AssertPassTest,FloatNearAbs7)379*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, FloatNearAbs7) { PW_CHECK_FLOAT_NEAR(1.2, 1.2, 0.0); }
380*61c4878aSAndroid Build Coastguard Worker
381*61c4878aSAndroid Build Coastguard Worker // FLOAT ==
TEST_F(AssertFailTest,FloatEq1)382*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatEq1) { PW_CHECK_FLOAT_EXACT_EQ(1.1, 1.2); }
TEST_F(AssertPassTest,FloatEq2)383*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, FloatEq2) { PW_CHECK_FLOAT_EXACT_EQ(1.2, 1.2); }
TEST_F(AssertFailTest,FloatEq3)384*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatEq3) { PW_CHECK_FLOAT_EXACT_EQ(1.2, 1.1); }
385*61c4878aSAndroid Build Coastguard Worker
386*61c4878aSAndroid Build Coastguard Worker // FLOAT !=
TEST_F(AssertPassTest,FloatNe1)387*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, FloatNe1) { PW_CHECK_FLOAT_EXACT_NE(1.1, 1.2); }
TEST_F(AssertFailTest,FloatNe2)388*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatNe2) { PW_CHECK_FLOAT_EXACT_NE(1.2, 1.2); }
TEST_F(AssertPassTest,FloatNe3)389*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, FloatNe3) { PW_CHECK_FLOAT_EXACT_NE(1.2, 1.1); }
390*61c4878aSAndroid Build Coastguard Worker
391*61c4878aSAndroid Build Coastguard Worker // FLOAT >
TEST_F(AssertFailTest,FloatGt1)392*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatGt1) { PW_CHECK_FLOAT_EXACT_GT(1.1, 1.2); }
TEST_F(AssertFailTest,FloatGt2)393*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatGt2) { PW_CHECK_FLOAT_EXACT_GT(1.2, 1.2); }
TEST_F(AssertPassTest,FloatGt3)394*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, FloatGt3) { PW_CHECK_FLOAT_EXACT_GT(1.2, 1.1); }
395*61c4878aSAndroid Build Coastguard Worker
396*61c4878aSAndroid Build Coastguard Worker // FLOAT >=
TEST_F(AssertFailTest,FloatGe1)397*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, FloatGe1) { PW_CHECK_FLOAT_EXACT_GE(1.1, 1.2); }
TEST_F(AssertPassTest,FloatGe2)398*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, FloatGe2) { PW_CHECK_FLOAT_EXACT_GE(1.2, 1.2); }
TEST_F(AssertPassTest,FloatGe3)399*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, FloatGe3) { PW_CHECK_FLOAT_EXACT_GE(1.2, 1.1); }
400*61c4878aSAndroid Build Coastguard Worker
401*61c4878aSAndroid Build Coastguard Worker // Nested comma handling.
Add3(int a,int b,int c)402*61c4878aSAndroid Build Coastguard Worker static int Add3(int a, int b, int c) { return a + b + c; }
403*61c4878aSAndroid Build Coastguard Worker
TEST_F(AssertFailTest,CommaHandlingLeftSide)404*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, CommaHandlingLeftSide) {
405*61c4878aSAndroid Build Coastguard Worker PW_CHECK_INT_EQ(Add3(1, 2, 3), 4);
406*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: Add3(1, 2, 3) (=6) == 4 (=4). ");
407*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertFailTest,CommaHandlingRightSide)408*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, CommaHandlingRightSide) {
409*61c4878aSAndroid Build Coastguard Worker PW_CHECK_INT_EQ(4, Add3(1, 2, 3));
410*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: 4 (=4) == Add3(1, 2, 3) (=6). ");
411*61c4878aSAndroid Build Coastguard Worker }
412*61c4878aSAndroid Build Coastguard Worker
413*61c4878aSAndroid Build Coastguard Worker // Verify that the CHECK_*(x,y) macros only evaluate their arguments once.
414*61c4878aSAndroid Build Coastguard Worker struct MultiEvaluateTestContext {
IncrementAndReturnZero__anonb5aec29a0111::MultiEvaluateTestContext415*61c4878aSAndroid Build Coastguard Worker int IncrementAndReturnZero() {
416*61c4878aSAndroid Build Coastguard Worker counter += 1;
417*61c4878aSAndroid Build Coastguard Worker return 0;
418*61c4878aSAndroid Build Coastguard Worker }
419*61c4878aSAndroid Build Coastguard Worker int counter = 0;
420*61c4878aSAndroid Build Coastguard Worker };
421*61c4878aSAndroid Build Coastguard Worker
TEST(AssertPass,CheckSingleSideEffectingCall)422*61c4878aSAndroid Build Coastguard Worker TEST(AssertPass, CheckSingleSideEffectingCall) {
423*61c4878aSAndroid Build Coastguard Worker MultiEvaluateTestContext ctx;
424*61c4878aSAndroid Build Coastguard Worker PW_CHECK(ctx.IncrementAndReturnZero() == 0);
425*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ctx.counter, 1);
426*61c4878aSAndroid Build Coastguard Worker }
TEST(AssertFail,CheckSingleSideEffectingCall)427*61c4878aSAndroid Build Coastguard Worker TEST(AssertFail, CheckSingleSideEffectingCall) {
428*61c4878aSAndroid Build Coastguard Worker MultiEvaluateTestContext ctx;
429*61c4878aSAndroid Build Coastguard Worker PW_CHECK(ctx.IncrementAndReturnZero() == 1);
430*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ctx.counter, 1);
431*61c4878aSAndroid Build Coastguard Worker }
TEST(AssertPass,BinaryOpSingleSideEffectingCall)432*61c4878aSAndroid Build Coastguard Worker TEST(AssertPass, BinaryOpSingleSideEffectingCall) {
433*61c4878aSAndroid Build Coastguard Worker MultiEvaluateTestContext ctx;
434*61c4878aSAndroid Build Coastguard Worker PW_CHECK_INT_EQ(0, ctx.IncrementAndReturnZero());
435*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ctx.counter, 1);
436*61c4878aSAndroid Build Coastguard Worker }
TEST(AssertPass,BinaryOpTwoSideEffectingCalls)437*61c4878aSAndroid Build Coastguard Worker TEST(AssertPass, BinaryOpTwoSideEffectingCalls) {
438*61c4878aSAndroid Build Coastguard Worker MultiEvaluateTestContext ctx;
439*61c4878aSAndroid Build Coastguard Worker PW_CHECK_INT_EQ(ctx.IncrementAndReturnZero(), ctx.IncrementAndReturnZero());
440*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ctx.counter, 2);
441*61c4878aSAndroid Build Coastguard Worker }
TEST(AssertFail,BinaryOpSingleSideEffectingCall)442*61c4878aSAndroid Build Coastguard Worker TEST(AssertFail, BinaryOpSingleSideEffectingCall) {
443*61c4878aSAndroid Build Coastguard Worker MultiEvaluateTestContext ctx;
444*61c4878aSAndroid Build Coastguard Worker PW_CHECK_INT_EQ(12314, ctx.IncrementAndReturnZero());
445*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ctx.counter, 1);
446*61c4878aSAndroid Build Coastguard Worker }
TEST(AssertFail,BinaryOpTwoSideEffectingCalls)447*61c4878aSAndroid Build Coastguard Worker TEST(AssertFail, BinaryOpTwoSideEffectingCalls) {
448*61c4878aSAndroid Build Coastguard Worker MultiEvaluateTestContext ctx;
449*61c4878aSAndroid Build Coastguard Worker PW_CHECK_INT_EQ(ctx.IncrementAndReturnZero() + 10,
450*61c4878aSAndroid Build Coastguard Worker ctx.IncrementAndReturnZero());
451*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ctx.counter, 2);
452*61c4878aSAndroid Build Coastguard Worker }
TEST(AssertPass,CheckOkSingleSideEffectingCall)453*61c4878aSAndroid Build Coastguard Worker TEST(AssertPass, CheckOkSingleSideEffectingCall) {
454*61c4878aSAndroid Build Coastguard Worker MultiEvaluateTestContext ctx;
455*61c4878aSAndroid Build Coastguard Worker PW_CHECK_OK(ctx.IncrementAndReturnZero() ? pw::OkStatus() : pw::OkStatus());
456*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ctx.counter, 1);
457*61c4878aSAndroid Build Coastguard Worker }
TEST(AssertFail,CheckOkSingleSideEffectingCall)458*61c4878aSAndroid Build Coastguard Worker TEST(AssertFail, CheckOkSingleSideEffectingCall) {
459*61c4878aSAndroid Build Coastguard Worker MultiEvaluateTestContext ctx;
460*61c4878aSAndroid Build Coastguard Worker PW_CHECK_OK(ctx.IncrementAndReturnZero() ? pw::Status::NotFound()
461*61c4878aSAndroid Build Coastguard Worker : pw::Status::NotFound());
462*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ctx.counter, 1);
463*61c4878aSAndroid Build Coastguard Worker }
464*61c4878aSAndroid Build Coastguard Worker
465*61c4878aSAndroid Build Coastguard Worker // Verify side effects of debug checks work as expected.
466*61c4878aSAndroid Build Coastguard Worker // Only check a couple of cases, since the logic is all the same.
467*61c4878aSAndroid Build Coastguard Worker
468*61c4878aSAndroid Build Coastguard Worker // When DCHECKs are enabled, they behave the same as normal checks.
469*61c4878aSAndroid Build Coastguard Worker // When DCHECKs are disabled, they should not trip, and their arguments
470*61c4878aSAndroid Build Coastguard Worker // shouldn't be evaluated.
471*61c4878aSAndroid Build Coastguard Worker constexpr int kExpectedSideEffects = PW_ASSERT_ENABLE_DEBUG;
472*61c4878aSAndroid Build Coastguard Worker
TEST(AssertPass,DCheckEnabledSingleSideEffectingCall)473*61c4878aSAndroid Build Coastguard Worker TEST(AssertPass, DCheckEnabledSingleSideEffectingCall) {
474*61c4878aSAndroid Build Coastguard Worker MultiEvaluateTestContext ctx;
475*61c4878aSAndroid Build Coastguard Worker PW_DCHECK(ctx.IncrementAndReturnZero() == 0);
476*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ctx.counter, kExpectedSideEffects);
477*61c4878aSAndroid Build Coastguard Worker }
TEST(AssertFail,DCheckEnabledSingleSideEffectingCall)478*61c4878aSAndroid Build Coastguard Worker TEST(AssertFail, DCheckEnabledSingleSideEffectingCall) {
479*61c4878aSAndroid Build Coastguard Worker MultiEvaluateTestContext ctx;
480*61c4878aSAndroid Build Coastguard Worker PW_DCHECK(ctx.IncrementAndReturnZero() == 1);
481*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ctx.counter, kExpectedSideEffects);
482*61c4878aSAndroid Build Coastguard Worker }
TEST(AssertPass,DCheckEnabledBinaryOpSingleSideEffectingCall)483*61c4878aSAndroid Build Coastguard Worker TEST(AssertPass, DCheckEnabledBinaryOpSingleSideEffectingCall) {
484*61c4878aSAndroid Build Coastguard Worker MultiEvaluateTestContext ctx;
485*61c4878aSAndroid Build Coastguard Worker PW_DCHECK_INT_EQ(0, ctx.IncrementAndReturnZero());
486*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ctx.counter, kExpectedSideEffects);
487*61c4878aSAndroid Build Coastguard Worker }
TEST(AssertPass,DCheckEnabledBinaryOpTwoSideEffectingCalls)488*61c4878aSAndroid Build Coastguard Worker TEST(AssertPass, DCheckEnabledBinaryOpTwoSideEffectingCalls) {
489*61c4878aSAndroid Build Coastguard Worker MultiEvaluateTestContext ctx;
490*61c4878aSAndroid Build Coastguard Worker PW_DCHECK_INT_EQ(ctx.IncrementAndReturnZero(), ctx.IncrementAndReturnZero());
491*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ctx.counter, 2 * kExpectedSideEffects);
492*61c4878aSAndroid Build Coastguard Worker }
TEST(AssertFail,DCheckEnabledBinaryOpSingleSideEffectingCall)493*61c4878aSAndroid Build Coastguard Worker TEST(AssertFail, DCheckEnabledBinaryOpSingleSideEffectingCall) {
494*61c4878aSAndroid Build Coastguard Worker MultiEvaluateTestContext ctx;
495*61c4878aSAndroid Build Coastguard Worker PW_DCHECK_INT_EQ(12314, ctx.IncrementAndReturnZero());
496*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ctx.counter, kExpectedSideEffects);
497*61c4878aSAndroid Build Coastguard Worker }
TEST(AssertFail,DCheckEnabledBinaryOpTwoSideEffectingCalls)498*61c4878aSAndroid Build Coastguard Worker TEST(AssertFail, DCheckEnabledBinaryOpTwoSideEffectingCalls) {
499*61c4878aSAndroid Build Coastguard Worker MultiEvaluateTestContext ctx;
500*61c4878aSAndroid Build Coastguard Worker PW_DCHECK_INT_EQ(ctx.IncrementAndReturnZero() + 10,
501*61c4878aSAndroid Build Coastguard Worker ctx.IncrementAndReturnZero());
502*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ctx.counter, 2 * kExpectedSideEffects);
503*61c4878aSAndroid Build Coastguard Worker }
TEST(AssertPass,DCheckOkSingleSideEffectingCall)504*61c4878aSAndroid Build Coastguard Worker TEST(AssertPass, DCheckOkSingleSideEffectingCall) {
505*61c4878aSAndroid Build Coastguard Worker MultiEvaluateTestContext ctx;
506*61c4878aSAndroid Build Coastguard Worker PW_DCHECK_OK(ctx.IncrementAndReturnZero() ? pw::OkStatus() : pw::OkStatus());
507*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ctx.counter, kExpectedSideEffects);
508*61c4878aSAndroid Build Coastguard Worker }
TEST(AssertFail,DCheckOkSingleSideEffectingCall)509*61c4878aSAndroid Build Coastguard Worker TEST(AssertFail, DCheckOkSingleSideEffectingCall) {
510*61c4878aSAndroid Build Coastguard Worker MultiEvaluateTestContext ctx;
511*61c4878aSAndroid Build Coastguard Worker PW_DCHECK_OK(ctx.IncrementAndReturnZero() ? pw::Status::NotFound()
512*61c4878aSAndroid Build Coastguard Worker : pw::Status::NotFound());
513*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ctx.counter, kExpectedSideEffects);
514*61c4878aSAndroid Build Coastguard Worker }
515*61c4878aSAndroid Build Coastguard Worker
516*61c4878aSAndroid Build Coastguard Worker // Verify PW_CHECK_OK, including message handling.
TEST_F(AssertFailTest,StatusNotOK)517*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, StatusNotOK) {
518*61c4878aSAndroid Build Coastguard Worker pw::Status status = pw::Status::Unknown();
519*61c4878aSAndroid Build Coastguard Worker PW_CHECK_OK(status);
520*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: status (=UNKNOWN) == OkStatus() (=OK). ");
521*61c4878aSAndroid Build Coastguard Worker }
522*61c4878aSAndroid Build Coastguard Worker
TEST_F(AssertFailTest,StatusNotOKMessageNoArguments)523*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, StatusNotOKMessageNoArguments) {
524*61c4878aSAndroid Build Coastguard Worker pw::Status status = pw::Status::Unknown();
525*61c4878aSAndroid Build Coastguard Worker PW_CHECK_OK(status, "msg");
526*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: status (=UNKNOWN) == OkStatus() (=OK). msg");
527*61c4878aSAndroid Build Coastguard Worker }
528*61c4878aSAndroid Build Coastguard Worker
TEST_F(AssertFailTest,StatusNotOKMessageArguments)529*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, StatusNotOKMessageArguments) {
530*61c4878aSAndroid Build Coastguard Worker pw::Status status = pw::Status::Unknown();
531*61c4878aSAndroid Build Coastguard Worker PW_CHECK_OK(status, "msg: %d", 5);
532*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: status (=UNKNOWN) == OkStatus() (=OK). msg: 5");
533*61c4878aSAndroid Build Coastguard Worker }
534*61c4878aSAndroid Build Coastguard Worker
TEST_F(AssertPassTest,StatusWithSizeOK)535*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, StatusWithSizeOK) {
536*61c4878aSAndroid Build Coastguard Worker pw::StatusWithSize status_size = pw::StatusWithSize(123);
537*61c4878aSAndroid Build Coastguard Worker PW_CHECK_OK(status_size);
538*61c4878aSAndroid Build Coastguard Worker }
539*61c4878aSAndroid Build Coastguard Worker
TEST_F(AssertFailTest,StatusWithSizeNotOK)540*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, StatusWithSizeNotOK) {
541*61c4878aSAndroid Build Coastguard Worker pw::StatusWithSize status_size = pw::StatusWithSize::Unknown();
542*61c4878aSAndroid Build Coastguard Worker PW_CHECK_OK(status_size);
543*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: status_size (=UNKNOWN) == OkStatus() (=OK). ");
544*61c4878aSAndroid Build Coastguard Worker }
545*61c4878aSAndroid Build Coastguard Worker
TEST_F(AssertPassTest,ResultOK)546*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, ResultOK) {
547*61c4878aSAndroid Build Coastguard Worker pw::Result<int> result = 123;
548*61c4878aSAndroid Build Coastguard Worker PW_CHECK_OK(result);
549*61c4878aSAndroid Build Coastguard Worker }
550*61c4878aSAndroid Build Coastguard Worker
TEST_F(AssertFailTest,ResultNotOK)551*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, ResultNotOK) {
552*61c4878aSAndroid Build Coastguard Worker pw::Result<int> result = pw::Status::Unknown();
553*61c4878aSAndroid Build Coastguard Worker PW_CHECK_OK(result);
554*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE("Check failed: result (=UNKNOWN) == OkStatus() (=OK). ");
555*61c4878aSAndroid Build Coastguard Worker }
556*61c4878aSAndroid Build Coastguard Worker
557*61c4878aSAndroid Build Coastguard Worker // Example expression for the test below.
DoTheThing()558*61c4878aSAndroid Build Coastguard Worker pw::Status DoTheThing() { return pw::Status::ResourceExhausted(); }
559*61c4878aSAndroid Build Coastguard Worker
TEST_F(AssertFailTest,NonTrivialExpression)560*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, NonTrivialExpression) {
561*61c4878aSAndroid Build Coastguard Worker PW_CHECK_OK(DoTheThing());
562*61c4878aSAndroid Build Coastguard Worker EXPECT_MESSAGE(
563*61c4878aSAndroid Build Coastguard Worker "Check failed: DoTheThing() (=RESOURCE_EXHAUSTED) == OkStatus() (=OK). ");
564*61c4878aSAndroid Build Coastguard Worker }
565*61c4878aSAndroid Build Coastguard Worker
566*61c4878aSAndroid Build Coastguard Worker // Note: This function seems pointless but it is not, since pw::Status::FOO
567*61c4878aSAndroid Build Coastguard Worker // constants are not actually status objects, but code objects. This way we can
568*61c4878aSAndroid Build Coastguard Worker // ensure the macros work with both real status objects and literals.
TEST_F(AssertPassTest,Function)569*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, Function) { PW_CHECK_OK(pw::OkStatus()); }
TEST_F(AssertPassTest,Enum)570*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, Enum) { PW_CHECK_OK(PW_STATUS_OK); }
TEST_F(AssertFailTest,Function)571*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, Function) { PW_CHECK_OK(pw::Status::Unknown()); }
TEST_F(AssertFailTest,Enum)572*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, Enum) { PW_CHECK_OK(PW_STATUS_UNKNOWN); }
573*61c4878aSAndroid Build Coastguard Worker
574*61c4878aSAndroid Build Coastguard Worker #if PW_ASSERT_ENABLE_DEBUG
575*61c4878aSAndroid Build Coastguard Worker
576*61c4878aSAndroid Build Coastguard Worker // In debug mode, the asserts should check their arguments.
TEST_F(AssertPassTest,DCheckFunction)577*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, DCheckFunction) { PW_DCHECK_OK(pw::OkStatus()); }
TEST_F(AssertPassTest,DCheckEnum)578*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, DCheckEnum) { PW_DCHECK_OK(PW_STATUS_OK); }
TEST_F(AssertFailTest,DCheckFunction)579*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, DCheckFunction) { PW_DCHECK_OK(pw::Status::Unknown()); }
TEST_F(AssertFailTest,DCheckEnum)580*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertFailTest, DCheckEnum) { PW_DCHECK_OK(PW_STATUS_UNKNOWN); }
581*61c4878aSAndroid Build Coastguard Worker #else // PW_ASSERT_ENABLE_DEBUG
582*61c4878aSAndroid Build Coastguard Worker
583*61c4878aSAndroid Build Coastguard Worker // In release mode, all the asserts should pass.
TEST_F(AssertPassTest,DCheckFunction_Ok)584*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, DCheckFunction_Ok) { PW_DCHECK_OK(pw::OkStatus()); }
TEST_F(AssertPassTest,DCheckEnum_Ok)585*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, DCheckEnum_Ok) { PW_DCHECK_OK(PW_STATUS_OK); }
TEST_F(AssertPassTest,DCheckFunction_Err)586*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, DCheckFunction_Err) {
587*61c4878aSAndroid Build Coastguard Worker PW_DCHECK_OK(pw::Status::Unknown());
588*61c4878aSAndroid Build Coastguard Worker }
TEST_F(AssertPassTest,DCheckEnum_Err)589*61c4878aSAndroid Build Coastguard Worker TEST_F(AssertPassTest, DCheckEnum_Err) { PW_DCHECK_OK(PW_STATUS_UNKNOWN); }
590*61c4878aSAndroid Build Coastguard Worker #endif // PW_ASSERT_ENABLE_DEBUG
591*61c4878aSAndroid Build Coastguard Worker
592*61c4878aSAndroid Build Coastguard Worker // TODO(keir): Figure out how to run some of these tests is C.
593*61c4878aSAndroid Build Coastguard Worker
594*61c4878aSAndroid Build Coastguard Worker } // namespace
595