mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-07 17:17:44 +03:00
test-tables: make sure we can test tables of either int or int64_t base type
To support both types, we unfortunately need to go down the macro rabbit hole a bit more. But it works.
This commit is contained in:
parent
a9a43d8aa2
commit
d385d54638
@ -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*);
|
||||
#include "string-util.h"
|
||||
|
||||
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);
|
||||
#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)
|
||||
|
Loading…
Reference in New Issue
Block a user