Reduce duplicate code in libx52 test code

pull/22/head
nirenjan 2020-06-14 00:07:40 -07:00
parent e1915bc734
commit 3eaee7b8f4
4 changed files with 68 additions and 115 deletions

View File

@ -16,12 +16,11 @@
typedef int (*blink_shift_fn)(libx52_device *, uint8_t);
struct test_case {
const char *test_case_id;
TEST_STRUCT (
blink_shift_fn func;
uint8_t state;
struct ivpair data[2];
};
)
#define on 1
#define off 0
@ -36,23 +35,16 @@ struct test_case {
#define TEST(func, state) { #func "/" #state, libx52_set_ ## func, state, {{ x52_ ## func ## _indicator, x52_ ## func ## _ ## state}, {0, 0}}}
const struct test_case test_cases[] = {
TEST_CASES = {
TEST(blink, on),
TEST(blink, off),
TEST(shift, on),
TEST(shift, off),
};
#define TC_COUNT (sizeof(test_cases) / sizeof(test_cases[0]))
void run_test(int tc_id)
TEST_FUNC()
{
struct libx52_device *dev = x52_test_init();
struct test_case test = test_cases[tc_id];
#define PRINT_FAIL() printf("not ok %d %s\n", tc_id+1, test.test_case_id)
#define PRINT_PASS() printf("ok %d %s\n", tc_id+1, test.test_case_id)
TEST_INIT();
int rc = (*test.func)(dev, test.state);
if (rc != LIBX52_SUCCESS) {
@ -61,29 +53,7 @@ void run_test(int tc_id)
return;
}
rc = libx52_update(dev);
if (rc != LIBX52_SUCCESS) {
PRINT_FAIL();
printf("# libx52_update failed, rc = %d\n", rc);
return;
TEST_VERIFY(test.data);
}
if (!x52_test_assert_expected(dev, test.data)) {
PRINT_FAIL();
x52_test_print_diagnostics();
return;
}
PRINT_PASS();
x52_test_cleanup(dev);
}
int main()
{
int i;
printf("1..%ld\n", TC_COUNT);
for (i = 0; i < TC_COUNT; i++) {
run_test(i);
}
}
TEST_MAIN()

View File

@ -48,4 +48,47 @@ void x52_test_cleanup(libx52_device *dev);
void x52_test_print_observed_data(libx52_device *dev);
void x52_test_print_expected_data(struct ivpair *data);
#define PRINT_FAIL() printf("not ok %d %s\n", tc_id+1, test.test_case_id)
#define PRINT_PASS() printf("ok %d %s\n", tc_id+1, test.test_case_id)
#define TEST_STRUCT(...) struct test_case { \
const char *test_case_id; \
__VA_ARGS__ \
};
#define TEST_CASES const struct test_case test_cases[]
#define TEST_FUNC() void run_test(int tc_id)
#define TEST_INIT() \
struct libx52_device *dev = x52_test_init(); \
struct test_case test = test_cases[tc_id];
#define TEST_VERIFY(data) do { \
int test_rc; \
test_rc = libx52_update(dev); \
if (test_rc != LIBX52_SUCCESS) { \
PRINT_FAIL(); \
printf("# libx52_update failed, rc = %d\n", test_rc); \
return; \
} \
\
if (!x52_test_assert_expected(dev, data)) { \
PRINT_FAIL(); \
x52_test_print_diagnostics(); \
x52_test_print_expected_data(data); \
x52_test_print_observed_data(dev); \
return; \
} \
\
PRINT_PASS(); \
x52_test_cleanup(dev); \
} while(0)
#define TEST_MAIN() int main() { \
int i; \
size_t tc_count = sizeof(test_cases) / sizeof(test_cases[0]); \
printf("1..%lu\n", tc_count); \
for (i = 0; i < tc_count; i++) { \
run_test(i); \
} \
}
#endif // !defined _TEST_COMMON_H

View File

