aboutsummaryrefslogtreecommitdiffstats
path: root/simple-test.h
diff options
context:
space:
mode:
authorshmibs <shmibs@gmail.com>2014-08-01 09:05:48 -0700
committershmibs <shmibs@gmail.com>2014-08-01 09:05:48 -0700
commit17c76a851e3c3550f6398aad11e7c71e1a122576 (patch)
tree9e15eb284966dec97032452b6cd3383da4fd6fb4 /simple-test.h
parent0cfbc56786d1e0141aaa89497515acaa89824665 (diff)
downloadsimple-test-17c76a851e3c3550f6398aad11e7c71e1a122576.tar.gz
all around cleanup
Diffstat (limited to 'simple-test.h')
-rw-r--r--simple-test.h156
1 files changed, 156 insertions, 0 deletions
diff --git a/simple-test.h b/simple-test.h
new file mode 100644
index 0000000..b5e4678
--- /dev/null
+++ b/simple-test.h
@@ -0,0 +1,156 @@
+#ifndef _TEST_H_
+#define _TEST_H_
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdbool.h>
+
+/*************
+ * REGIONS *
+ *************/
+
+/* extra levels of abstraction are necessary
+ * to get __COUNTER__ to evaluate before
+ * being concatenated */
+#define _TEST_PASTE(x, y) \
+x ## y
+
+/* the whole thing is inside one
+ * big function. yay! */
+#define BEGIN_TEST \
+typedef void (*_test_cleanup_t)(void); \
+_test_cleanup_t _test_cleanup_current=NULL; \
+int _test_count_current=1; \
+int main(int argc, char *argv[]) \
+{
+
+/* yaaaay! */
+#define END_TEST \
+ printf("\e[1m :: \e[m\e[32msuccess!\e[m\n"); \
+ return 0; \
+}
+
+/* print a fancy description and
+ * reset the cleanup function
+ * pointer to NULL so, if it isn't
+ * defined again, no cleanup will
+ * be called */
+#define TEST(description) \
+_test_cleanup_current=NULL; \
+printf("\e[1m%3i :: \e[m\e[33m%s\e[m\n", _test_count_current++, description);
+
+/* pass in statements to be called on test
+ * exit. goes after varible declarations and
+ * before test body. */
+#define CLEANUP(statements) \
+_TEST_CLEANUP_UNIQ(statements, __COUNTER__)
+
+/* insert a unique cleanup function */
+#define _TEST_CLEANUP_UNIQ(statements, unique_count) \
+void _TEST_PASTE(_test_cleanup_, unique_count)(void) \
+{ \
+ statements \
+} \
+_test_cleanup_current=_TEST_PASTE(_test_cleanup_, unique_count);
+
+/* pretty printing for the current state within
+ * a test */
+#define STATE(...) \
+ do { \
+ printf("\e[1m :: \e[m\e[34m"); \
+ printf(...); \
+ printf("...\e[m\n"); \
+ } while(0)
+
+/* one of these goes at the end of every test
+ * with CLEANUP (unless you want memory leaks).
+ * if you want, stick it in those without CLEANUP
+ * too. */
+#define RETURN() _TEST_RETURN(false)
+
+/* checks if there is a cleanup function to
+ * call and then either continues or terminates
+ * the test */
+#define _TEST_RETURN(fail) \
+do { \
+ if(_test_cleanup_current != NULL) \
+ (*_test_cleanup_current)(); \
+ if(fail) \
+ exit(1); \
+} while(0)
+
+/***********
+ * TESTS *
+ ***********/
+
+#define EXPECT_ZERO(summary, arg) \
+do { \
+ if(arg) \
+ _TEST_FAIL_VAL(summary, "%i", "%i", 0, arg); \
+} while(0);
+
+#define EXPECT_ONE(summary, arg) \
+do { \
+ if(arg != 1) \
+ _TEST_FAIL_VAL(summary, "%i", "%i", 1, arg); \
+} while(0);
+
+#define EXPECT_GREATER_THAN_ZERO(summary, arg) \
+do { \
+ if(arg <= 0) \
+ _TEST_FAIL_VAL(summary, "%s", "%i", ">0", arg); \
+} while(0);
+
+#define EXPECT_INT(summary, arg1, arg2) \
+do { \
+ if(arg1 != arg2) \
+ _TEST_FAIL_VAL(summary, "%i", "%i", arg1, arg2); \
+} while(0);
+
+#define EXPECT_EQUAL_INT(summary, arg1, arg2) \
+do { \
+ if(arg1 != arg2) \
+ _TEST_FAIL_EQUAL(summary, "%i", "%i", arg1, arg2); \
+} while(0);
+
+#define EXPECT_UNEQUAL_INT(summary, arg1, arg2) \
+do { \
+ if(arg1 == arg2) \
+ _TEST_FAIL_EQUAL(summary, "%i", "%i", arg1, arg2); \
+} while(0);
+
+#define EXPECT_STR(summary, arg1, arg2) \
+do { \
+ if( strcmp(arg1, arg2) ) \
+ _TEST_FAIL_VAL(summary, "‘%s’", "‘%s’", arg1, arg2); \
+} while(0);
+
+#define EXPECT_EQUAL_STR(summary, arg1, arg2) \
+do { \
+ if( strcmp(arg1, arg2) ) \
+ _TEST_FAIL_EQUAL(summary, "‘%s’", "‘%s’", arg1, arg2); \
+} while(0);
+
+#define EXPECT_UNEQUAL_STR(summary, arg1, arg2) \
+do { \
+ if( !strcmp(arg1, arg2) ) \
+ _TEST_FAIL_EQUAL(summary, "‘%s’", "‘%s’", arg1, arg2); \
+} while(0);
+
+#define _TEST_FAIL_VAL(summary, format1, format2, expected, actual) \
+do { \
+ printf("\e[1m :: \e[m\e[31mFAIL: " summary "\e[m\n"); \
+ printf("\e[1m :: \e[m\e[1;32m expected:\e[m " format1 "\n", expected);\
+ printf("\e[1m :: \e[m\e[1;31m actual:\e[m " format1 "\n", actual); \
+ _TEST_RETURN(true); \
+} while(0)
+
+#define _TEST_FAIL_EQUAL(summary, format1, format2, arg1, arg2) \
+do { \
+ printf("\e[1m :: \e[m\e[31mFAIL: " summary "\e[m\n"); \
+ printf("\e[1m :: \e[m arg1 == \e[1;31m" format1 "\e[m\n", arg1); \
+ printf("\e[1m :: \e[m arg2 == \e[1;31m" format2 "\e[m\n", arg2); \
+ _TEST_RETURN(true); \
+} while(0)
+
+#endif