1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright © 2024 Intel Corporation
4 */
5
6 #include <kunit/test.h>
7
8 #include "xe_args.h"
9
call_args_example(struct kunit * test)10 static void call_args_example(struct kunit *test)
11 {
12 #define foo X, Y, Z, Q
13 #define bar COUNT_ARGS(foo)
14 #define buz CALL_ARGS(COUNT_ARGS, foo)
15
16 KUNIT_EXPECT_EQ(test, bar, 1);
17 KUNIT_EXPECT_EQ(test, buz, 4);
18
19 #undef foo
20 #undef bar
21 #undef buz
22 }
23
drop_first_arg_example(struct kunit * test)24 static void drop_first_arg_example(struct kunit *test)
25 {
26 #define foo X, Y, Z, Q
27 #define bar CALL_ARGS(COUNT_ARGS, DROP_FIRST_ARG(foo))
28
29 KUNIT_EXPECT_EQ(test, bar, 3);
30
31 #undef foo
32 #undef bar
33 }
34
first_arg_example(struct kunit * test)35 static void first_arg_example(struct kunit *test)
36 {
37 int X = 1;
38
39 #define foo X, Y, Z, Q
40 #define bar FIRST_ARG(foo)
41
42 KUNIT_EXPECT_EQ(test, bar, X);
43 KUNIT_EXPECT_STREQ(test, __stringify(bar), "X");
44
45 #undef foo
46 #undef bar
47 }
48
last_arg_example(struct kunit * test)49 static void last_arg_example(struct kunit *test)
50 {
51 int Q = 1;
52
53 #define foo X, Y, Z, Q
54 #define bar LAST_ARG(foo)
55
56 KUNIT_EXPECT_EQ(test, bar, Q);
57 KUNIT_EXPECT_STREQ(test, __stringify(bar), "Q");
58
59 #undef foo
60 #undef bar
61 }
62
pick_arg_example(struct kunit * test)63 static void pick_arg_example(struct kunit *test)
64 {
65 int Y = 1, Z = 2;
66
67 #define foo X, Y, Z, Q
68 #define bar PICK_ARG(2, foo)
69 #define buz PICK_ARG3(foo)
70
71 KUNIT_EXPECT_EQ(test, bar, Y);
72 KUNIT_EXPECT_STREQ(test, __stringify(bar), "Y");
73 KUNIT_EXPECT_EQ(test, buz, Z);
74 KUNIT_EXPECT_STREQ(test, __stringify(buz), "Z");
75
76 #undef foo
77 #undef bar
78 #undef buz
79 }
80
sep_comma_example(struct kunit * test)81 static void sep_comma_example(struct kunit *test)
82 {
83 #define foo(f) f(X) f(Y) f(Z) f(Q)
84 #define bar DROP_FIRST_ARG(foo(ARGS_SEP_COMMA __stringify))
85 #define buz CALL_ARGS(COUNT_ARGS, DROP_FIRST_ARG(foo(ARGS_SEP_COMMA)))
86
87 static const char * const a[] = { bar };
88
89 KUNIT_EXPECT_STREQ(test, a[0], "X");
90 KUNIT_EXPECT_STREQ(test, a[1], "Y");
91 KUNIT_EXPECT_STREQ(test, a[2], "Z");
92 KUNIT_EXPECT_STREQ(test, a[3], "Q");
93
94 KUNIT_EXPECT_EQ(test, buz, 4);
95
96 #undef foo
97 #undef bar
98 #undef buz
99 }
100
101 #define NO_ARGS
102 #define FOO_ARGS X, Y, Z, Q
103 #define MAX_ARGS -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12
104
count_args_test(struct kunit * test)105 static void count_args_test(struct kunit *test)
106 {
107 int count;
108
109 /* COUNT_ARGS() counts to 12 */
110
111 count = COUNT_ARGS();
112 KUNIT_EXPECT_EQ(test, count, 0);
113
114 count = COUNT_ARGS(1);
115 KUNIT_EXPECT_EQ(test, count, 1);
116
117 count = COUNT_ARGS(a, b, c, d, e);
118 KUNIT_EXPECT_EQ(test, count, 5);
119
120 count = COUNT_ARGS(a, b, c, d, e, f, g, h, i, j, k, l);
121 KUNIT_EXPECT_EQ(test, count, 12);
122
123 /* COUNT_ARGS() does not expand params */
124
125 count = COUNT_ARGS(NO_ARGS);
126 KUNIT_EXPECT_EQ(test, count, 1);
127
128 count = COUNT_ARGS(FOO_ARGS);
129 KUNIT_EXPECT_EQ(test, count, 1);
130 }
131
call_args_test(struct kunit * test)132 static void call_args_test(struct kunit *test)
133 {
134 int count;
135
136 count = CALL_ARGS(COUNT_ARGS, NO_ARGS);
137 KUNIT_EXPECT_EQ(test, count, 0);
138 KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, NO_ARGS), 0);
139 KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, FOO_ARGS), 4);
140 KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, FOO_ARGS, FOO_ARGS), 8);
141 KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, MAX_ARGS), 12);
142 }
143
drop_first_arg_test(struct kunit * test)144 static void drop_first_arg_test(struct kunit *test)
145 {
146 int Y = -2, Z = -3, Q = -4;
147 int a[] = { DROP_FIRST_ARG(FOO_ARGS) };
148
149 KUNIT_EXPECT_EQ(test, DROP_FIRST_ARG(0, -1), -1);
150 KUNIT_EXPECT_EQ(test, DROP_FIRST_ARG(DROP_FIRST_ARG(0, -1, -2)), -2);
151
152 KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, DROP_FIRST_ARG(FOO_ARGS)), 3);
153 KUNIT_EXPECT_EQ(test, DROP_FIRST_ARG(DROP_FIRST_ARG(DROP_FIRST_ARG(FOO_ARGS))), -4);
154 KUNIT_EXPECT_EQ(test, a[0], -2);
155 KUNIT_EXPECT_EQ(test, a[1], -3);
156 KUNIT_EXPECT_EQ(test, a[2], -4);
157
158 #define foo DROP_FIRST_ARG(FOO_ARGS)
159 #define bar DROP_FIRST_ARG(DROP_FIRST_ARG(FOO_ARGS))
160 #define buz DROP_FIRST_ARG(DROP_FIRST_ARG(DROP_FIRST_ARG(FOO_ARGS)))
161
162 KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, foo), 3);
163 KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, bar), 2);
164 KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, buz), 1);
165 KUNIT_EXPECT_STREQ(test, __stringify(buz), "Q");
166
167 #undef foo
168 #undef bar
169 #undef buz
170 }
171
first_arg_test(struct kunit * test)172 static void first_arg_test(struct kunit *test)
173 {
174 int X = -1;
175 int a[] = { FIRST_ARG(FOO_ARGS) };
176
177 KUNIT_EXPECT_EQ(test, FIRST_ARG(-1, -2), -1);
178
179 KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, FIRST_ARG(FOO_ARGS)), 1);
180 KUNIT_EXPECT_EQ(test, FIRST_ARG(FOO_ARGS), -1);
181 KUNIT_EXPECT_EQ(test, a[0], -1);
182 KUNIT_EXPECT_STREQ(test, __stringify(FIRST_ARG(FOO_ARGS)), "X");
183 }
184
last_arg_test(struct kunit * test)185 static void last_arg_test(struct kunit *test)
186 {
187 int Q = -4;
188 int a[] = { LAST_ARG(FOO_ARGS) };
189
190 KUNIT_EXPECT_EQ(test, LAST_ARG(-1, -2), -2);
191
192 KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, LAST_ARG(FOO_ARGS)), 1);
193 KUNIT_EXPECT_EQ(test, LAST_ARG(FOO_ARGS), -4);
194 KUNIT_EXPECT_EQ(test, a[0], -4);
195 KUNIT_EXPECT_STREQ(test, __stringify(LAST_ARG(FOO_ARGS)), "Q");
196
197 KUNIT_EXPECT_EQ(test, LAST_ARG(MAX_ARGS), -12);
198 KUNIT_EXPECT_STREQ(test, __stringify(LAST_ARG(MAX_ARGS)), "-12");
199 }
200
201 static struct kunit_case args_tests[] = {
202 KUNIT_CASE(count_args_test),
203 KUNIT_CASE(call_args_example),
204 KUNIT_CASE(call_args_test),
205 KUNIT_CASE(drop_first_arg_example),
206 KUNIT_CASE(drop_first_arg_test),
207 KUNIT_CASE(first_arg_example),
208 KUNIT_CASE(first_arg_test),
209 KUNIT_CASE(last_arg_example),
210 KUNIT_CASE(last_arg_test),
211 KUNIT_CASE(pick_arg_example),
212 KUNIT_CASE(sep_comma_example),
213 {}
214 };
215
216 static struct kunit_suite args_test_suite = {
217 .name = "args",
218 .test_cases = args_tests,
219 };
220
221 kunit_test_suite(args_test_suite);
222