+/** Must be present at the end of a test */
+#define SUCCEED() (TEST_ok = true)
+
+/** Add a failure, but continue */
+#define ADD_FAILURE(msg) MACRO_BEGIN { ++TEST_failed; LOG_WARNINGF(msg); } MACRO_END
+
+/** Add a failure and return */
+#define FAIL(msg) _TEST_ASSERT(ADD_FAILURE(msg))
+
+#define HasFatalFailure() (TEST_fatal > 0)
+
+bool RUN_ALL_TESTS();
+
+// difference between expect/assert: assert returns early
+
+#define EXPECT_EQ(expected_, actual_) MACRO_BEGIN { \
+ int expected = expected_; \
+ int actual = actual_; \
+ if ((expected) != (actual)) { \
+ ADD_FAILURE(sprintf( \
+ "Value of: " #actual_ "\n" \
+ " Actual: %d\n" \
+ "Expected: %d\n", \
+ actual, expected \
+ )); \
+ } \
+} MACRO_END
+#define ASSERT_EQ(expected, actual) _TEST_ASSERT(EXPECT_EQ(expected, actual))
+
+#define EXPECT_TRUE(condition) EXPECT_EQ(true, condition)
+#define ASSERT_TRUE(condition) ASSERT_EQ(true, condition)
+
+#define EXPECT_FALSE(condition) EXPECT_EQ(false, condition)
+#define ASSERT_FALSE(condition) ASSERT_EQ(false, condition)