From 71ec1dd05e5577a2900057b5cebd31242908ed4d Mon Sep 17 00:00:00 2001 From: Andrea Shepard <andrea@persephoneslair.org> Date: Tue, 23 May 2017 15:10:30 +0000 Subject: [PATCH] Unit tests for backend names and descriptions --- src/SConscript | 1 + src/t_names.c | 37 +++++++++++++++++++++++++++++++++++++ src/test_suite.c | 2 ++ src/test_suite.h | 39 ++++++++++++++++++++++++++++++++++++++- 4 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 src/t_names.c diff --git a/src/SConscript b/src/SConscript index 9f75eb95..d109d25d 100644 --- a/src/SConscript +++ b/src/SConscript @@ -91,6 +91,7 @@ ctests = ['t_benchmark.c', 't_grammar.c', 't_misc.c', 't_mm.c', + 't_names.c', 't_regression.c'] diff --git a/src/t_names.c b/src/t_names.c new file mode 100644 index 00000000..263bd251 --- /dev/null +++ b/src/t_names.c @@ -0,0 +1,37 @@ +#include <glib.h> +#include <string.h> +#include "test_suite.h" +#include "hammer.h" + +static void test_tt_backend_description(void) { + const char *desc = NULL; + + /* Check that we get some */ + desc = h_get_descriptive_text_for_backend(PB_PACKRAT); + g_check_cmp_ptr(desc, !=, NULL); + desc = h_get_descriptive_text_for_backend(PB_REGULAR); + g_check_cmp_ptr(desc, !=, NULL); + desc = h_get_descriptive_text_for_backend(PB_LLk); + g_check_cmp_ptr(desc, !=, NULL); +} + +/* Reference backend names */ +static const char * packrat_name = "packrat"; +static const char * regular_name = "regex"; +static const char * llk_name = "llk"; + +static void test_tt_backend_short_name(void) { + const char *name = NULL; + + name = h_get_name_for_backend(PB_PACKRAT); + g_check_maybe_string_eq(name, packrat_name); + name = h_get_name_for_backend(PB_REGULAR); + g_check_maybe_string_eq(name, regular_name); + name = h_get_name_for_backend(PB_LLk); + g_check_maybe_string_eq(name, llk_name); +} + +void register_names_tests(void) { + g_test_add_func("/core/names/tt_backend_short_name", test_tt_backend_short_name); + g_test_add_func("/core/names/tt_backend_description", test_tt_backend_description); +} diff --git a/src/test_suite.c b/src/test_suite.c index f5696442..8bb30368 100644 --- a/src/test_suite.c +++ b/src/test_suite.c @@ -25,6 +25,7 @@ extern void register_parser_tests(); extern void register_grammar_tests(); extern void register_misc_tests(); extern void register_mm_tests(); +extern void register_names_tests(); extern void register_benchmark_tests(); extern void register_regression_tests(); @@ -38,6 +39,7 @@ int main(int argc, char** argv) { register_grammar_tests(); register_misc_tests(); register_mm_tests(); + register_names_tests(); register_regression_tests(); if (g_test_slow() || g_test_perf()) register_benchmark_tests(); diff --git a/src/test_suite.h b/src/test_suite.h index ed640fd8..b93e6848 100644 --- a/src/test_suite.h +++ b/src/test_suite.h @@ -35,6 +35,18 @@ } \ } while(0) +/* Comparison for ptr types; only == and != will work */ +#define g_check_cmp_ptr(p1, op, p2) do { \ + const void *_p1 = (p1); \ + const void *_p2 = (p2); \ + if (!(_p1 op _p2)) { \ + g_test_message("Check failed: (%s): (%p %s %p)", \ + #p1 " " #op " " #p2, \ + _p1, #op, _p2); \ + g_test_fail(); \ + } \ + } while (0); + #define g_check_bytes(len, n1, op, n2) do { \ const uint8_t *_n1 = (n1); \ const uint8_t *_n2 = (n2); \ @@ -56,6 +68,32 @@ } \ } while(0) +#define g_check_maybe_string_eq(n1, n2) do { \ + const char *_n1 = (n1); \ + const char *_n2 = (n2); \ + if (_n1 != _n2 && _n1 != NULL && _n2 != NULL) { \ + if (!(strcmp(_n1, _n2) == 0)) { \ + g_test_message("Check failed: (%s) (\"%s\" == \"%s\")", \ + #n1 " == " #n2, _n1, _n2); \ + g_test_fail(); \ + } \ + } else { \ + if (_n1 != NULL || _n2 != NULL) { \ + if (_n1 != NULL && _n2 == NULL) { \ + g_test_message("Check failed: (%s) (\"%s\" == NULL)", \ + #n1 " == " #n2, _n1); \ + g_test_fail(); \ + } else if (_n1 == NULL && _n2 != NULL) { \ + g_test_message("Check failed: (%s) (NULL == \"%s\")", \ + #n1 " == " #n2, _n2); \ + g_test_fail(); \ + } \ + /* else both are not-NULL, but point to the same string - succeed */ \ + } \ + /* else both are NULL, succeed */ \ + } \ + } while(0) + #define g_check_regular(lang) do { \ if (!lang->isValidRegular(lang->env)) { \ g_test_message("Language is not regular"); \ @@ -321,7 +359,6 @@ #define g_check_cmp_int64(n1, op, n2) g_check_inttype("%" PRId64, int64_t, n1, op, n2) #define g_check_cmp_uint32(n1, op, n2) g_check_inttype("%u", uint32_t, n1, op, n2) #define g_check_cmp_uint64(n1, op, n2) g_check_inttype("%" PRIu64, uint64_t, n1, op, n2) -#define g_check_cmp_ptr(n1, op, n2) g_check_inttype("%p", void *, n1, op, n2) #define g_check_cmpfloat(n1, op, n2) g_check_inttype("%g", float, n1, op, n2) #define g_check_cmpdouble(n1, op, n2) g_check_inttype("%g", double, n1, op, n2) -- GitLab