From d87e3bd8cfb0ff6d14c8df063d63d67c5c8af04b Mon Sep 17 00:00:00 2001 From: durk Date: Sat, 20 Apr 2024 06:12:36 -0500 Subject: [PATCH] fixed gtests and using cmake Update .gitignore --- .gitignore | 14 ++ CMake/Default.cmake | 65 ++++++ CMake/DefaultCXX.cmake | 12 ++ CMake/DefaultFortran.cmake | 12 ++ CMake/Utils.cmake | 234 +++++++++++++++++++++ CMakeLists.txt | 335 ++++++++++++++++++++++++++++++ KrakenEngine.vcxproj | 40 ++++ KrakenEngine.vcxproj.filters | 40 ++++ {test => tests}/test_Math.cpp | 2 +- {test => tests}/test_Overflow.cpp | 25 +-- {test => tests}/test_Window.cpp | 2 +- 11 files changed, 765 insertions(+), 16 deletions(-) create mode 100644 CMake/Default.cmake create mode 100644 CMake/DefaultCXX.cmake create mode 100644 CMake/DefaultFortran.cmake create mode 100644 CMake/Utils.cmake create mode 100644 CMakeLists.txt rename {test => tests}/test_Math.cpp (99%) rename {test => tests}/test_Overflow.cpp (91%) rename {test => tests}/test_Window.cpp (97%) diff --git a/.gitignore b/.gitignore index 2f263a1..a222769 100644 --- a/.gitignore +++ b/.gitignore @@ -440,3 +440,17 @@ FodyWeavers.xsd # JetBrains Rider *.sln.iml + +# CMake Stuff +CMakeLists.txt.user +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +_deps +out/ diff --git a/CMake/Default.cmake b/CMake/Default.cmake new file mode 100644 index 0000000..70bfa90 --- /dev/null +++ b/CMake/Default.cmake @@ -0,0 +1,65 @@ +################################################################################ +# Command for variable_watch. This command issues error message, if a variable +# is changed. If variable PROPERTY_READER_GUARD_DISABLED is TRUE nothing happens +# variable_watch( property_reader_guard) +################################################################################ +function(property_reader_guard VARIABLE ACCESS VALUE CURRENT_LIST_FILE STACK) + if("${PROPERTY_READER_GUARD_DISABLED}") + return() + endif() + + if("${ACCESS}" STREQUAL "MODIFIED_ACCESS") + message(FATAL_ERROR + " Variable ${VARIABLE} is not supposed to be changed.\n" + " It is used only for reading target property ${VARIABLE}.\n" + " Use\n" + " set_target_properties(\"\" PROPERTIES \"${VARIABLE}\" \"\")\n" + " or\n" + " set_target_properties(\"\" PROPERTIES \"${VARIABLE}_\" \"\")\n" + " instead.\n") + endif() +endfunction() + +################################################################################ +# Create variable with generator expression that expands to value of +# target property _. If property is empty or not set then property +# is used instead. Variable has watcher property_reader_guard that +# doesn't allow to edit it. +# create_property_reader() +# Input: +# name - Name of watched property and output variable +################################################################################ +function(create_property_reader NAME) + set(PROPERTY_READER_GUARD_DISABLED TRUE) + set(CONFIG_VALUE "$>>>") + set(IS_CONFIG_VALUE_EMPTY "$") + set(GENERAL_VALUE "$>") + set("${NAME}" "$" PARENT_SCOPE) + variable_watch("${NAME}" property_reader_guard) +endfunction() + +################################################################################ +# Set property $_${PROPS_CONFIG_U} of ${PROPS_TARGET} to +# set_config_specific_property( ) +# Input: +# name - Prefix of property name +# value - New value +################################################################################ +function(set_config_specific_property NAME VALUE) + set_target_properties("${PROPS_TARGET}" PROPERTIES "${NAME}_${PROPS_CONFIG_U}" "${VALUE}") +endfunction() + +################################################################################ + +create_property_reader("TARGET_NAME") +create_property_reader("OUTPUT_DIRECTORY") + +set_config_specific_property("TARGET_NAME" "${PROPS_TARGET}") +set_config_specific_property("OUTPUT_NAME" "${TARGET_NAME}") +set_config_specific_property("ARCHIVE_OUTPUT_NAME" "${TARGET_NAME}") +set_config_specific_property("LIBRARY_OUTPUT_NAME" "${TARGET_NAME}") +set_config_specific_property("RUNTIME_OUTPUT_NAME" "${TARGET_NAME}") + +set_config_specific_property("ARCHIVE_OUTPUT_DIRECTORY" "${OUTPUT_DIRECTORY}") +set_config_specific_property("LIBRARY_OUTPUT_DIRECTORY" "${OUTPUT_DIRECTORY}") +set_config_specific_property("RUNTIME_OUTPUT_DIRECTORY" "${OUTPUT_DIRECTORY}") \ No newline at end of file diff --git a/CMake/DefaultCXX.cmake b/CMake/DefaultCXX.cmake new file mode 100644 index 0000000..eff0e56 --- /dev/null +++ b/CMake/DefaultCXX.cmake @@ -0,0 +1,12 @@ +include("${CMAKE_CURRENT_LIST_DIR}/Default.cmake") + +set_config_specific_property("OUTPUT_DIRECTORY" "${CMAKE_SOURCE_DIR}$<$>:/${CMAKE_VS_PLATFORM_NAME}>/${PROPS_CONFIG}") + +if(MSVC) + create_property_reader("DEFAULT_CXX_EXCEPTION_HANDLING") + create_property_reader("DEFAULT_CXX_DEBUG_INFORMATION_FORMAT") + + set_target_properties("${PROPS_TARGET}" PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL") + set_config_specific_property("DEFAULT_CXX_EXCEPTION_HANDLING" "/EHsc") + set_config_specific_property("DEFAULT_CXX_DEBUG_INFORMATION_FORMAT" "/Zi") +endif() diff --git a/CMake/DefaultFortran.cmake b/CMake/DefaultFortran.cmake new file mode 100644 index 0000000..3c16740 --- /dev/null +++ b/CMake/DefaultFortran.cmake @@ -0,0 +1,12 @@ +include("${CMAKE_CURRENT_LIST_DIR}/Default.cmake") + +set_config_specific_property("OUTPUT_DIRECTORY" "${CMAKE_CURRENT_SOURCE_DIR}$<$>:/${CMAKE_VS_PLATFORM_NAME}>/${PROPS_CONFIG}") + +get_target_property(${PROPS_TARGET}_BINARY_DIR ${PROPS_TARGET} BINARY_DIR) +set(DEFAULT_FORTRAN_MODULES_DIR "${${PROPS_TARGET}_BINARY_DIR}/${PROPS_TARGET}.Modules.dir") +set_target_properties(${PROPS_TARGET} PROPERTIES Fortran_MODULE_DIRECTORY ${DEFAULT_FORTRAN_MODULES_DIR}) + +if(${CMAKE_GENERATOR} MATCHES "Visual Studio") + # Hack for visual studio generator (https://gitlab.kitware.com/cmake/cmake/issues/19552) + add_custom_command(TARGET ${PROPS_TARGET} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory $/${CMAKE_CFG_INTDIR}) +endif() \ No newline at end of file diff --git a/CMake/Utils.cmake b/CMake/Utils.cmake new file mode 100644 index 0000000..9e2f961 --- /dev/null +++ b/CMake/Utils.cmake @@ -0,0 +1,234 @@ +# utils file for projects came from visual studio solution with cmake-converter. + +################################################################################ +# Wrap each token of the command with condition +################################################################################ +cmake_policy(PUSH) +cmake_policy(SET CMP0054 NEW) +macro(prepare_commands) + unset(TOKEN_ROLE) + unset(COMMANDS) + foreach(TOKEN ${ARG_COMMANDS}) + if("${TOKEN}" STREQUAL "COMMAND") + set(TOKEN_ROLE "KEYWORD") + elseif("${TOKEN_ROLE}" STREQUAL "KEYWORD") + set(TOKEN_ROLE "CONDITION") + elseif("${TOKEN_ROLE}" STREQUAL "CONDITION") + set(TOKEN_ROLE "COMMAND") + elseif("${TOKEN_ROLE}" STREQUAL "COMMAND") + set(TOKEN_ROLE "ARG") + endif() + + if("${TOKEN_ROLE}" STREQUAL "KEYWORD") + list(APPEND COMMANDS "${TOKEN}") + elseif("${TOKEN_ROLE}" STREQUAL "CONDITION") + set(CONDITION ${TOKEN}) + elseif("${TOKEN_ROLE}" STREQUAL "COMMAND") + list(APPEND COMMANDS "$<$:${DUMMY}>$<${CONDITION}:${TOKEN}>") + elseif("${TOKEN_ROLE}" STREQUAL "ARG") + list(APPEND COMMANDS "$<${CONDITION}:${TOKEN}>") + endif() + endforeach() +endmacro() +cmake_policy(POP) + +################################################################################ +# Transform all the tokens to absolute paths +################################################################################ +macro(prepare_output) + unset(OUTPUT) + foreach(TOKEN ${ARG_OUTPUT}) + if(IS_ABSOLUTE ${TOKEN}) + list(APPEND OUTPUT "${TOKEN}") + else() + list(APPEND OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/${TOKEN}") + endif() + endforeach() +endmacro() + +################################################################################ +# Parse add_custom_command_if args. +# +# Input: +# PRE_BUILD - Pre build event option +# PRE_LINK - Pre link event option +# POST_BUILD - Post build event option +# TARGET - Target +# OUTPUT - List of output files +# DEPENDS - List of files on which the command depends +# COMMANDS - List of commands(COMMAND condition1 commannd1 args1 COMMAND +# condition2 commannd2 args2 ...) +# Output: +# OUTPUT - Output files +# DEPENDS - Files on which the command depends +# COMMENT - Comment +# PRE_BUILD - TRUE/FALSE +# PRE_LINK - TRUE/FALSE +# POST_BUILD - TRUE/FALSE +# TARGET - Target name +# COMMANDS - Prepared commands(every token is wrapped in CONDITION) +# NAME - Unique name for custom target +# STEP - PRE_BUILD/PRE_LINK/POST_BUILD +################################################################################ +function(add_custom_command_if_parse_arguments) + cmake_parse_arguments("ARG" "PRE_BUILD;PRE_LINK;POST_BUILD" "TARGET;COMMENT" "DEPENDS;OUTPUT;COMMANDS" ${ARGN}) + + if(WIN32) + set(DUMMY "cd.") + elseif(UNIX) + set(DUMMY "true") + endif() + + prepare_commands() + prepare_output() + + set(DEPENDS "${ARG_DEPENDS}") + set(COMMENT "${ARG_COMMENT}") + set(PRE_BUILD "${ARG_PRE_BUILD}") + set(PRE_LINK "${ARG_PRE_LINK}") + set(POST_BUILD "${ARG_POST_BUILD}") + set(TARGET "${ARG_TARGET}") + if(PRE_BUILD) + set(STEP "PRE_BUILD") + elseif(PRE_LINK) + set(STEP "PRE_LINK") + elseif(POST_BUILD) + set(STEP "POST_BUILD") + endif() + set(NAME "${TARGET}_${STEP}") + + set(OUTPUT "${OUTPUT}" PARENT_SCOPE) + set(DEPENDS "${DEPENDS}" PARENT_SCOPE) + set(COMMENT "${COMMENT}" PARENT_SCOPE) + set(PRE_BUILD "${PRE_BUILD}" PARENT_SCOPE) + set(PRE_LINK "${PRE_LINK}" PARENT_SCOPE) + set(POST_BUILD "${POST_BUILD}" PARENT_SCOPE) + set(TARGET "${TARGET}" PARENT_SCOPE) + set(COMMANDS "${COMMANDS}" PARENT_SCOPE) + set(STEP "${STEP}" PARENT_SCOPE) + set(NAME "${NAME}" PARENT_SCOPE) +endfunction() + +################################################################################ +# Add conditional custom command +# +# Generating Files +# The first signature is for adding a custom command to produce an output: +# add_custom_command_if( +# +# +# +# [COMMAND condition command2 [args2...]] +# [DEPENDS [depends...]] +# [COMMENT comment] +# +# Build Events +# add_custom_command_if( +# +# +# +# [COMMAND condition command2 [args2...]] +# [COMMENT comment] +# +# Input: +# output - Output files the command is expected to produce +# condition - Generator expression for wrapping the command +# command - Command-line(s) to execute at build time. +# args - Command`s args +# depends - Files on which the command depends +# comment - Display the given message before the commands are executed at +# build time. +# PRE_BUILD - Run before any other rules are executed within the target +# PRE_LINK - Run after sources have been compiled but before linking the +# binary +# POST_BUILD - Run after all other rules within the target have been +# executed +################################################################################ +function(add_custom_command_if) + add_custom_command_if_parse_arguments(${ARGN}) + + if(OUTPUT AND TARGET) + message(FATAL_ERROR "Wrong syntax. A TARGET and OUTPUT can not both be specified.") + endif() + + if(OUTPUT) + add_custom_command(OUTPUT ${OUTPUT} + ${COMMANDS} + DEPENDS ${DEPENDS} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT ${COMMENT}) + elseif(TARGET) + if(PRE_BUILD AND NOT ${CMAKE_GENERATOR} MATCHES "Visual Studio") + add_custom_target( + ${NAME} + ${COMMANDS} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT ${COMMENT}) + add_dependencies(${TARGET} ${NAME}) + else() + add_custom_command( + TARGET ${TARGET} + ${STEP} + ${COMMANDS} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT ${COMMENT}) + endif() + else() + message(FATAL_ERROR "Wrong syntax. A TARGET or OUTPUT must be specified.") + endif() +endfunction() + +################################################################################ +# Use props file for a target and configs +# use_props( ) +# Inside there are following variables: +# PROPS_TARGET - +# PROPS_CONFIG - One of +# PROPS_CONFIG_U - Uppercase PROPS_CONFIG +# Input: +# target - Target to apply props file +# configs - Build configurations to apply props file +# props_file - CMake script +################################################################################ +macro(use_props TARGET CONFIGS PROPS_FILE) + set(PROPS_TARGET "${TARGET}") + foreach(PROPS_CONFIG ${CONFIGS}) + string(TOUPPER "${PROPS_CONFIG}" PROPS_CONFIG_U) + + get_filename_component(ABSOLUTE_PROPS_FILE "${PROPS_FILE}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_LIST_DIR}") + if(EXISTS "${ABSOLUTE_PROPS_FILE}") + include("${ABSOLUTE_PROPS_FILE}") + else() + message(WARNING "Corresponding cmake file from props \"${ABSOLUTE_PROPS_FILE}\" doesn't exist") + endif() + endforeach() +endmacro() + +################################################################################ +# Add compile options to source file +# source_file_compile_options( [compile_options...]) +# Input: +# source_file - Source file +# compile_options - Options to add to COMPILE_FLAGS property +################################################################################ +function(source_file_compile_options SOURCE_FILE) + if("${ARGC}" LESS_EQUAL "1") + return() + endif() + + get_source_file_property(COMPILE_OPTIONS "${SOURCE_FILE}" COMPILE_OPTIONS) + + if(COMPILE_OPTIONS) + list(APPEND COMPILE_OPTIONS ${ARGN}) + else() + set(COMPILE_OPTIONS "${ARGN}") + endif() + + set_source_files_properties("${SOURCE_FILE}" PROPERTIES COMPILE_OPTIONS "${COMPILE_OPTIONS}") +endfunction() + +################################################################################ +# Default properties of visual studio projects +################################################################################ +set(DEFAULT_CXX_PROPS "${CMAKE_CURRENT_LIST_DIR}/DefaultCXX.cmake") +set(DEFAULT_Fortran_PROPS "${CMAKE_CURRENT_LIST_DIR}/DefaultFortran.cmake") diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..d5d473d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,335 @@ +cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR) + +set(CMAKE_SYSTEM_VERSION 10.0 CACHE STRING "" FORCE) + +project(KrakenEngine CXX) + +################################################################################ +# Set target arch type if empty. Visual studio solution generator provides it. +################################################################################ +if(NOT CMAKE_VS_PLATFORM_NAME) + set(CMAKE_VS_PLATFORM_NAME "x64") +endif() +message("${CMAKE_VS_PLATFORM_NAME} architecture in use") + +if(NOT ("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64" + OR "${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x86")) + message(FATAL_ERROR "${CMAKE_VS_PLATFORM_NAME} arch is not supported!") +endif() + +################################################################################ +# Global configuration types +################################################################################ +set(CMAKE_CONFIGURATION_TYPES + "Debug" + "Release" + CACHE STRING "" FORCE +) + +################################################################################ +# Global compiler options +################################################################################ +if(MSVC) + # remove default flags provided with CMake for MSVC + set(CMAKE_CXX_FLAGS "") + set(CMAKE_CXX_FLAGS_DEBUG "") + set(CMAKE_CXX_FLAGS_RELEASE "") +endif() + +################################################################################ +# Global linker options +################################################################################ +if(MSVC) + # remove default flags provided with CMake for MSVC + set(CMAKE_EXE_LINKER_FLAGS "") + set(CMAKE_MODULE_LINKER_FLAGS "") + set(CMAKE_SHARED_LINKER_FLAGS "") + set(CMAKE_STATIC_LINKER_FLAGS "") + set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS}") + set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS}") + set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS}") + set(CMAKE_STATIC_LINKER_FLAGS_DEBUG "${CMAKE_STATIC_LINKER_FLAGS}") + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS}") + set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS}") + set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS}") + set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS}") +endif() + +################################################################################ +# Nuget packages function stub. +################################################################################ +function(use_package TARGET PACKAGE VERSION) + message(WARNING "No implementation of use_package. Create yours. " + "Package \"${PACKAGE}\" with version \"${VERSION}\" " + "for target \"${TARGET}\" is ignored!") +endfunction() + +################################################################################ +# Common utils +################################################################################ +include(CMake/Utils.cmake) +include(FetchContent) + +################################################################################ +# Additional Global Settings(add specific info there) +################################################################################ +include(CMake/GlobalSettingsInclude.cmake OPTIONAL) + +################################################################################ +# Use solution folders feature +################################################################################ +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + +################################################################################ +# Sub-projects +################################################################################ +set(PROJECT_NAME KrakenEngine) + +################################################################################ +# Source groups +################################################################################ +set(Header_Files + "${CMAKE_CURRENT_SOURCE_DIR}/include/Cache.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/include/Constants.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/include/Draw.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/include/ErrorLogger.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/include/Font.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/include/Input.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/include/KrakenEngine.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/include/Math.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/include/Music.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/include/Overflow.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/include/Rect.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/include/Sound.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/include/Texture.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/include/Time.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/include/Window.hpp" +) +source_group("Header Files" FILES ${Header_Files}) + +set(Source_Files + "${CMAKE_CURRENT_SOURCE_DIR}/src/cache.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/draw.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/font.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/input.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/math.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/music.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/overflow.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/rect.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/sound.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/texture.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/time.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/window.cpp" +) +source_group("Source Files" FILES ${Source_Files}) + +set(ALL_FILES + ${Header_Files} + ${Source_Files} +) + +################################################################################ +# Target +################################################################################ +add_executable(${PROJECT_NAME} ${ALL_FILES}) + +use_props(${PROJECT_NAME} "${CMAKE_CONFIGURATION_TYPES}" "${DEFAULT_CXX_PROPS}") +set(ROOT_NAMESPACE WordleSDL) + +set_target_properties(${PROJECT_NAME} PROPERTIES + VS_GLOBAL_KEYWORD "Win32Proj" +) +################################################################################ +# Target name +################################################################################ +if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + set_target_properties(${PROJECT_NAME} PROPERTIES + TARGET_NAME_DEBUG "${OUTPUT_DIRECTORY}KrakenEngine$ENV{TargetExt}" + ) +endif() +################################################################################ +# Output directory +################################################################################ +if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + set_target_properties(${PROJECT_NAME} PROPERTIES + OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/" + ) +endif() +if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + set_target_properties(${PROJECT_NAME} PROPERTIES + INTERPROCEDURAL_OPTIMIZATION_RELEASE "TRUE" + ) +elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x86") + set_target_properties(${PROJECT_NAME} PROPERTIES + INTERPROCEDURAL_OPTIMIZATION_RELEASE "TRUE" + ) +endif() +################################################################################ +# Compile definitions +################################################################################ +if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + target_compile_definitions(${PROJECT_NAME} PRIVATE + "$<$:" + "_DEBUG" + ">" + "$<$:" + "NDEBUG" + ">" + "_CONSOLE;" + "UNICODE;" + "_UNICODE" + ) +elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x86") + target_compile_definitions(${PROJECT_NAME} PRIVATE + "$<$:" + "_DEBUG" + ">" + "$<$:" + "NDEBUG" + ">" + "WIN32;" + "_CONSOLE;" + "UNICODE;" + "_UNICODE" + ) +endif() + +################################################################################ +# Compile and link options +################################################################################ +if(MSVC) + if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + target_compile_options(${PROJECT_NAME} PRIVATE + $<$: + /std:c++17 + > + $<$: + /Oi; + /Gy + > + /permissive-; + /sdl; + /W3; + ${DEFAULT_CXX_DEBUG_INFORMATION_FORMAT}; + ${DEFAULT_CXX_EXCEPTION_HANDLING} + ) + elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x86") + target_compile_options(${PROJECT_NAME} PRIVATE + $<$: + /Oi; + /Gy + > + /permissive-; + /sdl; + /W3; + ${DEFAULT_CXX_DEBUG_INFORMATION_FORMAT}; + ${DEFAULT_CXX_EXCEPTION_HANDLING} + ) + endif() + if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + target_link_options(${PROJECT_NAME} PRIVATE + $<$: + /DEBUG; + /OPT:REF; + /OPT:ICF + > + /SUBSYSTEM:CONSOLE + ) + elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x86") + target_link_options(${PROJECT_NAME} PRIVATE + $<$: + /OPT:REF; + /OPT:ICF + > + /DEBUG; + /SUBSYSTEM:CONSOLE + ) + endif() +endif() + +################################################################################ +# Dependencies +################################################################################ +if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + set(ADDITIONAL_LIBRARY_DEPENDENCIES + "$<$:" + "SDL2;" + "SDL2_image;" + "SDL2_mixer;" + "SDL2_ttf" + ">" + ) +endif() +target_link_libraries(${PROJECT_NAME} PRIVATE "${ADDITIONAL_LIBRARY_DEPENDENCIES}") + +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip +) +# For Windows: Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) + +################################################################################ +# Post build events +################################################################################ +enable_testing() +find_library(SDL2_LIBRARY NAME SDL2 PATHS "C:/SDL/lib") +find_library(SDL2_IMAGE_LIBRARY NAME SDL2_image PATHS "C:/SDL/lib") +find_library(SDL2_MIXER_LIBRARY NAME SDL2_mixer PATHS "C:/SDL/lib") +find_library(SDL2_TTF_LIBRARY NAME SDL2_ttf PATHS "C:/SDL/lib") + +add_executable( + test_Math + tests/test_Math.cpp + ${ALL_FILES} +) +target_link_libraries( + test_Math PRIVATE + GTest::gtest_main + ${SDL2_LIBRARY} + ${SDL2_IMAGE_LIBRARY} + ${SDL2_MIXER_LIBRARY} + ${SDL2_TTF_LIBRARY} +) + +add_executable( + test_Overflow + tests/test_Overflow.cpp + ${ALL_FILES} +) +target_link_libraries( + test_Overflow PRIVATE + GTest::gtest_main + ${SDL2_LIBRARY} + ${SDL2_IMAGE_LIBRARY} + ${SDL2_MIXER_LIBRARY} + ${SDL2_TTF_LIBRARY} +) + +add_executable( + test_Window + tests/test_Window.cpp + ${ALL_FILES} +) +target_link_libraries( + test_Window PRIVATE + GTest::gtest_main + ${SDL2_LIBRARY} + ${SDL2_IMAGE_LIBRARY} + ${SDL2_MIXER_LIBRARY} + ${SDL2_TTF_LIBRARY} +) + +target_include_directories(test_Math PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include" "C:/SDL/include") +target_include_directories(test_Overflow PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include" "C:/SDL/include") +target_include_directories(test_Window PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include" "C:/SDL/include") + +target_compile_features(test_Math PRIVATE cxx_std_17) +target_compile_features(test_Overflow PRIVATE cxx_std_17) +target_compile_features(test_Window PRIVATE cxx_std_17) + +include(GoogleTest) +gtest_discover_tests(test_Math) +gtest_discover_tests(test_Overflow) +gtest_discover_tests(test_Window) diff --git a/KrakenEngine.vcxproj b/KrakenEngine.vcxproj index 7dc8465..a18c436 100644 --- a/KrakenEngine.vcxproj +++ b/KrakenEngine.vcxproj @@ -49,6 +49,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 17.0 Win32Proj diff --git a/KrakenEngine.vcxproj.filters b/KrakenEngine.vcxproj.filters index ceb730a..2e3e87d 100644 --- a/KrakenEngine.vcxproj.filters +++ b/KrakenEngine.vcxproj.filters @@ -93,4 +93,44 @@ Source Files + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/test_Math.cpp b/tests/test_Math.cpp similarity index 99% rename from test/test_Math.cpp rename to tests/test_Math.cpp index 35500f9..2d78ee9 100644 --- a/test/test_Math.cpp +++ b/tests/test_Math.cpp @@ -1,4 +1,4 @@ -#include "gtest/gtest.h" +#include #include "Math.hpp" diff --git a/test/test_Overflow.cpp b/tests/test_Overflow.cpp similarity index 91% rename from test/test_Overflow.cpp rename to tests/test_Overflow.cpp index afb4b0a..d0291b6 100644 --- a/test/test_Overflow.cpp +++ b/tests/test_Overflow.cpp @@ -1,22 +1,19 @@ #include -#include "gtest/gtest.h" +#include #include "Constants.hpp" #include "Overflow.hpp" namespace { - -using kn::float32_t; -using kn::float64_t; using kn::overflow::isProductValid; using kn::overflow::isSumValid; class DoubleOverflowTest : public ::testing::Test { protected: - DoubleOverflowTest() : doubleMax(std::numeric_limits::max()) {} + DoubleOverflowTest() : doubleMax(std::numeric_limits::max()) {} virtual ~DoubleOverflowTest() {} @@ -24,7 +21,7 @@ class DoubleOverflowTest : public ::testing::Test virtual void TearDown() {} - const float64_t doubleMax; + const double doubleMax; }; TEST_F(DoubleOverflowTest, SumOfDoubleMax) { EXPECT_FALSE(isSumValid(doubleMax, doubleMax)); } @@ -36,8 +33,8 @@ TEST_F(DoubleOverflowTest, SumOfNegativeDoubleMax) TEST_F(DoubleOverflowTest, SumOfHalfAndThreeFifthsDoubleMax) { - const float64_t half = doubleMax / 2; - const float64_t threeFifths = (double)3 / 5 * doubleMax; + const double half = doubleMax / 2; + const double threeFifths = (double)3 / 5 * doubleMax; EXPECT_FALSE(isSumValid(half, threeFifths)); } @@ -57,7 +54,7 @@ TEST_F(DoubleOverflowTest, SumOfDoubleMaxAndZero) { EXPECT_TRUE(isSumValid(doubl TEST_F(DoubleOverflowTest, SumOfTwoFifthsDoubleMax) { - const float64_t twoFifths = (double)2 / 5 * doubleMax; + const double twoFifths = (double)2 / 5 * doubleMax; EXPECT_TRUE(isSumValid(twoFifths, twoFifths)); } @@ -65,7 +62,7 @@ TEST_F(DoubleOverflowTest, SumOfTwoFifthsDoubleMax) class FloatOverflowTest : public ::testing::Test { protected: - FloatOverflowTest() : floatMax(std::numeric_limits::max()) {} + FloatOverflowTest() : floatMax(std::numeric_limits::max()) {} virtual ~FloatOverflowTest() {} @@ -73,7 +70,7 @@ class FloatOverflowTest : public ::testing::Test virtual void TearDown() {} - const float32_t floatMax; + const float floatMax; }; TEST_F(FloatOverflowTest, SumOfFloatMax) { EXPECT_FALSE(isSumValid(floatMax, floatMax)); } @@ -82,8 +79,8 @@ TEST_F(FloatOverflowTest, SumOfNegativeFloatMax) { EXPECT_FALSE(isSumValid(-floa TEST_F(FloatOverflowTest, SumOfHalfAndThreeFifthsFloatMax) { - const float32_t half = floatMax / 2; - const float32_t threeFifths = (float)3 / 5 * floatMax; + const float half = floatMax / 2; + const float threeFifths = (float)3 / 5 * floatMax; EXPECT_FALSE(isSumValid(half, threeFifths)); } @@ -103,7 +100,7 @@ TEST_F(FloatOverflowTest, SumOfFloatMaxAndZero) { EXPECT_TRUE(isSumValid(floatMa TEST_F(FloatOverflowTest, SumOfTwoFifthsFloatMax) { - const float32_t twoFifths = (float)2 / 5 * floatMax; + const float twoFifths = (float)2 / 5 * floatMax; EXPECT_TRUE(isSumValid(twoFifths, twoFifths)); } diff --git a/test/test_Window.cpp b/tests/test_Window.cpp similarity index 97% rename from test/test_Window.cpp rename to tests/test_Window.cpp index 9072b18..e46a132 100644 --- a/test/test_Window.cpp +++ b/tests/test_Window.cpp @@ -1,7 +1,7 @@ #include #include -#include "gtest/gtest.h" +#include #include "ErrorLogger.hpp" #include "Window.hpp"