#include "lily-test.h" #include "tests.h" const char * test_INFO() { lily_g.HEAD.next = NULL; lily_g.TAIL = &(lily_g.HEAD); lily_g.failed = 0; INFO("the number is %d", 10); INFO("the string is '%s'", "hello world"); if (lily_g.failed) return "INFO caused failure!"; if (lily_g.HEAD.next == NULL) return "INFO did not append any messages!"; lily_test_msg_t *m = lily_g.HEAD.next; if (strcmp(m->msg, "the number is 10") != 0) return "the first message is incorrect"; m = m->next; if (m == NULL) return "there is not a second message!"; if (strcmp(m->msg, "the string is 'hello world'") != 0) return "the second message is incorrect"; if (m->next != NULL) return "too many messages"; lily_msg_destroy(lily_g.HEAD.next); return 0; } const char * test_CHECK() { lily_g.HEAD.next = NULL; lily_g.TAIL = &(lily_g.HEAD); lily_g.failed = 0; CHECK(1 == 0); CHECK(0 == 0); CHECK(4 == 3); if (lily_g.HEAD.next == NULL) return "CHECK did not append any failure messages"; lily_test_msg_t *m = lily_g.HEAD.next; if (strcmp(m->msg, "CHECK failed: 1 == 0") != 0) return "first assert has wrong message"; if (m->next == NULL) return "only one message appended"; m = m->next; if (strcmp(m->msg, "CHECK failed: 4 == 3") != 0) return "second message is incorrect"; if (m->next != NULL) return "more than two messages appended!"; if (!lily_g.failed) return "test did not fail!"; lily_msg_destroy(lily_g.HEAD.next); return 0; } const char * test_CHECK_EQ() { lily_g.HEAD.next = NULL; lily_g.TAIL = &(lily_g.HEAD); lily_g.failed = 0; int k = 5; CHECK_EQ(k, 5, "%d"); CHECK_EQ(4, k, "%02d"); if (lily_g.HEAD.next == NULL) return "CHECK_EQ did not append any failure message"; if (lily_g.HEAD.next->next != NULL) return "CHECK_EQ appended more than one message"; if (strcmp(lily_g.HEAD.next->msg, "CHECK failed: 4 == k (04 == 05)") != 0) return "incorrect message"; lily_msg_destroy(lily_g.HEAD.next); return 0; } int aR, bR; static void f_test_REQUIRE() { aR = 5; REQUIRE(2+2 == 5); bR = 5; } const char * test_REQUIRE() { lily_g.HEAD.next = NULL; lily_g.TAIL = &(lily_g.HEAD); lily_g.failed = 0; aR = 0; bR = 0; int test_failed = setjmp(lily_g.env); if (test_failed) { if (!lily_g.failed) return "test did not fail!"; if (lily_g.HEAD.next == NULL) return "test did not generate any messages"; if (strcmp(lily_g.HEAD.next->msg, "REQUIRE failed: 2+2 == 5") != 0) return "test generated incorrect message"; if (lily_g.HEAD.next->next != NULL) return "test generated too many messages"; if (bR == 5) return "test kept executing after failed REQUIRE"; lily_msg_destroy(lily_g.HEAD.next); return 0; } else { f_test_REQUIRE(); return "test function did not longjump!"; } } void f_test_REQUIRE_EQ() { REQUIRE_EQ(2, 2, "%d"); REQUIRE_EQ(2, 4, "%d"); REQUIRE_EQ(2, 1, "%d"); } const char * test_REQUIRE_EQ() { lily_g.HEAD.next = NULL; lily_g.TAIL = &(lily_g.HEAD); lily_g.failed = 0; int test_failed = setjmp(lily_g.env); if (test_failed) { if (!lily_g.failed) return "test did not mark itself as failed"; if (lily_g.HEAD.next == NULL) return "test did not generate any messages"; if (strcmp(lily_g.HEAD.next->msg, "REQUIRE failed: 2 == 4 (2 == 4)") != 0) return "test generated incorrect message"; if (lily_g.HEAD.next->next != NULL) return "test generated too many messages"; lily_msg_destroy(lily_g.HEAD.next); return 0; } else { f_test_REQUIRE_EQ(); return "test function did not longjump!"; } }