xref: /linux/drivers/gpu/drm/xe/tests/xe_args_test.c (revision 62010b3cd6030ff743930c9ae898d8e4e943100d)
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 
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 
24 static void drop_first_example(struct kunit *test)
25 {
26 #define foo	X, Y, Z, Q
27 #define bar	CALL_ARGS(COUNT_ARGS, DROP_FIRST(foo))
28 
29 	KUNIT_EXPECT_EQ(test, bar, 3);
30 
31 #undef foo
32 #undef bar
33 }
34 
35 static void pick_first_example(struct kunit *test)
36 {
37 	int X = 1;
38 
39 #define foo	X, Y, Z, Q
40 #define bar	PICK_FIRST(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 
49 static void pick_last_example(struct kunit *test)
50 {
51 	int Q = 1;
52 
53 #define foo	X, Y, Z, Q
54 #define bar	PICK_LAST(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 
63 static void sep_comma_example(struct kunit *test)
64 {
65 #define foo(f)	f(X) f(Y) f(Z) f(Q)
66 #define bar	DROP_FIRST(foo(ARGS_SEP_COMMA __stringify))
67 #define buz	CALL_ARGS(COUNT_ARGS, DROP_FIRST(foo(ARGS_SEP_COMMA)))
68 
69 	static const char * const a[] = { bar };
70 
71 	KUNIT_EXPECT_STREQ(test, a[0], "X");
72 	KUNIT_EXPECT_STREQ(test, a[1], "Y");
73 	KUNIT_EXPECT_STREQ(test, a[2], "Z");
74 	KUNIT_EXPECT_STREQ(test, a[3], "Q");
75 
76 	KUNIT_EXPECT_EQ(test, buz, 4);
77 
78 #undef foo
79 #undef bar
80 #undef buz
81 }
82 
83 #define NO_ARGS
84 #define FOO_ARGS	X, Y, Z, Q
85 #define MAX_ARGS	-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12
86 
87 static void count_args_test(struct kunit *test)
88 {
89 	int count;
90 
91 	/* COUNT_ARGS() counts to 12 */
92 
93 	count = COUNT_ARGS();
94 	KUNIT_EXPECT_EQ(test, count, 0);
95 
96 	count = COUNT_ARGS(1);
97 	KUNIT_EXPECT_EQ(test, count, 1);
98 
99 	count = COUNT_ARGS(a, b, c, d, e);
100 	KUNIT_EXPECT_EQ(test, count, 5);
101 
102 	count = COUNT_ARGS(a, b, c, d, e, f, g, h, i, j, k, l);
103 	KUNIT_EXPECT_EQ(test, count, 12);
104 
105 	/* COUNT_ARGS() does not expand params */
106 
107 	count = COUNT_ARGS(NO_ARGS);
108 	KUNIT_EXPECT_EQ(test, count, 1);
109 
110 	count = COUNT_ARGS(FOO_ARGS);
111 	KUNIT_EXPECT_EQ(test, count, 1);
112 }
113 
114 static void call_args_test(struct kunit *test)
115 {
116 	int count;
117 
118 	count = CALL_ARGS(COUNT_ARGS, NO_ARGS);
119 	KUNIT_EXPECT_EQ(test, count, 0);
120 	KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, NO_ARGS), 0);
121 	KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, FOO_ARGS), 4);
122 	KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, FOO_ARGS, FOO_ARGS), 8);
123 	KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, MAX_ARGS), 12);
124 }
125 
126 static void drop_first_test(struct kunit *test)
127 {
128 	int Y = -2, Z = -3, Q = -4;
129 	int a[] = { DROP_FIRST(FOO_ARGS) };
130 
131 	KUNIT_EXPECT_EQ(test, DROP_FIRST(0, -1), -1);
132 	KUNIT_EXPECT_EQ(test, DROP_FIRST(DROP_FIRST(0, -1, -2)), -2);
133 
134 	KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, DROP_FIRST(FOO_ARGS)), 3);
135 	KUNIT_EXPECT_EQ(test, DROP_FIRST(DROP_FIRST(DROP_FIRST(FOO_ARGS))), -4);
136 	KUNIT_EXPECT_EQ(test, a[0], -2);
137 	KUNIT_EXPECT_EQ(test, a[1], -3);
138 	KUNIT_EXPECT_EQ(test, a[2], -4);
139 	KUNIT_EXPECT_STREQ(test, __stringify(DROP_FIRST(DROP_FIRST(DROP_FIRST(FOO_ARGS)))), "Q");
140 }
141 
142 static void pick_first_test(struct kunit *test)
143 {
144 	int X = -1;
145 	int a[] = { PICK_FIRST(FOO_ARGS) };
146 
147 	KUNIT_EXPECT_EQ(test, PICK_FIRST(-1, -2), -1);
148 
149 	KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, PICK_FIRST(FOO_ARGS)), 1);
150 	KUNIT_EXPECT_EQ(test, PICK_FIRST(FOO_ARGS), -1);
151 	KUNIT_EXPECT_EQ(test, a[0], -1);
152 	KUNIT_EXPECT_STREQ(test, __stringify(PICK_FIRST(FOO_ARGS)), "X");
153 }
154 
155 static void pick_last_test(struct kunit *test)
156 {
157 	int Q = -4;
158 	int a[] = { PICK_LAST(FOO_ARGS) };
159 
160 	KUNIT_EXPECT_EQ(test, PICK_LAST(-1, -2), -2);
161 
162 	KUNIT_EXPECT_EQ(test, CALL_ARGS(COUNT_ARGS, PICK_LAST(FOO_ARGS)), 1);
163 	KUNIT_EXPECT_EQ(test, PICK_LAST(FOO_ARGS), -4);
164 	KUNIT_EXPECT_EQ(test, a[0], -4);
165 	KUNIT_EXPECT_STREQ(test, __stringify(PICK_LAST(FOO_ARGS)), "Q");
166 
167 	KUNIT_EXPECT_EQ(test, PICK_LAST(MAX_ARGS), -12);
168 	KUNIT_EXPECT_STREQ(test, __stringify(PICK_LAST(MAX_ARGS)), "-12");
169 }
170 
171 static struct kunit_case args_tests[] = {
172 	KUNIT_CASE(count_args_test),
173 	KUNIT_CASE(call_args_example),
174 	KUNIT_CASE(call_args_test),
175 	KUNIT_CASE(drop_first_example),
176 	KUNIT_CASE(drop_first_test),
177 	KUNIT_CASE(pick_first_example),
178 	KUNIT_CASE(pick_first_test),
179 	KUNIT_CASE(pick_last_example),
180 	KUNIT_CASE(pick_last_test),
181 	KUNIT_CASE(sep_comma_example),
182 	{}
183 };
184 
185 static struct kunit_suite args_test_suite = {
186 	.name = "args",
187 	.test_cases = args_tests,
188 };
189 
190 kunit_test_suite(args_test_suite);
191