/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+#include <errno.h>
+#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-typedef const char* (*lookup_t)(int);
-typedef int (*reverse_t)(const char*);
-
-static inline void _test_table(const char *name,
- lookup_t lookup,
- reverse_t reverse,
- int size,
- bool sparse) {
- int i, boring = 0;
-
- for (i = -1; i < size + 1; i++) {
- const char* val = lookup(i);
- int rev;
-
- if (val) {
- rev = reverse(val);
- boring = 0;
- } else {
- rev = reverse("--no-such--value----");
- boring += i >= 0;
- }
-
- if (boring < 1 || i == size)
- printf("%s: %d → %s → %d\n", name, i, strnull(val), rev);
- else if (boring == 1)
- printf("%*s ...\n", (int) strlen(name), "");
-
- if (i >= 0 && i < size) {
- if (sparse)
- assert_se(rev == i || rev == -EINVAL);
- else
- assert_se(val != NULL && rev == i);
- } else
- assert_se(val == NULL && rev == -EINVAL);
+#include "string-util.h"
+
+#define _test_table(name, lookup, reverse, size, sparse) \
+ for (int64_t _i = -EINVAL, _boring = 0; _i < size + 1; _i++) { \
+ const char* _val; \
+ int64_t _rev; \
+ \
+ _val = lookup(_i); \
+ if (_val) { \
+ _rev = reverse(_val); \
+ _boring = 0; \
+ } else { \
+ _rev = reverse("--no-such--value----"); \
+ _boring += _i >= 0; \
+ } \
+ if (_boring == 0 || _i == size) \
+ printf("%s: %" PRIi64 " → %s → %" PRIi64 "\n", name, _i, strnull(_val), _rev); \
+ else if (_boring == 1) \
+ printf("%*s ...\n", (int) strlen(name), ""); \
+ \
+ if (_i >= 0 && _i < size) { \
+ if (sparse) \
+ assert_se(_rev == _i || _rev == -EINVAL); \
+ else \
+ assert_se(_val && _rev == _i); \
+ } else \
+ assert_se(!_val && _rev == -EINVAL); \
}
-}
-#define test_table(lower, upper) \
+#define test_table(lower, upper) \
_test_table(STRINGIFY(lower), lower##_to_string, lower##_from_string, _##upper##_MAX, false)
-#define test_table_sparse(lower, upper) \
+#define test_table_sparse(lower, upper) \
_test_table(STRINGIFY(lower), lower##_to_string, lower##_from_string, _##upper##_MAX, true)