diff --git a/.github/workflows/build-linux-gcc.yml b/.github/workflows/build-linux-gcc.yml index 3e11f98ad..5fd294a79 100644 --- a/.github/workflows/build-linux-gcc.yml +++ b/.github/workflows/build-linux-gcc.yml @@ -97,7 +97,7 @@ jobs: - name: Unit Tests run: | cd "${{github.workspace}}/My Projects/Torque3D/game" - ./Torque3D runTests.tscript + ./Torque3D_unittests - name: Test Reporter uses: phoenix-actions/test-reporting@v14 diff --git a/.github/workflows/build-macos-clang.yml b/.github/workflows/build-macos-clang.yml index 4b9d61f9f..ed345921d 100644 --- a/.github/workflows/build-macos-clang.yml +++ b/.github/workflows/build-macos-clang.yml @@ -67,7 +67,7 @@ jobs: - name: Unit Tests run: | cd "${{github.workspace}}/My Projects/Torque3D/game" - ./Torque3D.app/Contents/MacOS/Torque3D runTests.tscript + ./Torque3D_unittests - name: Test Reporter uses: phoenix-actions/test-reporting@v14 diff --git a/.github/workflows/build-windows-msvc.yml b/.github/workflows/build-windows-msvc.yml index a8ddaad55..e825573c1 100644 --- a/.github/workflows/build-windows-msvc.yml +++ b/.github/workflows/build-windows-msvc.yml @@ -63,7 +63,7 @@ jobs: - name: Unit Tests run: | cd "${{github.workspace}}/My Projects/Torque3D/game" - ./Torque3D.exe runTests.tscript + ./Torque3D_unittests.exe - name: Test Reporter uses: phoenix-actions/test-reporting@v14 diff --git a/Engine/source/CMakeLists.txt b/Engine/source/CMakeLists.txt index 2ca86a2f7..c97342485 100644 --- a/Engine/source/CMakeLists.txt +++ b/Engine/source/CMakeLists.txt @@ -31,11 +31,6 @@ forwardDef(TORQUE_BASIC_LIGHTING) set(TORQUE_SDL ON) # we need sdl to do our platform interop forwardDef(TORQUE_SDL) -if(TORQUE_TESTING) -set(TORQUE_COMPILE_DEFINITIONS ${TORQUE_COMPILE_DEFINITIONS} TORQUE_TESTS_ENABLED) -set(TORQUE_COMPILE_DEFINITIONS ${TORQUE_COMPILE_DEFINITIONS} "_VARIADIC_MAX=10") -endif() - # On Windows we disable CRT Security warnings - this comes from recommendations to use non-portable functions. if (WIN32) set(TORQUE_COMPILE_DEFINITIONS ${TORQUE_COMPILE_DEFINITIONS} _CRT_SECURE_NO_WARNINGS WIN32) @@ -253,11 +248,6 @@ if (UNIX AND NOT APPLE) torqueAddSourceDirectories("platformX11") endif (UNIX AND NOT APPLE) -if(TORQUE_TESTING) - torqueAddSourceDirectories("testing") - set(TORQUE_COMPILE_DEFINITIONS ${TORQUE_COMPILE_DEFINITIONS} TORQUE_SHARED SDL_MAIN_HANDLED) -endif(TORQUE_TESTING) - # Add the collected files to our engine group source_group(TREE "${CMAKE_SOURCE_DIR}/Engine/source" PREFIX "Engine" FILES ${TORQUE_SOURCE_FILES}) file(GLOB_RECURSE TORQUE_APP_GAME_SOURCES "${TORQUE_APP_ROOT_DIRECTORY}/source/*.cpp" "${TORQUE_APP_ROOT_DIRECTORY}/source/*.h") @@ -389,10 +379,6 @@ if (APPLE) "${TORQUE_APP_GAME_DIRECTORY}/${TORQUE_APP_NAME}.torsion" "${TORQUE_APP_GAME_DIRECTORY}/Template.torsion.exports") - if(TORQUE_TESTING) - set(MACOSX_RESOURCES ${MACOSX_RESOURCES} "${TORQUE_APP_GAME_DIRECTORY}/runTests.${TORQUE_SCRIPT_EXTENSION}") - endif() - set(TORQUE_SOURCE_FILES ${TORQUE_SOURCE_FILES} ${TORQUE_PLATFORM_MAC_SOURCES} ${MACOSX_RESOURCES}) source_group("Resources" FILES ${MACOSX_RESOURCES}) @@ -426,7 +412,7 @@ if (NOT TORQUE_NET_CURL) endif() ################# Executable Generation ################### -if (TORQUE_DYNAMIC_LIBRARY AND NOT TORQUE_TESTING) +if (TORQUE_DYNAMIC_LIBRARY) set(TORQUE_COMPILE_DEFINITIONS ${TORQUE_COMPILE_DEFINITIONS} TORQUE_SHARED) # Build the main engine library @@ -438,10 +424,8 @@ if (TORQUE_DYNAMIC_LIBRARY AND NOT TORQUE_TESTING) set(TORQUE_SOURCE_FILES "main/main.cpp") set(TORQUE_LINK_LIBRARIES TorqueEngine) else() - if(NOT TORQUE_TESTING) - set(TORQUE_SOURCE_FILES "main/main.cpp" ${TORQUE_SOURCE_FILES}) - endif() -endif (TORQUE_DYNAMIC_LIBRARY AND NOT TORQUE_TESTING) + set(TORQUE_SOURCE_FILES "main/main.cpp" ${TORQUE_SOURCE_FILES}) +endif (TORQUE_DYNAMIC_LIBRARY) if (APPLE) add_executable(${TORQUE_APP_NAME} MACOSX_BUNDLE @@ -486,9 +470,9 @@ elseif (WIN32) # NOTE: On Windows, /Zc:wchar_t- is necessary otherwise you get unicode errors set_target_properties(${TORQUE_APP_NAME} PROPERTIES COMPILE_FLAGS "${TORQUE_CXX_FLAGS}") - if (TORQUE_DYNAMIC_LIBRARY AND NOT TORQUE_TESTING) + if (TORQUE_DYNAMIC_LIBRARY) set_target_properties(TorqueEngine PROPERTIES COMPILE_FLAGS "${TORQUE_CXX_FLAGS_COMMON_DEFAULT}") - endif (TORQUE_DYNAMIC_LIBRARY AND NOT TORQUE_TESTING) + endif (TORQUE_DYNAMIC_LIBRARY) else() add_executable(${TORQUE_APP_NAME} ${TORQUE_SOURCE_FILES}) @@ -539,6 +523,13 @@ if(IS_ARM) add_math_backend(neon MATH_SIMD_NEON) endif() +foreach(MATH_BACKEND ${TORQUE_MATH_BACKENDS}) + target_sources(${TORQUE_APP_NAME} + PRIVATE + $ + ) +endforeach() + if(MSVC) # Match projectGenerator naming for executables set(OUTPUT_CONFIG DEBUG MINSIZEREL RELWITHDEBINFO) @@ -547,10 +538,10 @@ if(MSVC) list(GET OUTPUT_CONFIG ${INDEX} CONF) list(GET OUTPUT_SUFFIX ${INDEX} SUFFIX) set_property(TARGET ${TORQUE_APP_NAME} PROPERTY OUTPUT_NAME_${CONF} ${TORQUE_APP_NAME}_${SUFFIX}) - if (TORQUE_DYNAMIC_LIBRARY AND NOT TORQUE_TESTING) + if (TORQUE_DYNAMIC_LIBRARY) set_property(TARGET TorqueEngine PROPERTY ${CONF}_POSTFIX "_${SUFFIX}") set_property(TARGET TorqueEngine PROPERTY ${CONF}_OUTPUT_NAME ${TORQUE_APP_NAME}) - endif (TORQUE_DYNAMIC_LIBRARY AND NOT TORQUE_TESTING) + endif (TORQUE_DYNAMIC_LIBRARY) endforeach() # Set Visual Studio startup project set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${TORQUE_APP_NAME}) @@ -591,14 +582,6 @@ if (TORQUE_TARGET_PROPERTIES) endif (TORQUE_TARGET_PROPERTIES) target_include_directories(${TORQUE_APP_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} "${CMAKE_BINARY_DIR}/temp" ${TORQUE_INCLUDE_DIRECTORIES}) -if(TORQUE_TESTING) - if(WIN32) - target_link_options(${TORQUE_APP_NAME} PRIVATE "/SUBSYSTEM:CONSOLE") - set_target_properties(gtest PROPERTIES COMPILE_FLAGS "/Zc:wchar_t-") - set_target_properties(gmock PROPERTIES COMPILE_FLAGS "/Zc:wchar_t-") - endif() -endif(TORQUE_TESTING) - append_defs() # Process library binaries - these are coming from modules that are providing links to external, precompiled code that should be included @@ -645,3 +628,94 @@ if (UNIX) endif() endforeach() endif (UNIX) + +if(TORQUE_TESTING) + + enable_testing() + + # Start with the same sources as the main application + set(TORQUE_TEST_SOURCES ${TORQUE_SOURCE_FILES}) + + # Add test sources + file(GLOB_RECURSE TORQUE_TEST_FILES + "${CMAKE_CURRENT_SOURCE_DIR}/testing/*.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/testing/*.h" + ) + + list(APPEND TORQUE_TEST_SOURCES ${TORQUE_TEST_FILES}) + + list(FILTER TORQUE_TEST_SOURCES EXCLUDE REGEX "main/main\\.cpp$") + + add_executable(${TORQUE_APP_NAME}_unittests + ${TORQUE_TEST_SOURCES} + ) + + foreach(MATH_BACKEND ${TORQUE_MATH_BACKENDS}) + target_sources(${TORQUE_APP_NAME}_unittests + PRIVATE + $ + ) + endforeach() + + target_include_directories(${TORQUE_APP_NAME}_unittests + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + "${CMAKE_BINARY_DIR}/temp" + ${TORQUE_INCLUDE_DIRECTORIES} + ) + + target_compile_definitions(${TORQUE_APP_NAME}_unittests + PUBLIC + ${TORQUE_COMPILE_DEFINITIONS} + TORQUE_TESTS_ENABLED + "_VARIADIC_MAX=10" + TORQUE_SHARED + SDL_MAIN_HANDLED + ) + + target_link_libraries(${TORQUE_APP_NAME}_unittests + PRIVATE + ${TORQUE_LINK_LIBRARIES} + ${TORQUE_LINK_THIRDPARTY} + gtest + gmock + ) + + target_link_options(${TORQUE_APP_NAME}_unittests + PUBLIC + ${TORQUE_LINK_OPTIONS} + ) + + if(APPLE) + target_link_libraries(${TORQUE_APP_NAME}_unittests + PRIVATE + ${TORQUE_LINK_FRAMEWORKS} + ) + endif() + + if(WIN32) + target_link_libraries(${TORQUE_APP_NAME}_unittests + PRIVATE + ${TORQUE_LINK_WINDOWS} + ) + set_target_properties(${TORQUE_APP_NAME}_unittests + PROPERTIES COMPILE_FLAGS + "${TORQUE_CXX_FLAGS}" + ) + + target_link_options(${TORQUE_APP_NAME}_unittests PRIVATE "/SUBSYSTEM:CONSOLE") + set_target_properties(gtest PROPERTIES COMPILE_FLAGS "/Zc:wchar_t-") + set_target_properties(gmock PROPERTIES COMPILE_FLAGS "/Zc:wchar_t-") + endif() + + if(UNIX AND NOT APPLE) + target_link_libraries(${TORQUE_APP_NAME}_unittests + PRIVATE + ${TORQUE_LINK_LINUX} + ) + endif() + + include(GoogleTest) + gtest_discover_tests(${TORQUE_APP_NAME}_unittests) + +endif() diff --git a/Engine/source/testing/dataChunkerTest.cpp b/Engine/source/testing/dataChunkerTest.cpp index a66bd634f..a290553d2 100644 --- a/Engine/source/testing/dataChunkerTest.cpp +++ b/Engine/source/testing/dataChunkerTest.cpp @@ -5,7 +5,6 @@ // SPDX-License-Identifier: MIT //----------------------------------------------------------------------------- -#ifdef TORQUE_TESTS_ENABLED #include "testing/unitTesting.h" #include "core/dataChunker.h" @@ -343,5 +342,3 @@ TEST(ThreeTieredChunkerTest,ThreeTieredChunker_Should_Function_Correctly) EXPECT_TRUE(threeChunker.getT3Chunker().getFreeListHead().isEmpty()); } - -#endif diff --git a/Engine/source/testing/frameAllocatorTest.cpp b/Engine/source/testing/frameAllocatorTest.cpp index 0dab0c1a3..507ba7ad6 100644 --- a/Engine/source/testing/frameAllocatorTest.cpp +++ b/Engine/source/testing/frameAllocatorTest.cpp @@ -5,7 +5,6 @@ // SPDX-License-Identifier: MIT //----------------------------------------------------------------------------- -#ifdef TORQUE_TESTS_ENABLED #include "testing/unitTesting.h" #include "core/frameAllocator.h" @@ -192,4 +191,3 @@ TEST(FrameTempTest, FrameTempShould_Function_Correctly) } -#endif diff --git a/Engine/source/testing/inspectorFieldTest.cpp b/Engine/source/testing/inspectorFieldTest.cpp index 292099469..76fe2b137 100644 --- a/Engine/source/testing/inspectorFieldTest.cpp +++ b/Engine/source/testing/inspectorFieldTest.cpp @@ -1,33 +1,132 @@ -#include +#include +#include "gui/editor/guiInspector.h" #include "gui/editor/inspector/group.h" +#include "gui/editor/inspector/field.h" #include "console/script.h" -#include "T3D/fx/particle.h" +#include "console/simDatablock.h" -TEST(InspectorFieldTest, SetData_Should_Update_The_Field) +class InspectorTestData : public SimDataBlock { - GuiInspector* inspector = new GuiInspector(); - ASSERT_TRUE(inspector->registerObject()); + typedef SimDataBlock Parent; - ParticleData* exampleObj = new ParticleData(); - ASSERT_TRUE(exampleObj->registerObject()); - // Add it to inspector so inspector field can find it - inspector->addInspectObject(exampleObj); +public: + S32 testInt = 0; + F32 testFloat = 0.f; + bool testBool = false; + StringTableEntry testString; - AbstractClassRep::Field* field = const_cast(exampleObj->findField(StringTable->insert("lifetimeMS"))); + DECLARE_CONOBJECT(InspectorTestData); - GuiInspectorGroup* group = new GuiInspectorGroup("testing", NULL); - ASSERT_TRUE(group->registerObject()); + static void initPersistFields() + { + addField("testInt", TypeS32, Offset(testInt, InspectorTestData)); + addField("testFloat", TypeF32, Offset(testFloat, InspectorTestData)); + addField("testBool", TypeBool, Offset(testBool, InspectorTestData)); + addField("testString", TypeString, Offset(testString, InspectorTestData)); - GuiInspectorField* inspectorField = new GuiInspectorField(inspector, group, field); - ASSERT_TRUE(inspectorField->registerObject()); + Parent::initPersistFields(); + } +}; - inspectorField->setData("12345"); - EXPECT_EQ(exampleObj->lifetimeMS, 12345); +IMPLEMENT_CO_DATABLOCK_V1(InspectorTestData); - // Cleanup - inspectorField->deleteObject(); - group->deleteObject(); - inspector->deleteObject(); - exampleObj->deleteObject(); +class GuiInspectorFieldFixture : public ::testing::Test +{ +protected: + GuiInspector* inspector{}; + GuiInspectorGroup* group{}; + + void SetUp() override + { + inspector = new GuiInspector(); + ASSERT_TRUE(inspector->registerObject()); + + group = new GuiInspectorGroup("testing", nullptr); + ASSERT_TRUE(group->registerObject()); + } + + void TearDown() override + { + group->deleteObject(); + inspector->deleteObject(); + } + + GuiInspectorField* createField( + SimObject* object, + const char* fieldName) + { + inspector->addInspectObject(object); + + AbstractClassRep::Field* field = + const_cast( + object->findField(StringTable->insert(fieldName))); + + EXPECT_NE(field, nullptr); + + GuiInspectorField* inspectorField = new GuiInspectorField(inspector, group, field); + EXPECT_TRUE(inspectorField->registerObject()); + + return inspectorField; + } +}; + +TEST_F(GuiInspectorFieldFixture, SetData_IntField) +{ + InspectorTestData* object = new InspectorTestData(); + ASSERT_TRUE(object->registerObject()); + + GuiInspectorField* field = createField(object, "testInt"); + + field->setData("12345"); + + EXPECT_EQ(object->testInt, 12345); + + field->deleteObject(); + object->deleteObject(); +} + +TEST_F(GuiInspectorFieldFixture, SetData_FloatField) +{ + InspectorTestData* object = new InspectorTestData(); + ASSERT_TRUE(object->registerObject()); + + GuiInspectorField* field = createField(object, "testFloat"); + + field->setData("123.5"); + + EXPECT_FLOAT_EQ(object->testFloat, 123.5f); + + field->deleteObject(); + object->deleteObject(); +} + +TEST_F(GuiInspectorFieldFixture, SetData_BoolField) +{ + InspectorTestData* object = new InspectorTestData(); + ASSERT_TRUE(object->registerObject()); + + GuiInspectorField* field = createField(object, "testBool"); + + field->setData("1"); + + EXPECT_TRUE(object->testBool); + + field->deleteObject(); + object->deleteObject(); +} + +TEST_F(GuiInspectorFieldFixture, SetData_StringField) +{ + InspectorTestData* object = new InspectorTestData(); + ASSERT_TRUE(object->registerObject()); + + GuiInspectorField* field = createField(object, "testString"); + + field->setData("Hello World"); + + EXPECT_STREQ(object->testString, "Hello World"); + + field->deleteObject(); + object->deleteObject(); } diff --git a/Engine/source/testing/mutexTest.cpp b/Engine/source/testing/mutexTest.cpp index 53379651b..46e97c6f0 100644 --- a/Engine/source/testing/mutexTest.cpp +++ b/Engine/source/testing/mutexTest.cpp @@ -20,7 +20,6 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- -#ifdef TORQUE_TESTS_ENABLED #include "testing/unitTesting.h" #include "platform/threads/mutex.h" #include "platform/threads/thread.h" @@ -66,5 +65,3 @@ TEST(Mutex, BasicSynchronization) // Kill mutex2, which was never touched. Mutex::destroyMutex(mutex2); } - -#endif \ No newline at end of file diff --git a/Tools/CMake/torque_configs.cmake b/Tools/CMake/torque_configs.cmake index c71fd3a13..a245bc902 100644 --- a/Tools/CMake/torque_configs.cmake +++ b/Tools/CMake/torque_configs.cmake @@ -99,10 +99,6 @@ set(TORQUE_COMPILE_DEFINITIONS ICE_NO_DLL PCRE_STATIC TORQUE_ADVANCED_LIGHTING T # All link libraries. Modules should append to this the path to specify additional link libraries (.a, .lib, .dylib, .so) set(TORQUE_LINK_LIBRARIES png_static tinyxml2 collada squish opcode assimp SDL2 glad pcre convexMath zlib) -if(TORQUE_TESTING) -set(TORQUE_LINK_LIBRARIES ${TORQUE_LINK_LIBRARIES} gtest gmock) -endif() - if(NOT WIN32) set(WIN32 OFF CACHE BOOL "" FORCE) endif() diff --git a/Tools/CMake/torque_macros.cmake b/Tools/CMake/torque_macros.cmake index ca1a65325..c940bccb2 100644 --- a/Tools/CMake/torque_macros.cmake +++ b/Tools/CMake/torque_macros.cmake @@ -201,6 +201,7 @@ function(add_math_backend name compile_defs) endif() # Inject objects into engine - target_sources(${TORQUE_APP_NAME} PRIVATE $) + list(APPEND TORQUE_MATH_BACKENDS math_${name}) + set(TORQUE_MATH_BACKENDS ${TORQUE_MATH_BACKENDS} PARENT_SCOPE) set_target_properties(math_${name} PROPERTIES FOLDER "Libraries/Math") endfunction() \ No newline at end of file