222 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Copyright © 2024 Intel Corporation4 */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, Q13#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 foo20#undef bar21#undef buz22}23 24static void drop_first_arg_example(struct kunit *test)25{26#define foo X, Y, Z, Q27#define bar CALL_ARGS(COUNT_ARGS, DROP_FIRST_ARG(foo))28 29 KUNIT_EXPECT_EQ(test, bar, 3);30 31#undef foo32#undef bar33}34 35static void first_arg_example(struct kunit *test)36{37 int X = 1;38 39#define foo X, Y, Z, Q40#define bar FIRST_ARG(foo)41 42 KUNIT_EXPECT_EQ(test, bar, X);43 KUNIT_EXPECT_STREQ(test, __stringify(bar), "X");44 45#undef foo46#undef bar47}48 49static void last_arg_example(struct kunit *test)50{51 int Q = 1;52 53#define foo X, Y, Z, Q54#define bar LAST_ARG(foo)55 56 KUNIT_EXPECT_EQ(test, bar, Q);57 KUNIT_EXPECT_STREQ(test, __stringify(bar), "Q");58 59#undef foo60#undef bar61}62 63static void pick_arg_example(struct kunit *test)64{65 int Y = 1, Z = 2;66 67#define foo X, Y, Z, Q68#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 foo77#undef bar78#undef buz79}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 foo97#undef bar98#undef buz99}100 101#define NO_ARGS102#define FOO_ARGS X, Y, Z, Q103#define MAX_ARGS -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12104 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 foo168#undef bar169#undef buz170}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);222