diff --git a/CIDockerfile b/CIDockerfile index f9d320a..b752319 100644 --- a/CIDockerfile +++ b/CIDockerfile @@ -5,7 +5,8 @@ RUN apt-get update && \ apt-get install apt-utils -y && \ apt-get install git curl zip unzip tar cmake ninja-build g++ -y && \ apt-get install autoconf autoconf-archive libtool pkg-config automake -y && \ - apt-get install libx11-dev libxrandr-dev libxcursor-dev libxi-dev libudev-dev libgl1-mesa-dev -y + apt-get install libx11-dev libxrandr-dev libxcursor-dev libxi-dev libudev-dev libgl1-mesa-dev -y \ + apt-get install libcriterion-dev RUN git clone https://github.com/Microsoft/vcpkg.git /root/vcpkg diff --git a/CMakeLists.txt b/CMakeLists.txt index 2762dd7..baf1b5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,15 @@ set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}) +if (UNIX) + set(CMAKE_CXX_FLAGS "--coverage -O0 -g -fprofile-arcs -ftest-coverage") + set(CMAKE_EXE_LINKER_FLAGS "--coverage -lgcov") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-exclude-files=tests/*") +endif() + +enable_testing() +add_subdirectory(tests) add_subdirectory(server) add_subdirectory(client) add_subdirectory(shared) diff --git a/Dockerfile b/Dockerfile index a56ce66..8a684bf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,7 @@ RUN apt-get update && \ apt-get install git curl zip unzip tar cmake ninja-build g++ -y && \ apt-get install autoconf autoconf-archive libtool pkg-config automake -y && \ apt-get install libx11-dev libxrandr-dev libxcursor-dev libxi-dev libudev-dev libgl1-mesa-dev -y + apt-get install libcriterion-dev RUN git clone https://github.com/Microsoft/vcpkg.git /root/vcpkg diff --git a/tests.sh b/tests.sh new file mode 100755 index 0000000..734e550 --- /dev/null +++ b/tests.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +BUILD_TYPE=$1 + +if [ -z "$BUILD_TYPE" ]; then + echo "Usage: $0 " + echo "Example: $0 debug" + exit 1 +fi + +BUILD_DIR="cmake-build-$BUILD_TYPE" + +if [ ! -d "$BUILD_DIR" ]; then + echo "Build directory $BUILD_DIR does not exist. Please run the build first." + exit 1 +fi + +cd $BUILD_DIR +ctest --output-on-failure diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..eceb526 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 3.27.4) +project(r-type_tests) + +include_directories(include) + +find_package(Boost COMPONENTS stacktrace_basic CONFIG REQUIRED) +find_path(CRITERION_INCLUDE_DIR criterion/criterion.h PATH_SUFFIXES criterion) +find_library(CRITERION_LIBRARY NAMES criterion libcriterion) + +add_compile_options(-DBOOST_STACKTRACE_USE_ADDR2LINE) + +set(SOURCE_FILES shared.cpp) + +add_executable(r-type_tests ${SOURCE_FILES}) + +target_link_libraries( + r-type_tests + criterion + Boost::stacktrace_basic + Clock GameLogic ECS network Config Logger Texture dl +) + +add_test(NAME empty_registry COMMAND r-type_tests) +add_test(NAME add_entity COMMAND r-type_tests) +add_test(NAME remove_entity COMMAND r-type_tests) +add_test(NAME is_entity_valid COMMAND r-type_tests) +add_test(NAME add_component COMMAND r-type_tests) +add_test(NAME set_component COMMAND r-type_tests) +add_test(NAME get_no_component COMMAND r-type_tests) +add_test(NAME reset_entity COMMAND r-type_tests) diff --git a/tests/shared.cpp b/tests/shared.cpp new file mode 100644 index 0000000..babfe8c --- /dev/null +++ b/tests/shared.cpp @@ -0,0 +1,63 @@ +#include +#include "Registry.hpp" + +/* Registry */ + +Test(shared, empty_registry) { + ecs::Registry registry; + cr_assert_eq(registry.getEntities().size(), 0); +} + +Test(shared, add_entity) { + auto registry = std::make_shared(); + auto entity = registry->createEntity(registry); + cr_assert_eq(registry->getEntities().size(), 1); + cr_assert_eq(*registry->getEntities().begin(), entity); +} + +Test(shared, remove_entity) { + auto registry = std::make_shared(); + auto entity = registry->createEntity(registry); + registry->removeEntity(entity); + cr_assert_eq(registry->getEntities().size(), 0); +} + +Test(shared, is_entity_valid) { + auto registry = std::make_shared(); + auto entity = registry->createEntity(registry); + cr_assert(registry->isEntityValid(entity)); + registry->removeEntity(entity); + cr_assert_not(registry->isEntityValid(entity)); +} + +Test(shared, add_component) { + auto registry = std::make_shared(); + auto entity = registry->createEntity(registry); + registry->addComponent(entity); + cr_assert(registry->contains(entity)); +} + +Test(shared, set_component) { + auto registry = std::make_shared(); + auto entity = registry->createEntity(registry); + ecs::component::Position position{10, 20}; + registry->setComponent(entity, position); + cr_assert_eq(registry->getComponent(entity).x, 10); + cr_assert_eq(registry->getComponent(entity).y, 20); +} + +Test(shared, get_no_component) { + auto registry = std::make_shared(); + auto entity = registry->createEntity(registry); + cr_assert_eq(registry->getNoComponent(entity), 0); + registry->addComponent(entity); + cr_assert_eq(registry->getNoComponent(entity), 1); +} + +Test(shared, reset_entity) { + auto registry = std::make_shared(); + auto entity = registry->createEntity(registry); + registry->addComponent(entity); + registry->reset(entity); + cr_assert_not(registry->contains(entity)); +}