summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lily-test.c48
-rw-r--r--lily-test.h1
-rw-r--r--tests/main.c2
3 files changed, 51 insertions, 0 deletions
diff --git a/lily-test.c b/lily-test.c
index a3f30a2..69bd0ce 100644
--- a/lily-test.c
+++ b/lily-test.c
@@ -1,8 +1,56 @@
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
#include "lily-test.h"
struct lily_globals_t _lily_globals;
+
+void lily_init()
+{
+ _lily_globals.error_msg = NULL;
+ _lily_globals.error_location = "";
+}
+
+
+static void _lily_assert_msg(bool statement, const char *location,
+ const char *format_string, va_list args)
+{
+ if (statement) {
+ va_end(args);
+ return; // no error, return
+ }
+
+ _lily_globals.error_location = location;
+
+ va_list args_len;
+ va_copy(args_len, args);
+ size_t length = vsnprintf(NULL, 0, format_string, args_len);
+ va_end(args_len);
+
+ char *msg = realloc(_lily_globals.error_msg, (length+1) * sizeof(char));
+ if (msg == NULL) {
+ fprintf(stderr, "WARNING: failed to allocate memory for failed test message!\n");
+ if (_lily_globals.error_msg != NULL) {
+ free(_lily_globals.error_msg);
+ _lily_globals.error_msg = NULL;
+ }
+ }
+ else {
+ vsnprintf(msg, length+1, format_string, args);
+ _lily_globals.error_msg = msg;
+ }
+
+ va_end(args);
+ longjmp(_lily_globals.env, 1);
+}
+
+
void lily_assert_msg(bool statement, const char *location,
const char *format_string, ...)
{
+ va_list args;
+ va_start(args, format_string);
+ // _lily_assert_msg may long jump, so it takes calls va_end(args) for you
+ _lily_assert_msg(statement, location, format_string, args);
}
diff --git a/lily-test.h b/lily-test.h
index ee37ed5..01eb34a 100644
--- a/lily-test.h
+++ b/lily-test.h
@@ -23,6 +23,7 @@ struct lily_globals_t {
};
extern struct lily_globals_t _lily_globals;
+void lily_init();
void lily_assert_msg(bool statement, const char *location,
const char *format_string, ...);
diff --git a/tests/main.c b/tests/main.c
index dbb813c..0ac74ac 100644
--- a/tests/main.c
+++ b/tests/main.c
@@ -8,6 +8,8 @@
int main()
{
+ lily_init();
+
run_test(test_LILY_LOCATION);
run_test(test_assert_msg);