]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test-tables: make sure we can test tables of either int or int64_t base type
authorLennart Poettering <lennart@poettering.net>
Thu, 11 Feb 2021 15:02:26 +0000 (16:02 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 16 Feb 2021 19:35:07 +0000 (20:35 +0100)
To support both types, we unfortunately need to go down the macro rabbit
hole a bit more. But it works.

src/shared/test-tables.h

index 90210b9b598575a56c5e38bb7171ba0ba55bf2b1..3f20318db16511081ec983a567b4f3b439f7eb60 100644 (file)
@@ -1,48 +1,43 @@
 /* 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)