Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.4.
  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
 10static 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
 24static 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
 35static 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
 49static 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
 63static 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
 81static 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
105static 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
132static 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
144static 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
172static 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
185static 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
201static 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
216static struct kunit_suite args_test_suite = {
217	.name = "args",
218	.test_cases = args_tests,
219};
220
221kunit_test_suite(args_test_suite);