test: add litest string comparison macros
authorPeter Hutterer <peter.hutterer@who-t.net>
Mon, 16 Sep 2024 06:13:44 +0000 (16:13 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Tue, 15 Oct 2024 02:44:27 +0000 (12:44 +1000)
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1059>

test/litest-selftest.c
test/litest.c
test/litest.h

index b3c504babcf32d171a36ded19992e4a29e0e68fa..9634bcdf19e7043b01321b3bd771f8cb4ac6b750 100644 (file)
@@ -420,6 +420,38 @@ START_TEST(litest_double_ge_fails)
 }
 END_TEST
 
+START_TEST(litest_string_eq_ne)
+{
+       litest_assert_str_eq("foo", "foo");
+       litest_assert_str_ne("foo", "bar");
+       litest_assert_str_ne("foo", "foobar");
+       litest_assert_str_ne("foobar", "foo");
+
+       const char *a1 = "a";
+       const char *a2 = "a";
+       const char *b = "b";
+
+       litest_assert_str_eq(NULL, NULL);
+       litest_assert_str_eq(a1, a2);
+       litest_assert_str_ne(a1, b);
+       litest_assert_str_ne(a2, b);
+       litest_assert_str_ne(a2, b);
+       litest_assert_str_ne(b, NULL);
+}
+END_TEST
+
+START_TEST(litest_string_eq_fails)
+{
+       litest_assert_str_eq("foo", "bar");
+}
+END_TEST
+
+START_TEST(litest_string_ne_fails)
+{
+       litest_assert_str_ne("foo", "foo");
+}
+END_TEST
+
 START_TEST(zalloc_overflow)
 {
        zalloc((size_t)-1);
@@ -514,6 +546,12 @@ litest_assert_macros_suite(void)
        tcase_add_test_raise_signal(tc, litest_double_ge_fails, SIGABRT);
        suite_add_tcase(s, tc);
 
+       tc = tcase_create("string comparison ");
+       tcase_add_test(tc, litest_string_eq_ne);
+       tcase_add_test_raise_signal(tc, litest_string_eq_fails, SIGABRT);
+       tcase_add_test_raise_signal(tc, litest_string_ne_fails, SIGABRT);
+       suite_add_tcase(s, tc);
+
        tc = tcase_create("zalloc ");
        tcase_add_test(tc, zalloc_max_size);
        tcase_add_test_raise_signal(tc, zalloc_overflow, SIGABRT);
index 22cf92a6068fdcb5bf836fe74fc0f02845e643b9..ee21fe4407e85c494ad6cdad0daf1e075b153c4f 100644 (file)
@@ -258,6 +258,23 @@ litest_fail_comparison_ptr(const char *file,
        abort();
 }
 
+__attribute__((noreturn))
+void
+litest_fail_comparison_str(const char *file,
+                          int line,
+                          const char *func,
+                          const char *comparison,
+                          const char *operator,
+                          const char *astr,
+                          const char *bstr)
+{
+       litest_log("FAILED COMPARISON: %s %s %s\n", astr, operator, bstr);
+       litest_log("Resolved to: %s %s %s\n", astr, operator, bstr);
+       litest_log("in %s() (%s:%d)\n", func, file, line);
+       litest_backtrace();
+       abort();
+}
+
 struct test {
        struct list node;
        char *name;
index 98ca00f9ca5333991d572fe2647d23f9e7f4ff26..0f192c9d0c093c7571ca5c701a27e8bc3f92ffa0 100644 (file)
@@ -131,6 +131,15 @@ litest_fail_comparison_ptr(const char *file,
                           const char *func,
                           const char *comparison);
 
+void
+litest_fail_comparison_str(const char *file,
+                          int line,
+                          const char *func,
+                          const char *comparison,
+                          const char *operator,
+                          const char *astr,
+                          const char *bstr);
+
 #define litest_assert(cond) \
        do { \
                if (!(cond)) \
@@ -222,6 +231,28 @@ litest_fail_comparison_ptr(const char *file,
 #define litest_assert_ptr_notnull(a_) \
        litest_assert_comparison_ptr_(a_, !=, NULL)
 
+#define litest_assert_str_eq(a_, b_) \
+       do { \
+               const char *_a = a_; \
+               const char *_b = b_; \
+               if (!streq(_a, _b)) \
+                       litest_fail_comparison_str(__FILE__, __LINE__, __func__,\
+                                                  #a_ " == " #b_, \
+                                                  "==", \
+                                                  _a, _b); \
+       } while(0)
+
+#define litest_assert_str_ne(a_, b_) \
+       do { \
+               const char *_a = a_; \
+               const char *_b = b_; \
+               if (streq(_a, _b)) \
+                       litest_fail_comparison_str(__FILE__, __LINE__, __func__,\
+                                                  #a_ " != " #b_, \
+                                                  "!=", \
+                                                  _a, _b); \
+       } while(0)
+
 #define LITEST_DEFAULT_EPSILON  0.001
 
 #define litest_assert_double_eq_epsilon(a_, b_, epsilon_)\