1 // Copyright 2020 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 // https://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, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14
15 // This is a compile test that verifies that the assert macros compile in a C
16 // context. They are not correctness checks.
17 //
18 // Note: These tests cannot be run with a normal assert backend, since they
19 // will abort. However, the assert_basic backend supports non-aborting assert;
20 // see the note in assert_backend_compile_test.cc.
21
22 #include "pw_assert/check.h"
23
EnsureNullIsIncluded(void)24 static void EnsureNullIsIncluded(void) {
25 // This is a compile check to ensure NULL is defined. It comes before the
26 // status.h include to ensure we don't accidentally get NULL from status.h.
27 PW_CHECK_NOTNULL(0xa);
28 PW_CHECK_NOTNULL(0x0);
29 }
30
31 #include <stdbool.h>
32
33 #include "pw_assert/assert.h"
34 #include "pw_assert/short.h"
35 #include "pw_status/status.h"
36
37 #ifdef __cplusplus
38 #error "This file must be compiled as plain C to verify C compilation works."
39 #endif // __cplusplus
40
41 // This is a global constant to feed into the formatter for tests.
42 // Intended to pair with FAIL_IF_DISPLAYED_ARGS or FAIL_IF_HIDDEN_ARGS.
43 static const int z = 10;
44
45 // At some point in the future when there is a proper test system in place for
46 // crashing, the below strings can help indicate pass/fail for a check.
47
48 #define FAIL_IF_DISPLAYED "FAIL IF DISPLAYED"
49 #define FAIL_IF_DISPLAYED_ARGS "FAIL IF DISPLAYED: %d"
50
51 #define FAIL_IF_HIDDEN "FAIL IF HIDDEN"
52 #define FAIL_IF_HIDDEN_ARGS "FAIL IF HIDDEN: %d"
53
54 // This switch exists to support compiling and/or running the tests.
55 #define DISABLE_ASSERT_TEST_EXECUTION 1
56 #if DISABLE_ASSERT_TEST_EXECUTION
57 #define MAYBE_SKIP_TEST return
58 #else
59 #define MAYBE_SKIP_TEST ;
60 #endif
61
Add3(int a,int b,int c)62 static int Add3(int a, int b, int c) { return a + b + c; }
63
AssertBackendCompileTestsInC(void)64 void AssertBackendCompileTestsInC(void) {
65 { // TEST(Crash, WithAndWithoutMessageArguments)
66 MAYBE_SKIP_TEST;
67 PW_CRASH(FAIL_IF_HIDDEN);
68 PW_CRASH(FAIL_IF_HIDDEN_ARGS, z);
69 }
70
71 { // TEST(Check, NoMessage)
72 MAYBE_SKIP_TEST;
73 PW_CHECK(1);
74 PW_CHECK(0);
75 }
76
77 { // TEST(Check, WithMessageAndArgs)
78 MAYBE_SKIP_TEST;
79 PW_CHECK(1, FAIL_IF_DISPLAYED);
80 PW_CHECK(1, FAIL_IF_DISPLAYED_ARGS, z);
81
82 PW_CHECK(0, FAIL_IF_HIDDEN);
83 PW_CHECK(0, FAIL_IF_HIDDEN_ARGS, z);
84 }
85
86 { // TEST(Check, IntComparison)
87 MAYBE_SKIP_TEST;
88 int x_int = 50;
89 int y_int = 66;
90
91 PW_CHECK_INT_LE(x_int, y_int);
92 PW_CHECK_INT_LE(x_int, y_int, "INT: " FAIL_IF_DISPLAYED);
93 PW_CHECK_INT_LE(x_int, y_int, "INT: " FAIL_IF_DISPLAYED_ARGS, z);
94
95 PW_CHECK_INT_GE(x_int, y_int);
96 PW_CHECK_INT_GE(x_int, y_int, "INT: " FAIL_IF_HIDDEN);
97 PW_CHECK_INT_GE(x_int, y_int, "INT: " FAIL_IF_HIDDEN_ARGS, z);
98 }
99
100 { // TEST(Check, UintComparison)
101 MAYBE_SKIP_TEST;
102 unsigned int x_uint = 50;
103 unsigned int y_uint = 66;
104
105 PW_CHECK_UINT_LE(x_uint, y_uint);
106 PW_CHECK_UINT_LE(x_uint, y_uint, "UINT: " FAIL_IF_DISPLAYED);
107 PW_CHECK_UINT_LE(x_uint, y_uint, "UINT: " FAIL_IF_DISPLAYED_ARGS, z);
108
109 PW_CHECK_UINT_GE(x_uint, y_uint);
110 PW_CHECK_UINT_GE(x_uint, y_uint, "UINT: " FAIL_IF_HIDDEN);
111 PW_CHECK_UINT_GE(x_uint, y_uint, "UINT: " FAIL_IF_HIDDEN_ARGS, z);
112 }
113
114 { // TEST(Check, PtrComparison)
115 MAYBE_SKIP_TEST;
116 void* x_ptr = (void*)(50);
117 void* y_ptr = (void*)(66);
118
119 PW_CHECK_PTR_EQ(x_ptr, y_ptr);
120 PW_CHECK_PTR_LE(x_ptr, y_ptr, "PTR: " FAIL_IF_DISPLAYED);
121 PW_CHECK_PTR_LE(x_ptr, y_ptr, "PTR: " FAIL_IF_DISPLAYED_ARGS, z);
122
123 PW_CHECK_PTR_GE(x_ptr, y_ptr);
124 PW_CHECK_PTR_GE(x_ptr, y_ptr, "PTR: " FAIL_IF_HIDDEN);
125 PW_CHECK_PTR_GE(x_ptr, y_ptr, "PTR: " FAIL_IF_HIDDEN_ARGS, z);
126
127 PW_CHECK_NOTNULL(0xa);
128 PW_CHECK_NOTNULL(0x0);
129 }
130
131 { // TEST(Check, FloatComparison)
132 MAYBE_SKIP_TEST;
133 float x_float = 50.5;
134 float y_float = 66.5;
135
136 PW_CHECK_FLOAT_EXACT_LE(x_float, y_float);
137 PW_CHECK_FLOAT_EXACT_LE(x_float, y_float, "FLOAT: " FAIL_IF_DISPLAYED);
138 PW_CHECK_FLOAT_EXACT_LE(
139 x_float, y_float, "FLOAT: " FAIL_IF_DISPLAYED_ARGS, z);
140
141 PW_CHECK_FLOAT_EXACT_GE(x_float, y_float);
142 PW_CHECK_FLOAT_EXACT_GE(x_float, y_float, "FLOAT: " FAIL_IF_HIDDEN);
143 PW_CHECK_FLOAT_EXACT_GE(x_float, y_float, "FLOAT: " FAIL_IF_HIDDEN_ARGS, z);
144 }
145
146 // Don't exhaustively test the DCHECKs but have a sampling of them.
147 { // TEST(DCheck, Sampling)
148 MAYBE_SKIP_TEST;
149 PW_DCHECK(5 == 10);
150 PW_DCHECK(5 == 10, "Message");
151 PW_DCHECK(5 == 10, "Message: %d", 5);
152 PW_DCHECK_INT_LE(5.4, 10.0);
153 PW_DCHECK_FLOAT_EXACT_EQ(5.4, 10.0, "Message");
154 }
155
156 { // TEST(Check, ComparisonArgumentsWithCommas)
157 MAYBE_SKIP_TEST;
158 int x_int = 50;
159 int y_int = 66;
160
161 PW_CHECK_INT_LE(Add3(1, 2, 3), y_int);
162 PW_CHECK_INT_LE(x_int, Add3(1, 2, 3));
163
164 PW_CHECK_INT_LE(Add3(1, 2, 3), y_int, FAIL_IF_DISPLAYED);
165 PW_CHECK_INT_LE(x_int, Add3(1, 2, 3), FAIL_IF_DISPLAYED_ARGS, z);
166
167 PW_CHECK_INT_LE(Add3(1, 2, 3), Add3(1, 2, 3), "INT: " FAIL_IF_DISPLAYED);
168 PW_CHECK_INT_LE(x_int, y_int, "INT: " FAIL_IF_DISPLAYED_ARGS, z);
169 }
170
171 { // TEST(Check, ShortNamesWork) {
172 MAYBE_SKIP_TEST;
173
174 // Crash
175 CRASH(FAIL_IF_HIDDEN);
176 CRASH(FAIL_IF_HIDDEN_ARGS, z);
177
178 // Check
179 CHECK(1, FAIL_IF_DISPLAYED);
180 CHECK(1, FAIL_IF_DISPLAYED_ARGS, z);
181 CHECK(0, FAIL_IF_HIDDEN);
182 CHECK(0, FAIL_IF_HIDDEN_ARGS, z);
183
184 // Check with binary comparison
185 int x_int = 50;
186 int y_int = 66;
187
188 CHECK_INT_LE(Add3(1, 2, 3), y_int);
189 CHECK_INT_LE(x_int, Add3(1, 2, 3));
190
191 CHECK_INT_LE(Add3(1, 2, 3), y_int, FAIL_IF_DISPLAYED);
192 CHECK_INT_LE(x_int, Add3(1, 2, 3), FAIL_IF_DISPLAYED_ARGS, z);
193
194 CHECK_INT_LE(Add3(1, 2, 3), Add3(1, 2, 3), "INT: " FAIL_IF_DISPLAYED);
195 CHECK_INT_LE(x_int, y_int, "INT: " FAIL_IF_DISPLAYED_ARGS, z);
196 }
197
198 { // Compile tests for PW_CHECK_OK().
199 PW_CHECK_OK(PW_STATUS_OK);
200 PW_CHECK_OK(PW_STATUS_OK, "msg");
201 PW_CHECK_OK(PW_STATUS_OK, "msg: %d", 5);
202 PW_DCHECK_OK(PW_STATUS_OK);
203 PW_DCHECK_OK(PW_STATUS_OK, "msg");
204 PW_DCHECK_OK(PW_STATUS_OK, "msg: %d", 5);
205 }
206
207 { // TEST(Assert, Basic)
208 MAYBE_SKIP_TEST;
209 PW_ASSERT(false);
210 PW_ASSERT(123 == 456);
211 }
212
213 { // Compile tests for PW_ASSERT().
214 PW_ASSERT(true);
215 PW_ASSERT(123 != 456);
216
217 PW_DASSERT(true);
218 PW_DASSERT(123 != 456);
219 }
220
221 EnsureNullIsIncluded();
222 }
223