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