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