summaryrefslogtreecommitdiffstats
path: root/tests/test.h
diff options
context:
space:
mode:
authorClement Sibille <clements+git@lisible.xyz>2024-05-09 08:58:14 +0900
committerClement Sibille <clements+git@lisible.xyz>2024-05-09 08:58:14 +0900
commit5a26e1f481fe85f08093a414e27c1056b85c6715 (patch)
tree20a2384554cfcb437a4b604e02b4a9978507cafc /tests/test.h
Initial commit
Diffstat (limited to 'tests/test.h')
-rw-r--r--tests/test.h74
1 files changed, 74 insertions, 0 deletions
diff --git a/tests/test.h b/tests/test.h
new file mode 100644
index 0000000..223abf5
--- /dev/null
+++ b/tests/test.h
@@ -0,0 +1,74 @@
+#ifndef LSTD_TESTS_TEST_H
+#define LSTD_TESTS_TEST_H
+
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define TEST_DATA_PATH "../cuttereng/tests/tests_data/"
+
+typedef void (*TestFn)(void);
+
+typedef struct {
+ const char *name;
+ TestFn fn;
+} Test;
+
+extern Test tests[];
+extern size_t test_count;
+
+inline static void assert0(int boolean, const char *msg) {
+ if (!boolean) {
+ fprintf(stderr, "%s", msg);
+ exit(1);
+ }
+}
+
+inline static void assert(int boolean, const char *fmt, ...) {
+ if (!boolean) {
+ va_list args;
+ va_start(args, fmt);
+ fprintf(stderr, fmt, args);
+ va_end(args);
+ exit(1);
+ }
+}
+
+#define T_ASSERT(expr) T_ASSERT_MSG(expr, "%s", #expr)
+
+#define STRINGIFY(x) #x
+#define TOSTRING(x) STRINGIFY(x)
+
+#define T_ASSERT_MSG(expr, fmt, ...) \
+ do { \
+ assert((expr), \
+ "Assertion failed in " __FILE__ ":" TOSTRING(__LINE__) ": " fmt \
+ "\n", \
+ __VA_ARGS__); \
+ } while (0)
+#define T_ASSERT_MSG0(expr, msg) \
+ do { \
+ assert0((expr), "Assertion failed in " __FILE__ \
+ ":" TOSTRING(__LINE__) ": " msg "\n"); \
+ } while (0)
+
+#define T_ASSERT_EQ(a, b) T_ASSERT_MSG0((a == b), #a " != " #b)
+#define T_ASSERT_FLOAT_EQ(a, b, epsilon) \
+ T_ASSERT_MSG0((fabs(a - b) < epsilon), #a " != " #b)
+
+#define T_ASSERT_NULL(a) T_ASSERT_MSG0((a == NULL), #a " is not NULL")
+#define T_ASSERT_NOT_NULL(a) T_ASSERT_MSG0((a != NULL), #a " is NULL")
+
+#define T_ASSERT_STR_EQ(a, b, length) \
+ T_ASSERT_MSG0((strncmp(a, b, length) == 0), #a " != " #b)
+
+#define ARG_COUNT(...) (sizeof((Test[]){__VA_ARGS__}) / sizeof(Test))
+#define TEST_SUITE(...) \
+ Test tests[] = {__VA_ARGS__}; \
+ size_t test_count = ARG_COUNT(__VA_ARGS__);
+#define TEST(x) \
+ { .name = #x, .fn = x }
+
+#endif // LSTD_TESTS_TEST_H
Go back to lisible.xyz