diff --git a/CMakeLists.txt b/CMakeLists.txt index d7fb178..d75f43f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,3 +10,4 @@ pkg_check_modules(SDL3 REQUIRED IMPORTED_TARGET sdl3) add_subdirectory(src/engine) add_subdirectory(src/examples) +add_subdirectory(tests) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..febbfb0 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,40 @@ +add_library(munit STATIC + "${PROJECT_SOURCE_DIR}/third_party/munit/munit.c" +) + +target_include_directories(munit + PUBLIC + ${PROJECT_SOURCE_DIR}/third_party +) + +file(GLOB TEST_SOURCES CONFIGURE_DEPENDS + "${CMAKE_CURRENT_SOURCE_DIR}/suites/*.c" +) + +add_library(dangerzone_tests STATIC + ${TEST_SOURCES} +) + +target_include_directories(dangerzone_tests + PUBLIC + ${PROJECT_SOURCE_DIR}/include + ${PROJECT_SOURCE_DIR}/src + ${PROJECT_SOURCE_DIR}/third_party +) + +add_executable(test_runner + main.c +) + +target_link_libraries(test_runner + PRIVATE + dangerzone_tests + munit + dangerzone_engine +) + +add_custom_target(test + COMMAND tests/test_runner + DEPENDS test_runner + WORKING_DIRECTORY ${PROJECT_BINARY_DIR} +) \ No newline at end of file diff --git a/tests/main.c b/tests/main.c new file mode 100644 index 0000000..f305e67 --- /dev/null +++ b/tests/main.c @@ -0,0 +1,26 @@ +#include "munit/munit.h" + +extern const MunitSuite sdl_suite; + +int main(int argc, char *argv[]) { + MunitSuite sub_suites[] = { + sdl_suite, + { // terminator + NULL, + NULL, + NULL, + 0, + MUNIT_SUITE_OPTION_NONE + } + }; + + MunitSuite master_suite = { + "", + NULL, + sub_suites, + 1, + MUNIT_SUITE_OPTION_NONE + }; + + return munit_suite_main(&master_suite, NULL, argc, argv); +} \ No newline at end of file diff --git a/tests/suites/sdl.c b/tests/suites/sdl.c new file mode 100644 index 0000000..ff365fc --- /dev/null +++ b/tests/suites/sdl.c @@ -0,0 +1,90 @@ +#include +#include "internal/engine_internal.h" + +#include "munit/munit.h" + +static void* +test_setup( + const MunitParameter params[], + void* data +) { + (void)params; + (void)data; + + internal_state = (engine_internal_state_t *) + malloc(sizeof(engine_internal_state_t)); + munit_assert_not_null(internal_state); + + internal_state->sdl_state = (engine_sdl_state_t *) + malloc(sizeof(engine_sdl_state_t)); + munit_assert_not_null(internal_state->sdl_state); + + internal_state->sdl_state->width = 500; + internal_state->sdl_state->height = 500; + strncpy( + internal_state->sdl_state->window_name, "Dangerzone", + WINDOW_NAME_MAX_LENGTH - 1 + ); + internal_state->sdl_state->window_name[WINDOW_NAME_MAX_LENGTH - 1] = '\0'; + + return internal_state; +} + +static void +test_teardown( + void *fixture +) { + engine_internal_state_t *state = fixture; + + if (state->sdl_state != NULL) { + free(state->sdl_state); + free(state); + } + + internal_state = NULL; +} + +static MunitResult +test_window_parameters( + const MunitParameter params[], + void* data +) { + (void)params; + + engine_internal_state_t *state = data; + + munit_assert_not_null(state); + munit_assert_not_null(state->sdl_state); + munit_assert_int(state->sdl_state->width, ==, 500); + munit_assert_int(state->sdl_state->height, ==, 500); + munit_assert_int(strcmp(state->sdl_state->window_name, "Dangerzone"), ==, 0); + + return MUNIT_OK; +} + +MunitTest tests[] = { + { + "/window-parameters", + test_window_parameters, + test_setup, + test_teardown, + MUNIT_TEST_OPTION_NONE, + NULL + }, + { // terminator + NULL, + NULL, + NULL, + NULL, + MUNIT_TEST_OPTION_NONE, + NULL + } +}; + +const MunitSuite sdl_suite = { + "/sdl", + tests, + NULL, + 1, + MUNIT_SUITE_OPTION_NONE +}; \ No newline at end of file