@ -14,13 +14,12 @@
#include "test_common.h"
#include "x52_commands.h"
struct test_case {
const char *test_case_id;
TEST_STRUCT (
libx52_led_id led_id;
libx52_led_state state;
int retval;
struct ivpair data[3];
};
)
#define X52_LED_CMD 0xb8
#define UNSUPPORTED(led, state) { #led "/" #state " unsupported", LIBX52_LED_ ## led, LIBX52_LED_STATE_ ## state, LIBX52_ERROR_NOT_SUPPORTED}
@ -31,7 +30,7 @@ struct test_case {
#define AMBER(led) { #led "/Amber", LIBX52_LED_## led, LIBX52_LED_STATE_AMBER, LIBX52_SUCCESS, {{X52_LED_CMD, ((LIBX52_LED_ ## led + 0) << 8) | 1}, {X52_LED_CMD, ((LIBX52_LED_ ## led + 1) << 8) | 1}, {0, 0}}}
#define GREEN(led) { #led "/Green", LIBX52_LED_## led, LIBX52_LED_STATE_GREEN, LIBX52_SUCCESS, {{X52_LED_CMD, ((LIBX52_LED_ ## led + 0) << 8) | 0}, {X52_LED_CMD, ((LIBX52_LED_ ## led + 1) << 8) | 1}, {0, 0}}}
const struct test_case test_cases[] = {
TEST_CASES = {
OFF_MONO(FIRE),
ON(FIRE),
UNSUPPORTED(FIRE, RED),
@ -99,21 +98,16 @@ const struct test_case test_cases[] = {
UNSUPPORTED(THROTTLE, GREEN),
};
#define TC_COUNT (sizeof(test_cases) / sizeof(test_cases[0]))
void run_test(int tc_id)
TEST_FUNC()
{
struct libx52_device *dev = x52_test_init();
struct test_case test = test_cases[tc_id];
TEST_INIT();
/* Set the X52Pro flag in dev->flags, otherwise libx52_set_led_state will
* always return not supported
*/
dev->flags = 1;
#define PRINT_FAIL() printf("not ok %d %s\n", tc_id+1, test.test_case_id)
#define PRINT_PASS() printf("ok %d %s\n", tc_id+1, test.test_case_id)
int rc = libx52_set_led_state(dev, test.led_id, test.state);
if (rc != test.retval) {
@ -122,29 +116,7 @@ void run_test(int tc_id)
return;
}
rc = libx52_update(dev);
if (rc != LIBX52_SUCCESS) {
PRINT_FAIL();
printf("# libx52_update failed, rc = %d\n", rc);
return;
TEST_VERIFY(test.data);
}
if (!x52_test_assert_expected(dev, test.data)) {
PRINT_FAIL();
x52_test_print_diagnostics();
return;
}
PRINT_PASS();
x52_test_cleanup(dev);
}
int main()
{
int i;
printf("1..%ld\n", TC_COUNT);
for (i = 0; i < TC_COUNT; i++) {
run_test(i);
}
}
TEST_MAIN()

View File

@ -13,18 +13,17 @@
#include "x52_common.h"
#include "test_common.h"
struct test_case {
const char *test_case_id;
TEST_STRUCT (
int offset_primary;
int offset_secondary;
libx52_clock_id clock_id;
uint16_t x52_clock;
uint16_t x52_offset;
};
)
#define TEST(id, o1, o23, offs) {id, o1, o23, LIBX52_CLOCK_2, 0xc1, offs}, {id, o1, o23, LIBX52_CLOCK_3, 0xc2, offs}
const struct test_case test_cases[] = {
TEST_CASES = {
TEST("Etc/UTC+24|Etc/UTC-24", -1440, +1440, 0),
TEST("Etc/UTC-24|Etc/UTC+24", +1440, -1440, 0x0400), // Negative 0
TEST("Honolulu|Auckland", -600, +720, 0x0478), // -2 hours
@ -39,18 +38,12 @@ const struct test_case test_cases[] = {
TEST("Etc/UTC-12|Etc/UTC+12", +720, -720, 0x0400),
};
#define TC_COUNT (sizeof(test_cases) / sizeof(test_cases[0]))
void run_test(int tc_id)
TEST_FUNC()
{
struct libx52_device *dev = x52_test_init();
struct test_case test = test_cases[tc_id];
TEST_INIT();
int rc;
struct ivpair data[2] = { 0 };
#define PRINT_FAIL() printf("not ok %d %s/%d\n", tc_id+1, test.test_case_id, test.clock_id + 1)
#define PRINT_PASS() printf("ok %d %s/%d\n", tc_id+1, test.test_case_id, test.clock_id + 1)
dev->timezone[LIBX52_CLOCK_1] = test.offset_primary;
rc = libx52_set_clock_timezone(dev, test.clock_id, test.offset_secondary);
if (rc != LIBX52_SUCCESS) {
@ -59,34 +52,9 @@ void run_test(int tc_id)
return;
}
rc = libx52_update(dev);
if (rc != LIBX52_SUCCESS) {
PRINT_FAIL();
printf("# libx52_update failed, rc = %d\n", rc);
return;
}
data[0].index = test.x52_clock;
data[0].value = test.x52_offset;
if (!x52_test_assert_expected(dev, data)) {
PRINT_FAIL();
x52_test_print_diagnostics();
x52_test_print_expected_data(data);
x52_test_print_observed_data(dev);
return;
TEST_VERIFY(data);
}
PRINT_PASS();
x52_test_cleanup(dev);
}
int main()
{
int i;
printf("1..%ld\n", TC_COUNT);
for (i = 0; i < TC_COUNT; i++) {
run_test(i);
}
}
TEST_MAIN();