summaryrefslogtreecommitdiff
path: root/libs/cglm/test/include
diff options
context:
space:
mode:
Diffstat (limited to 'libs/cglm/test/include')
-rw-r--r--libs/cglm/test/include/common.h159
1 files changed, 159 insertions, 0 deletions
diff --git a/libs/cglm/test/include/common.h b/libs/cglm/test/include/common.h
new file mode 100644
index 0000000..2eb2e83
--- /dev/null
+++ b/libs/cglm/test/include/common.h
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+#ifndef tests_common_h
+#define tests_common_h
+
+#ifndef _USE_MATH_DEFINES
+# define _USE_MATH_DEFINES /* for windows */
+#endif
+
+#ifndef _CRT_SECURE_NO_WARNINGS
+# define _CRT_SECURE_NO_WARNINGS /* for windows */
+#endif
+
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE /* for drand48() */
+#endif
+
+#ifndef CGLM_CLIPSPACE_INCLUDE_ALL
+# define CGLM_CLIPSPACE_INCLUDE_ALL
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <cglm/cglm.h>
+#include <cglm/struct.h>
+#include <cglm/call.h>
+
+typedef struct test_status_t {
+ const char *msg;
+ int status;
+} test_status_t;
+
+typedef test_status_t (*fntest)(void);
+
+typedef struct test_entry_t {
+ char *name;
+ fntest entry;
+ int ret;
+ int show_output;
+} test_entry_t;
+
+#ifndef GLM_TESTS_NO_COLORFUL_OUTPUT
+
+#define RESET "\033[0m"
+#define BLACK "\033[30m" /* Black */
+#define RED "\033[31m" /* Red */
+#define GREEN "\033[32m" /* Green */
+#define YELLOW "\033[33m" /* Yellow */
+#define BLUE "\033[34m" /* Blue */
+#define MAGENTA "\033[35m" /* Magenta */
+#define CYAN "\033[36m" /* Cyan */
+#define WHITE "\033[37m" /* White */
+#define BOLDBLACK "\033[1m\033[30m" /* Bold Black */
+#define BOLDRED "\033[1m\033[31m" /* Bold Red */
+#define BOLDGREEN "\033[1m\033[32m" /* Bold Green */
+#define BOLDYELLOW "\033[1m\033[33m" /* Bold Yellow */
+#define BOLDBLUE "\033[1m\033[34m" /* Bold Blue */
+#define BOLDMAGENTA "\033[1m\033[35m" /* Bold Magenta */
+#define BOLDCYAN "\033[1m\033[36m" /* Bold Cyan */
+#define BOLDWHITE "\033[1m\033[37m" /* Bold White */
+
+#else
+
+#define RESET
+#define BLACK
+#define RED
+#define GREEN
+#define YELLOW
+#define BLUE
+#define MAGENTA
+#define CYAN
+#define WHITE
+#define BOLDBLACK
+#define BOLDRED
+#define BOLDGREEN
+#define BOLDYELLOW
+#define BOLDBLUE
+#define BOLDMAGENTA
+#define BOLDCYAN
+#define BOLDWHITE
+
+#endif
+
+#define TEST_DECLARE(FUN) test_status_t test_ ## FUN(void);
+#define TEST_ENTRY(FUN) { #FUN, test_ ## FUN, 0, 0 },
+#define TEST_LIST static test_entry_t tests[] =
+
+/* __VA_ARGS__ workaround for MSVC: https://stackoverflow.com/a/5134656 */
+#define EXPAND(x) x
+
+#define TEST_OK 1
+#define TEST_SUCCESS return (test_status_t){NULL, TEST_OK};
+
+#define TEST_IMPL_ARG1(FUN) \
+ test_status_t test_ ## FUN (void); \
+ test_status_t test_ ## FUN()
+
+#define TEST_IMPL_ARG2(PREFIX, FUN) TEST_IMPL_ARG1(PREFIX ## FUN)
+#define TEST_IMPL_ARG3(arg1, arg2, arg3, ...) arg3
+
+#define TEST_IMPL_CHOOSER(...) \
+ EXPAND(TEST_IMPL_ARG3(__VA_ARGS__, TEST_IMPL_ARG2, TEST_IMPL_ARG1))
+
+#define TEST_IMPL(...) EXPAND(TEST_IMPL_CHOOSER(__VA_ARGS__)(__VA_ARGS__))
+
+#define ASSERT_EXT(expr, msg) \
+ if (!(expr)) { \
+ fprintf(stderr, \
+ RED " assert fail" RESET \
+ " in " BOLDCYAN "%s " RESET \
+ "on " BOLDMAGENTA "line %d" RESET \
+ " : " BOLDWHITE " ASSERT(%s)\n" RESET, \
+ __FILE__, \
+ __LINE__, \
+ #expr); \
+ return (test_status_t){msg, 0}; \
+ }
+
+#define ASSERT_ARG1(expr) ASSERT_EXT(expr, NULL)
+#define ASSERT_ARG2(expr, msg) ASSERT_EXT(expr, msg)
+#define ASSERT_ARG3(arg1, arg2, arg3, ...) arg3
+
+#define ASSERT_CHOOSER(...) ASSERT_ARG3(__VA_ARGS__, ASSERT_ARG2, ASSERT_ARG1)
+#define ASSERT(...) do { ASSERT_CHOOSER(__VA_ARGS__)(__VA_ARGS__) } while(0);
+#define ASSERTIFY(expr) do { \
+ test_status_t ts; \
+ ts = expr; \
+ if (ts.status != TEST_OK) { \
+ fprintf(stderr, \
+ RED " assert fail" RESET \
+ " in " BOLDCYAN "%s " RESET \
+ "on " BOLDMAGENTA "line %d" RESET \
+ " : " BOLDWHITE " ASSERTIFY(%s)\n" RESET, \
+ __FILE__, \
+ __LINE__, \
+ #expr); \
+ return (test_status_t){ts.msg, 0}; \
+ } \
+ } while(0);
+
+#if defined(_WIN32)
+# define drand48() ((float)(rand() / (RAND_MAX + 1.0)))
+# define OK_TEXT "ok:"
+# define FAIL_TEXT "fail:"
+# define FINAL_TEXT "^_^"
+#else
+# define OK_TEXT "✔︎"
+# define FAIL_TEXT "𐄂"
+# define FINAL_TEXT "🎉"
+#endif
+
+#endif /* common_h */