blob: 7398e1490a6c77eff8a4f20da8f85e2a28136906 [file] [log] [blame]
Alexei Frolovc10c8122019-11-01 16:31:19 -07001// Copyright 2019 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
Wyatt Hepler1a960942019-11-26 14:13:38 -08004// use this file except in compliance with the License. You may obtain a copy of
5// the License at
Alexei Frolovc10c8122019-11-01 16:31:19 -07006//
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
Wyatt Hepler1a960942019-11-26 14:13:38 -080012// License for the specific language governing permissions and limitations under
13// the License.
Alexei Frolovc10c8122019-11-01 16:31:19 -070014//
15// All of these tests are static asserts. If the test compiles, it has already
16// passed. The TEST functions are used for organization only.
17
18#include "pw_preprocessor/macro_arg_count.h"
19
20#include "pw_unit_test/framework.h"
21
22namespace pw {
23namespace {
24
Wyatt Hepler639ce3b2020-08-18 10:57:29 -070025#define EMPTY_ARG
26
Alexei Frolovc10c8122019-11-01 16:31:19 -070027TEST(HasArgs, WithoutArguments) {
28 static_assert(PW_HAS_ARGS() == 0);
29 static_assert(PW_HAS_ARGS(/**/) == 0);
30 static_assert(PW_HAS_ARGS(/* uhm, hi */) == 0);
Wyatt Hepler639ce3b2020-08-18 10:57:29 -070031 static_assert(PW_HAS_ARGS(EMPTY_ARG) == 0);
Alexei Frolovc10c8122019-11-01 16:31:19 -070032
33 // Test how the macro handles whitespace and comments.
34 // clang-format off
Wyatt Hepler880cd682020-08-18 16:15:48 -070035 static_assert(PW_HAS_ARGS( ) == 0);
Alexei Frolovc10c8122019-11-01 16:31:19 -070036 static_assert(PW_HAS_ARGS(
Wyatt Hepler880cd682020-08-18 16:15:48 -070037 ) == 0);
Alexei Frolovc10c8122019-11-01 16:31:19 -070038 static_assert(PW_HAS_ARGS(
39 // wow
40 // This is a comment.
Wyatt Hepler880cd682020-08-18 16:15:48 -070041 ) == 0);
Alexei Frolovc10c8122019-11-01 16:31:19 -070042 // clang-format on
43
Wyatt Hepler639ce3b2020-08-18 10:57:29 -070044 static_assert(PW_EMPTY_ARGS() == 1);
45 static_assert(PW_EMPTY_ARGS(/* hello */) == 1);
46 static_assert(PW_EMPTY_ARGS(
Alexei Frolovc10c8122019-11-01 16:31:19 -070047 // hello
48 /* goodbye */) == 1);
49}
50
51TEST(HasArgs, WithArguments) {
52 static_assert(PW_HAS_ARGS(()) == 1);
53 static_assert(PW_HAS_ARGS(0) == 1);
Wyatt Hepler880cd682020-08-18 16:15:48 -070054 static_assert(PW_HAS_ARGS(, ) == 1);
Alexei Frolovc10c8122019-11-01 16:31:19 -070055 static_assert(PW_HAS_ARGS(a, b, c) == 1);
56 static_assert(PW_HAS_ARGS(PW_HAS_ARGS) == 1);
57 static_assert(PW_HAS_ARGS(PW_HAS_ARGS()) == 1);
58
Wyatt Hepler639ce3b2020-08-18 10:57:29 -070059 static_assert(PW_EMPTY_ARGS(0) == 0);
Wyatt Hepler880cd682020-08-18 16:15:48 -070060 static_assert(PW_EMPTY_ARGS(, ) == 0);
Wyatt Hepler639ce3b2020-08-18 10:57:29 -070061 static_assert(PW_EMPTY_ARGS(a, b, c) == 0);
62 static_assert(PW_EMPTY_ARGS(PW_HAS_ARGS) == 0);
63 static_assert(PW_EMPTY_ARGS(PW_HAS_ARGS()) == 0);
Alexei Frolovc10c8122019-11-01 16:31:19 -070064}
65
66constexpr int TestFunc(int arg, ...) { return arg; }
67
68#define CALL_FUNCTION(arg, ...) TestFunc(arg PW_COMMA_ARGS(__VA_ARGS__))
69
70template <typename T, typename... Args>
71constexpr T TemplateArgCount() {
72 return sizeof...(Args);
73}
74
75#define COUNT_ARGS_TEMPLATE(...) \
76 TemplateArgCount<int PW_COMMA_ARGS(__VA_ARGS__)>()
77
78TEST(CommaVarargs, NoArguments) {
79 static_assert(TestFunc(0 PW_COMMA_ARGS()) == 0);
80 static_assert(TestFunc(1 /* whoa */ PW_COMMA_ARGS(
81 /* this macro */) /* is cool! */) == 1);
82
83 static_assert(TemplateArgCount<int PW_COMMA_ARGS()>() == 0);
84 static_assert(TemplateArgCount<int PW_COMMA_ARGS(/* nothing */)>() == 0);
85
86 static_assert(CALL_FUNCTION(2) == 2);
87 static_assert(CALL_FUNCTION(3, ) == 3);
88 static_assert(CALL_FUNCTION(4, /* nothing */) == 4);
89
90 static_assert(COUNT_ARGS_TEMPLATE() == 0);
91 static_assert(COUNT_ARGS_TEMPLATE(/* nothing */) == 0);
92}
93
94TEST(CommaVarargs, WithArguments) {
95 static_assert(TestFunc(0 PW_COMMA_ARGS(1)) == 0);
96 static_assert(TestFunc(1 PW_COMMA_ARGS(1, 2)) == 1);
97 static_assert(TestFunc(2 PW_COMMA_ARGS(1, 2, "three")) == 2);
98
99 static_assert(TemplateArgCount<int PW_COMMA_ARGS(bool)>() == 1);
100 static_assert(TemplateArgCount<int PW_COMMA_ARGS(char, const char*)>() == 2);
101 static_assert(TemplateArgCount<int PW_COMMA_ARGS(int, char, const char*)>() ==
102 3);
103
104 static_assert(CALL_FUNCTION(3) == 3);
105 static_assert(CALL_FUNCTION(4, ) == 4);
106 static_assert(CALL_FUNCTION(5, /* nothing */) == 5);
107
108 static_assert(COUNT_ARGS_TEMPLATE(int) == 1);
109 static_assert(COUNT_ARGS_TEMPLATE(int, int) == 2);
110 static_assert(COUNT_ARGS_TEMPLATE(int, int, int) == 3);
111}
112
Wyatt Hepler639ce3b2020-08-18 10:57:29 -0700113TEST(CommaVarargs, EmptyFinalArgument) {
114 static_assert(COUNT_ARGS_TEMPLATE(EMPTY_ARG) == 0);
115 static_assert(COUNT_ARGS_TEMPLATE(int, ) == 1);
116 static_assert(COUNT_ARGS_TEMPLATE(int, EMPTY_ARG) == 1);
117 static_assert(COUNT_ARGS_TEMPLATE(int, /* EMPTY_ARG */) == 1);
118 static_assert(COUNT_ARGS_TEMPLATE(int, int, ) == 2);
119 static_assert(COUNT_ARGS_TEMPLATE(int, int, int, ) == 3);
120 static_assert(COUNT_ARGS_TEMPLATE(int, int, int, EMPTY_ARG) == 3);
121}
122
Wyatt Hepler880cd682020-08-18 16:15:48 -0700123// This test demonstrates that PW_COMMA_ARGS behaves unexpectedly when it is
124// used when invoking another macro. DO NOT use PW_COMMA_ARGS when invoking
125// another macro!
126#define BAD_DEMO(fmt, ...) _BAD_DEMO_ADD_123(fmt PW_COMMA_ARGS(__VA_ARGS__))
127
128#define _BAD_DEMO_ADD_123(fmt, ...) \
129 _BAD_DEMO_STRINGIFY("%d: " fmt, 123 PW_COMMA_ARGS(__VA_ARGS__))
130
131#define _BAD_DEMO_STRINGIFY(...) PW_STRINGIFY(__VA_ARGS__)
132
133TEST(CommaVarargs, MisbehavesWithMacroToMacroUse) {
134// Disable this EXPECT for now; it breaks on ARM/discovery due to the
135// preprocessor adding space before the comma after Hello World:
136//
137// "Hello world" , 123
138//
139// rather than (as on host builds):
140//
141// "Hello world", 123
142//
143// TODO(keir): Fix the inconsistency and restore this expectation.
144#if 0
145 // With no additional arguments, everything is OK
146 EXPECT_STREQ(BAD_DEMO("Hello world"), R"("%d: " "Hello world", 123)");
147#endif
148
149 // If there is an additional argument, the order is incorrect! The 123
150 // argument should go before the "world?" argument, but it is inserted after.
151 // This would be a compilation error if these arguments were passed to printf.
152 // What's worse is that this can silently fail if the arguments happen to be
153 // compatible types.
154 EXPECT_STREQ(BAD_DEMO("Hello %s", "world?"),
155 R"("%d: " "Hello %s" , "world?", 123)");
156}
157
Alexei Frolovc10c8122019-11-01 16:31:19 -0700158TEST(CountArgs, Zero) {
159 static_assert(PW_ARG_COUNT() == 0);
160 static_assert(PW_ARG_COUNT(/**/) == 0);
161 static_assert(PW_ARG_COUNT(/* uhm, hi */) == 0);
162
163 // clang-format off
Wyatt Hepler880cd682020-08-18 16:15:48 -0700164 static_assert(PW_ARG_COUNT( ) == 0);
Alexei Frolovc10c8122019-11-01 16:31:19 -0700165 static_assert(PW_ARG_COUNT(
Wyatt Hepler880cd682020-08-18 16:15:48 -0700166 ) == 0);
Alexei Frolovc10c8122019-11-01 16:31:19 -0700167 static_assert(PW_ARG_COUNT(
168 // wow
169 // This is a comment.
Wyatt Hepler880cd682020-08-18 16:15:48 -0700170 ) == 0);
Alexei Frolovc10c8122019-11-01 16:31:19 -0700171 // clang-format on
172}
173
174TEST(CountArgs, Commas) {
175 // clang-format off
Wyatt Hepler880cd682020-08-18 16:15:48 -0700176 static_assert(PW_ARG_COUNT(,) == 2);
177 static_assert(PW_ARG_COUNT(,,) == 3);
178 static_assert(PW_ARG_COUNT(,,,) == 4);
Alexei Frolovc10c8122019-11-01 16:31:19 -0700179 // clang-format on
Wyatt Hepler880cd682020-08-18 16:15:48 -0700180 static_assert(PW_ARG_COUNT(, ) == 2);
181 static_assert(PW_ARG_COUNT(, , ) == 3);
182 static_assert(PW_ARG_COUNT(, , , ) == 4);
Alexei Frolovc10c8122019-11-01 16:31:19 -0700183}
184
185TEST(CountArgs, Parentheses) {
186 static_assert(PW_ARG_COUNT(()) == 1);
187 static_assert(PW_ARG_COUNT((1, 2, 3, 4)) == 1);
188 static_assert(PW_ARG_COUNT((1, 2, 3), (1, 2, 3, 4)) == 2);
189 static_assert(PW_ARG_COUNT((), ()) == 2);
190 static_assert(PW_ARG_COUNT((-), (o)) == 2);
Wyatt Hepler880cd682020-08-18 16:15:48 -0700191 static_assert(PW_ARG_COUNT((, , (, , ), ), (123, 4)) == 2);
Alexei Frolovc10c8122019-11-01 16:31:19 -0700192 static_assert(PW_ARG_COUNT(1, (2, 3, 4), (<5, 6>)) == 3);
193}
194
Wyatt Hepler880cd682020-08-18 16:15:48 -0700195template <typename... Args>
196constexpr size_t FunctionArgCount(Args...) {
197 return sizeof...(Args);
198}
199
200static_assert(FunctionArgCount() == 0);
201static_assert(FunctionArgCount(1) == 1);
202static_assert(FunctionArgCount(1, 2) == 2);
203
204TEST(CountFunctionArgs, NonEmptyLastArg) {
205 static_assert(PW_FUNCTION_ARG_COUNT(a) == 1);
206 static_assert(PW_FUNCTION_ARG_COUNT(1, 2) == 2);
207 static_assert(PW_FUNCTION_ARG_COUNT(1, 2, 3) == 3);
208}
209
210TEST(CountFunctionArgs, EmptyLastArg) {
211 static_assert(PW_FUNCTION_ARG_COUNT() == 0);
212 static_assert(PW_FUNCTION_ARG_COUNT(a, ) == 1);
213 static_assert(PW_FUNCTION_ARG_COUNT(1, 2, ) == 2);
214 static_assert(PW_FUNCTION_ARG_COUNT(1, 2, 3, ) == 3);
215
216 static_assert(PW_FUNCTION_ARG_COUNT(a, EMPTY_ARG) == 1);
217 static_assert(PW_FUNCTION_ARG_COUNT(1, 2, EMPTY_ARG) == 2);
218 static_assert(PW_FUNCTION_ARG_COUNT(1, 2, 3, EMPTY_ARG) == 3);
219}
220
221constexpr const char* Value(const char* str = nullptr) { return str; }
222
223TEST(LastArg, NonEmptyLastArg) {
224 constexpr const char* last = "last!";
225 static_assert(Value(PW_LAST_ARG(last)) == last);
226 static_assert(Value(PW_LAST_ARG(1, last)) == last);
227 static_assert(Value(PW_LAST_ARG(1, 2, last)) == last);
228}
229
230TEST(LastArg, EmptyLastArg) {
231 static_assert(Value(PW_LAST_ARG()) == nullptr);
232 static_assert(Value(PW_LAST_ARG(1, )) == nullptr);
233 static_assert(Value(PW_LAST_ARG(1, 2, )) == nullptr);
234 static_assert(Value(PW_LAST_ARG(1, 2, 3, )) == nullptr);
235}
236
237TEST(DropLastArg, NonEmptyLastArg) {
238 static_assert(FunctionArgCount(PW_DROP_LAST_ARG(1)) == 0);
239 static_assert(FunctionArgCount(PW_DROP_LAST_ARG(1, 2)) == 1);
240 static_assert(FunctionArgCount(PW_DROP_LAST_ARG(1, 2, 3)) == 2);
241}
242
243TEST(DropLastArg, EmptyLastArg) {
244 static_assert(FunctionArgCount(PW_DROP_LAST_ARG()) == 0);
245 static_assert(FunctionArgCount(PW_DROP_LAST_ARG(1, )) == 1);
246 static_assert(FunctionArgCount(PW_DROP_LAST_ARG(1, 2, )) == 2);
247 static_assert(FunctionArgCount(PW_DROP_LAST_ARG(1, 2, 3, )) == 3);
248}
249
250TEST(DropLastArgIfEmpty, NonEmptyLastArg) {
251 static_assert(FunctionArgCount(PW_DROP_LAST_ARG_IF_EMPTY(1)) == 1);
252 static_assert(FunctionArgCount(PW_DROP_LAST_ARG_IF_EMPTY(1, 2)) == 2);
253 static_assert(FunctionArgCount(PW_DROP_LAST_ARG_IF_EMPTY(1, 2, 3)) == 3);
254}
255
256TEST(DropLastArgIfEmpty, EmptyLastArg) {
257 static_assert(FunctionArgCount(PW_DROP_LAST_ARG_IF_EMPTY()) == 0);
258 static_assert(FunctionArgCount(PW_DROP_LAST_ARG_IF_EMPTY(1, )) == 1);
259 static_assert(FunctionArgCount(PW_DROP_LAST_ARG_IF_EMPTY(1, 2, )) == 2);
260 static_assert(FunctionArgCount(PW_DROP_LAST_ARG_IF_EMPTY(1, 2, 3, )) == 3);
261}
262
Alexei Frolovc10c8122019-11-01 16:31:19 -0700263#define SOME_VARIADIC_MACRO(...) PW_ARG_COUNT(__VA_ARGS__)
264
265#define ANOTHER_VARIADIC_MACRO(arg, ...) SOME_VARIADIC_MACRO(__VA_ARGS__)
266
267#define ALWAYS_ONE_ARG(...) SOME_VARIADIC_MACRO((__VA_ARGS__))
268
269TEST(CountArgs, NestedMacros) {
270 static_assert(SOME_VARIADIC_MACRO() == 0);
271 static_assert(SOME_VARIADIC_MACRO(X1) == 1);
272 static_assert(SOME_VARIADIC_MACRO(X1, X2) == 2);
273 static_assert(SOME_VARIADIC_MACRO(X1, X2, X3) == 3);
274 static_assert(SOME_VARIADIC_MACRO(X1, X2, X3, X4) == 4);
275 static_assert(SOME_VARIADIC_MACRO(X1, X2, X3, X4, X5) == 5);
276
277 static_assert(ANOTHER_VARIADIC_MACRO() == 0);
278 static_assert(ANOTHER_VARIADIC_MACRO(X0) == 0);
279 static_assert(ANOTHER_VARIADIC_MACRO(X0, X1) == 1);
280 static_assert(ANOTHER_VARIADIC_MACRO(X0, X1, X2) == 2);
281 static_assert(ANOTHER_VARIADIC_MACRO(X0, X1, X2, X3) == 3);
282 static_assert(ANOTHER_VARIADIC_MACRO(X0, X1, X2, X3, X4) == 4);
283 static_assert(ANOTHER_VARIADIC_MACRO(X0, X1, X2, X3, X4, X5) == 5);
284
285 static_assert(ALWAYS_ONE_ARG() == 1);
286 static_assert(ALWAYS_ONE_ARG(X0) == 1);
287 static_assert(ALWAYS_ONE_ARG(X0, X1) == 1);
288 static_assert(ALWAYS_ONE_ARG(X0, X1, X2) == 1);
289 static_assert(ALWAYS_ONE_ARG(X0, X1, X2, X3) == 1);
290 static_assert(ALWAYS_ONE_ARG(X0, X1, X2, X3, X4) == 1);
291 static_assert(ALWAYS_ONE_ARG(X0, X1, X2, X3, X4, X5) == 1);
292}
293
294/* Tests all supported arg counts. This test was generated by the following
295 Python 3 code:
296for i in range(64 + 1):
297 args = [f'X{x}' for x in range(1, i + 1)]
Wyatt Hepler880cd682020-08-18 16:15:48 -0700298 print(f' static_assert(PW_ARG_COUNT({", ".join(args)}) == {i}) ')
Alexei Frolovc10c8122019-11-01 16:31:19 -0700299*/
300TEST(CountArgs, AllSupported) {
301 // clang-format off
Wyatt Hepler880cd682020-08-18 16:15:48 -0700302 static_assert(PW_ARG_COUNT() == 0);
303 static_assert(PW_ARG_COUNT(X1) == 1);
304 static_assert(PW_ARG_COUNT(X1, X2) == 2);
305 static_assert(PW_ARG_COUNT(X1, X2, X3) == 3);
306 static_assert(PW_ARG_COUNT(X1, X2, X3, X4) == 4);
307 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5) == 5);
308 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6) == 6);
309 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7) == 7);
310 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8) == 8);
311 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9) == 9);
312 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10) == 10);
313 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11) == 11);
314 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12) == 12);
315 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13) == 13);
316 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14) == 14);
317 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15) == 15);
318 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16) == 16);
319 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17) == 17);
320 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18) == 18);
321 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19) == 19);
322 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20) == 20);
323 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21) == 21);
324 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22) == 22);
325 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23) == 23);
326 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24) == 24);
327 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25) == 25);
328 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26) == 26);
329 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27) == 27);
330 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28) == 28);
331 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29) == 29);
332 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30) == 30);
333 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31) == 31);
334 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32) == 32);
335 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33) == 33);
336 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34) == 34);
337 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35) == 35);
338 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36) == 36);
339 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37) == 37);
340 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38) == 38);
341 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39) == 39);
342 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40) == 40);
343 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41) == 41);
344 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42) == 42);
345 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43) == 43);
346 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44) == 44);
347 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45) == 45);
348 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46) == 46);
349 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47) == 47);
350 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48) == 48);
351 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49) == 49);
352 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50) == 50);
353 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51) == 51);
354 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52) == 52);
355 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53) == 53);
356 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54) == 54);
357 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55) == 55);
358 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56) == 56);
359 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56, X57) == 57);
360 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56, X57, X58) == 58);
361 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56, X57, X58, X59) == 59);
362 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56, X57, X58, X59, X60) == 60);
363 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56, X57, X58, X59, X60, X61) == 61);
364 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56, X57, X58, X59, X60, X61, X62) == 62);
365 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56, X57, X58, X59, X60, X61, X62, X63) == 63);
366 static_assert(PW_ARG_COUNT(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56, X57, X58, X59, X60, X61, X62, X63, X64) == 64);
Alexei Frolovc10c8122019-11-01 16:31:19 -0700367 // clang-format on
368}
369
Robert Oliverd1323f42020-04-27 12:05:16 -0400370TEST(DelegateByArgCount, WithoutAndWithoutArguments) {
371#define TEST_SUM0() (0)
372#define TEST_SUM1(a) (a)
373#define TEST_SUM2(a, b) ((a) + (b))
374#define TEST_SUM3(a, b, c) ((a) + (b) + (c))
375
376 static_assert(PW_DELEGATE_BY_ARG_COUNT(TEST_SUM) == 0);
377 static_assert(PW_DELEGATE_BY_ARG_COUNT(TEST_SUM, 5) == 5);
378 static_assert(PW_DELEGATE_BY_ARG_COUNT(TEST_SUM, 1, 2) == 3);
379 static_assert(PW_DELEGATE_BY_ARG_COUNT(TEST_SUM, 1, 2, 3) == 6);
380}
381
Alexei Frolovc10c8122019-11-01 16:31:19 -0700382} // namespace
383} // namespace pw