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