Implement assert_str and assert_not_null and update tests
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
#include "test.h"
|
#include "test.h"
|
||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
static jmp_buf s_testJmp;
|
static jmp_buf s_testJmp;
|
||||||
static const char* s_failMsg;
|
static const char* s_failMsg;
|
||||||
@@ -10,6 +11,18 @@ void fail(const char* msg) {
|
|||||||
longjmp(s_testJmp, 1);
|
longjmp(s_testJmp, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void assert_not_null(void* ptr, const char* msg) {
|
||||||
|
if (ptr == NULL) {
|
||||||
|
fail(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void assert_str(const char* expected, const char* actual, const char* msg) {
|
||||||
|
if (expected == NULL || actual == NULL || strcmp(expected, actual) != 0) {
|
||||||
|
fail(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char* name;
|
const char* name;
|
||||||
Test func;
|
Test func;
|
||||||
|
|||||||
@@ -12,4 +12,25 @@ typedef void (*Test)(void);
|
|||||||
*/
|
*/
|
||||||
void fail(const char* msg);
|
void fail(const char* msg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asserts that a pointer is not null.
|
||||||
|
*
|
||||||
|
* Calls `fail` if the assertion does not hold.
|
||||||
|
*
|
||||||
|
* @param ptr The pointer to test.
|
||||||
|
* @param msg The message to print if the pointer is null.
|
||||||
|
*/
|
||||||
|
void assert_not_null(void* ptr, const char* msg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asserts that a string has the expected value.
|
||||||
|
*
|
||||||
|
* Calls `fail` if the assertion does not hold.
|
||||||
|
*
|
||||||
|
* @param expected The expected value. This is typically a string literal.
|
||||||
|
* @param actual The actual value. This is typically an expression.
|
||||||
|
* @param msg The message to print if these do not match.
|
||||||
|
*/
|
||||||
|
void assert_str(const char* expected, const char* actual, const char* msg);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+2
-2
@@ -6,8 +6,8 @@ static void test_parser_module_name(void) {
|
|||||||
TokenStream* ts = tokenstream_open("module my_module;");
|
TokenStream* ts = tokenstream_open("module my_module;");
|
||||||
Module* m = parser_parse(ts);
|
Module* m = parser_parse(ts);
|
||||||
|
|
||||||
if (m == NULL) fail("expected module to be parsed");
|
assert_not_null(m, "expected module to be parsed");
|
||||||
if (strcmp(m->name, "my_module") != 0) fail("expected name 'my_module'");
|
assert_str("my_module", m->name, "expected name 'my_module'");
|
||||||
|
|
||||||
parser_free(m);
|
parser_free(m);
|
||||||
tokenstream_close(ts);
|
tokenstream_close(ts);
|
||||||
|
|||||||
+10
-4
@@ -89,16 +89,22 @@ static void test_tokenstream_info(void) {
|
|||||||
tokenstream_info(ts, &info1);
|
tokenstream_info(ts, &info1);
|
||||||
if (t1 != TOKEN_MODULE) fail("expected TOKEN_MODULE");
|
if (t1 != TOKEN_MODULE) fail("expected TOKEN_MODULE");
|
||||||
if (info1.token != TOKEN_MODULE) fail("info: expected TOKEN_MODULE");
|
if (info1.token != TOKEN_MODULE) fail("info: expected TOKEN_MODULE");
|
||||||
if (info1.text_length != 6) fail("info: expected length 6");
|
|
||||||
if (strncmp(info1.text, "module", 6) != 0) fail("info: expected 'module'");
|
char buf1[32];
|
||||||
|
memcpy(buf1, info1.text, info1.text_length);
|
||||||
|
buf1[info1.text_length] = '\0';
|
||||||
|
assert_str("module", buf1, "info: expected 'module'");
|
||||||
|
|
||||||
Token t2 = tokenstream_next(ts);
|
Token t2 = tokenstream_next(ts);
|
||||||
TokenInfo info2;
|
TokenInfo info2;
|
||||||
tokenstream_info(ts, &info2);
|
tokenstream_info(ts, &info2);
|
||||||
if (t2 != TOKEN_IDENTIFIER) fail("expected TOKEN_IDENTIFIER");
|
if (t2 != TOKEN_IDENTIFIER) fail("expected TOKEN_IDENTIFIER");
|
||||||
if (info2.token != TOKEN_IDENTIFIER) fail("info: expected TOKEN_IDENTIFIER");
|
if (info2.token != TOKEN_IDENTIFIER) fail("info: expected TOKEN_IDENTIFIER");
|
||||||
if (info2.text_length != 4) fail("info: expected length 4");
|
|
||||||
if (strncmp(info2.text, "main", 4) != 0) fail("info: expected 'main'");
|
char buf2[32];
|
||||||
|
memcpy(buf2, info2.text, info2.text_length);
|
||||||
|
buf2[info2.text_length] = '\0';
|
||||||
|
assert_str("main", buf2, "info: expected 'main'");
|
||||||
|
|
||||||
tokenstream_close(ts);
|
tokenstream_close(ts);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user