diff --git a/.github/actions/run-gtest/action.yml b/.github/actions/run-gtest/action.yml new file mode 100644 index 0000000000..16bf9259af --- /dev/null +++ b/.github/actions/run-gtest/action.yml @@ -0,0 +1,145 @@ +name: 'Run GTest Validation' +description: 'Execute GTest suite and validate results' + +inputs: + platform: + description: 'Platform (windows, macos, linux)' + required: true + compiler: + description: 'Compiler (msvc, clang, gcc)' + required: true + install-artifact-name: + description: 'Name of the artifact containing the installed files' + required: true + artifact-suffix: + description: 'Suffix for the GTest results artifact name' + required: true + default: 'x64' + +outputs: + has-failures: + description: 'Whether any tests failed' + value: ${{ steps.check-failures.outputs.has_failures }} + +runs: + using: "composite" + steps: + - name: Download and extract install directory + uses: actions/download-artifact@v4.1.7 + with: + name: ${{ inputs.install-artifact-name }} + path: install + + - name: Download and extract 3rdparty dependencies for Windows + if: inputs.platform == 'windows' + shell: pwsh + run: | + Invoke-WebRequest -Uri https://github.com/Open-Cascade-SAS/OCCT/releases/download/V7_9_0_beta1/3rdparty-vc14-64.zip -OutFile 3rdparty-vc14-64.zip + Expand-Archive -Path 3rdparty-vc14-64.zip -DestinationPath . + Remove-Item 3rdparty-vc14-64.zip + + - name: Install macOS dependencies + if: inputs.platform == 'macos' + shell: bash + run: | + brew update + brew install tcl-tk tbb gl2ps xerces-c \ + libxmu libxi libxft libxpm \ + glew freeimage draco glfw + + - name: Install Linux dependencies + if: inputs.platform == 'linux' + shell: bash + run: | + sudo apt-get update && sudo apt-get install -y tcl-dev tk-dev cmake clang make libbtbb-dev libx11-dev libglu1-mesa-dev tcllib tcl-thread tcl libvtk9-dev libopenvr-dev libdraco-dev libfreeimage-dev libegl1-mesa-dev libgles2-mesa-dev libfreetype-dev + + - name: Setup Xvfb and Mesa for Linux + if: inputs.platform == 'linux' + uses: ./.github/actions/setup-xvfb-mesa + + - name: Set execute permissions on Unix platforms + if: inputs.platform != 'windows' + shell: bash + run: | + chmod +x install/bin/OpenCascadeGTest + + - name: Run OpenCascadeGTest on Windows + if: inputs.platform == 'windows' + id: run-gtest-windows + shell: cmd + run: | + cd install + call env.bat ${{ inputs.compiler == 'msvc' && 'vc14' || 'clang' }} win64 release + cd bin + set GTEST_OUTPUT="" + OpenCascadeGTest.exe --gtest_output=xml:gtest_results.xml > gtest_output.log 2>&1 + type gtest_output.log + exit /b 0 + + - name: Run OpenCascadeGTest on Unix platforms + if: inputs.platform != 'windows' + id: run-gtest-unix + shell: bash + env: + DISPLAY: ${{ inputs.platform == 'linux' && ':99' || '' }} + LIBGL_ALWAYS_SOFTWARE: 1 + run: | + cd install/bin + source env.sh + ./OpenCascadeGTest --gtest_output=xml:gtest_results.xml > gtest_output.log 2>&1 + cat gtest_output.log + + - name: Upload GTest results + uses: actions/upload-artifact@v4.4.3 + with: + name: gtest-results-${{ inputs.platform }}-${{ inputs.compiler }}-${{ inputs.artifact-suffix }} + path: | + install/bin/gtest_results.xml + install/bin/gtest_output.log + retention-days: 15 + + - name: Check for test failures on Windows + if: inputs.platform == 'windows' + id: check-failures-windows + shell: pwsh + run: | + cd install/bin + $log = Get-Content "gtest_output.log" -Raw + if ($log -match "\[\s+FAILED\s+\]") { + Write-Error "GTest failures detected in the output." + echo "has_failures=true" >> $env:GITHUB_OUTPUT + } else { + Write-Output "No GTest failures detected." + echo "has_failures=false" >> $env:GITHUB_OUTPUT + } + + - name: Check for test failures on Unix + if: inputs.platform != 'windows' + id: check-failures-unix + shell: bash + run: | + cd install/bin + if grep -q "\[ FAILED \]" gtest_output.log; then + echo "::error::GTest failures detected in the output." + echo "has_failures=true" >> $GITHUB_OUTPUT + else + echo "No GTest failures detected." + echo "has_failures=false" >> $GITHUB_OUTPUT + fi + + - name: Set combined output + id: check-failures + shell: bash + run: | + if [ "${{ inputs.platform }}" == "windows" ]; then + echo "has_failures=${{ steps.check-failures-windows.outputs.has_failures }}" >> $GITHUB_OUTPUT + else + echo "has_failures=${{ steps.check-failures-unix.outputs.has_failures }}" >> $GITHUB_OUTPUT + fi + + - name: Fail job if tests failed + if: steps.check-failures.outputs.has_failures == 'true' + shell: bash + run: | + echo "::error::GTest failures detected" + exit 1 diff --git a/.github/workflows/build-and-test-multiplatform.yml b/.github/workflows/build-and-test-multiplatform.yml index 6dffc23932..4274d5a050 100644 --- a/.github/workflows/build-and-test-multiplatform.yml +++ b/.github/workflows/build-and-test-multiplatform.yml @@ -21,13 +21,13 @@ jobs: clang-format: name: Check code formatting runs-on: windows-2022 - + steps: - name: Checkout repository uses: actions/checkout@v4.1.7 with: fetch-depth: 0 - + - name: Run clang-format check uses: ./.github/actions/clang-format-check with: @@ -95,8 +95,9 @@ jobs: -D USE_TBB=ON ` -D USE_RAPIDJSON=ON ` -D USE_OPENGL=ON ` - -D CMAKE_CXX_FLAGS="/W4 /WX" ` - -D CMAKE_C_FLAGS="/W4 /WX" .. + -D BUILD_GTEST=ON ` + -D BUILD_CPP_STANDARD=C++14 ` + -D INSTALL_GTEST=ON .. shell: pwsh - name: Build OCCT @@ -170,6 +171,9 @@ jobs: -D USE_TBB=ON ` -D USE_RAPIDJSON=ON ` -D USE_OPENGL=ON ` + -D BUILD_GTEST=ON ` + -D BUILD_CPP_STANDARD=C++14 ` + -D INSTALL_GTEST=ON ` -D CMAKE_CXX_FLAGS="-Werror -Wall -Wextra -Wno-unknown-warning-option" ` -D CMAKE_C_FLAGS="-Werror -Wall -Wextra -Wno-unknown-warning-option" .. shell: pwsh @@ -224,6 +228,9 @@ jobs: -D USE_FREETYPE=ON \ -D USE_OPENGL=ON \ -D USE_FREEIMAGE=ON \ + -D BUILD_GTEST=ON \ + -D BUILD_CPP_STANDARD=C++14 \ + -D INSTALL_GTEST=ON \ -D CMAKE_CXX_FLAGS="-Werror -Wall -Wextra" \ -D CMAKE_C_FLAGS="-Werror -Wall -Wextra" .. @@ -277,6 +284,9 @@ jobs: -D USE_FREETYPE=ON \ -D USE_OPENGL=ON \ -D USE_FREEIMAGE=ON \ + -D BUILD_GTEST=ON \ + -D BUILD_CPP_STANDARD=C++14 \ + -D INSTALL_GTEST=ON \ -D CMAKE_CXX_FLAGS="-Werror -Wall -Wextra" \ -D CMAKE_C_FLAGS="-Werror -Wall -Wextra" .. @@ -333,6 +343,9 @@ jobs: -D USE_TBB=OFF \ -D USE_RAPIDJSON=ON \ -D USE_OPENGL=ON \ + -D BUILD_GTEST=ON \ + -D BUILD_CPP_STANDARD=C++14 \ + -D INSTALL_GTEST=ON \ -D CMAKE_CXX_FLAGS="-Werror -Wall -Wextra" \ -D CMAKE_C_FLAGS="-Werror -Wall -Wextra" .. @@ -388,7 +401,10 @@ jobs: -D USE_VTK=ON \ -D USE_TBB=OFF \ -D USE_RAPIDJSON=ON \ - -D USE_OPENGL=ON .. + -D USE_OPENGL=ON \ + -D BUILD_GTEST=ON \ + -D BUILD_CPP_STANDARD=C++14 \ + -D INSTALL_GTEST=ON .. - name: Build OCCT run: | @@ -406,7 +422,7 @@ jobs: name: Build TInspector on Windows needs: prepare-and-build-windows-x64 runs-on: windows-2022 - + steps: - name: Checkout repository uses: actions/checkout@v4.1.7 @@ -421,7 +437,7 @@ jobs: name: Build TInspector on Linux needs: prepare-and-build-linux-clang-x64 runs-on: ubuntu-24.04 - + steps: - name: Checkout repository uses: actions/checkout@v4.1.7 @@ -436,7 +452,7 @@ jobs: name: Build CSharp Sample on Windows needs: prepare-and-build-windows-x64 runs-on: windows-2022 - + steps: - name: Checkout repository uses: actions/checkout@v4.1.7 @@ -451,7 +467,7 @@ jobs: name: Build MFC Sample on Windows needs: prepare-and-build-windows-x64 runs-on: windows-2022 - + steps: - name: Checkout repository uses: actions/checkout@v4.1.7 @@ -466,7 +482,7 @@ jobs: name: Build Qt Sample on Windows needs: prepare-and-build-windows-x64 runs-on: windows-2022 - + steps: - name: Checkout repository uses: actions/checkout@v4.1.7 @@ -481,7 +497,7 @@ jobs: name: Build Qt Sample on Linux needs: prepare-and-build-linux-clang-x64 runs-on: ubuntu-24.04 - + steps: - name: Checkout repository uses: actions/checkout@v4.1.7 @@ -1146,7 +1162,7 @@ jobs: cd install/bin/results/macos-x64-retest if [ "$(ls -A)" ]; then cp -rf * ../macos-x64/ - + cd ../../ source env.sh ./DRAWEXE -v -c testsummarize results/macos-x64 @@ -1363,7 +1379,7 @@ jobs: cd install/bin/results/macos-gcc-x64-retest if [ "$(ls -A)" ]; then cp -rf * ../macos-gcc-x64/ - + cd ../../ source env.sh ./DRAWEXE -v -c testsummarize results/macos-gcc-x64 @@ -1567,7 +1583,7 @@ jobs: cd install/bin/results/linux-clang-x64-retest if [ "$(ls -A)" ]; then cp -rf * ../linux-clang-x64/ - + cd ../../ source env.sh ./DRAWEXE -v -c testsummarize results/linux-clang-x64 @@ -1771,7 +1787,7 @@ jobs: cd install/bin/results/linux-gcc-x64-retest if [ "$(ls -A)" ]; then cp -rf * ../linux-gcc-x64/ - + cd ../../ source env.sh ./DRAWEXE -v -c testsummarize results/linux-gcc-x64 @@ -1802,6 +1818,108 @@ jobs: echo "Found $FAILED_COUNT FAILED tests" fi + run-gtest-windows-x64: + name: Run GTest on Windows with MSVC (x64) + needs: prepare-and-build-windows-x64 + runs-on: windows-2022 + + steps: + - name: Checkout repository + uses: actions/checkout@v4.1.7 + + - name: Run GTests + uses: ./.github/actions/run-gtest + with: + platform: windows + compiler: msvc + install-artifact-name: install-windows-x64 + artifact-suffix: x64 + + run-gtest-windows-clang-x64: + name: Run GTest on Windows with Clang (x64) + needs: prepare-and-build-windows-clang-x64 + runs-on: windows-2022 + + steps: + - name: Checkout repository + uses: actions/checkout@v4.1.7 + + - name: Run GTests + uses: ./.github/actions/run-gtest + with: + platform: windows + compiler: clang + install-artifact-name: install-windows-clang-x64 + artifact-suffix: x64 + + run-gtest-macos-x64: + name: Run GTest on macOS with Clang (x64) + needs: prepare-and-build-macos-x64 + runs-on: macos-15 + + steps: + - name: Checkout repository + uses: actions/checkout@v4.1.7 + + - name: Run GTests + uses: ./.github/actions/run-gtest + with: + platform: macos + compiler: clang + install-artifact-name: install-macos-x64 + artifact-suffix: x64 + + run-gtest-macos-gcc-x64: + name: Run GTest on macOS with GCC (x64) + needs: prepare-and-build-macos-gcc-x64 + runs-on: macos-15 + + steps: + - name: Checkout repository + uses: actions/checkout@v4.1.7 + + - name: Run GTests + uses: ./.github/actions/run-gtest + with: + platform: macos + compiler: gcc + install-artifact-name: install-macos-gcc-x64 + artifact-suffix: x64 + + run-gtest-linux-clang-x64: + name: Run GTest on Linux with Clang (x64) + needs: prepare-and-build-linux-clang-x64 + runs-on: ubuntu-24.04 + + steps: + - name: Checkout repository + uses: actions/checkout@v4.1.7 + + - name: Run GTests + uses: ./.github/actions/run-gtest + with: + platform: linux + compiler: clang + install-artifact-name: install-linux-clang-x64 + artifact-suffix: x64 + + run-gtest-linux-gcc-x64: + name: Run GTest on Linux with GCC (x64) + needs: prepare-and-build-linux-gcc-x64 + runs-on: ubuntu-24.04 + + steps: + - name: Checkout repository + uses: actions/checkout@v4.1.7 + + - name: Run GTests + uses: ./.github/actions/run-gtest + with: + platform: linux + compiler: gcc + install-artifact-name: install-linux-gcc-x64 + artifact-suffix: x64 + test-summary: name: 'Summarize Test Results' runs-on: ubuntu-24.04 diff --git a/CMakeLists.txt b/CMakeLists.txt index 977aad0613..4b1db71f73 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,6 +82,12 @@ elseif ("${BUILD_CPP_STANDARD}" STREQUAL "C++23") else () message (FATAL_ERROR, "misprint in c++ standard name") endif() + +if (DEFINED BUILD_GTEST AND BUILD_GTEST AND CMAKE_CXX_STANDARD LESS 14) + set (CMAKE_CXX_STANDARD 14) + message (STATUS "Info: C++14 standard is required for GTest. Set to C++14.") +endif() + set (CMAKE_CXX_STANDARD_REQUIRED ON) # include cmake file @@ -449,6 +455,10 @@ else() OCCT_CHECK_AND_UNSET (USE_VTK) endif() +if (NOT DEFINED BUILD_GTEST) + set (BUILD_GTEST OFF CACHE BOOL "${BUILD_GTEST_DESCR}") +endif() + # Rebuild *.yacc and *.lex files that are contained by TKMath toolkit list (FIND BUILD_TOOLKITS TKMath CAN_REBUILD_PDC_FOR_TKMATH) list (FIND BUILD_TOOLKITS StepFile CAN_REBUILD_PDC_FOR_STEPFILE) @@ -1184,6 +1194,29 @@ foreach (BUILD_TOOLKIT ${BUILD_TOOLKITS}) add_subdirectory ("${OCCT_${BUILD_TOOLKIT}_FILES_LOCATION}") endforeach() +# Setup Google Test integration if enabled +if (BUILD_GTEST) + OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/gtest") + enable_testing() + + OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_gtest") + # Initialize GTest environment and create the target first + OCCT_INIT_GTEST() + + # Collect test files from all active toolkits and add them to the target + foreach (BUILD_TOOLKIT ${BUILD_TOOLKITS}) + OCCT_COLLECT_TOOLKIT_TESTS(${BUILD_TOOLKIT}) + endforeach() + + # Set environment variables for all tests + OCCT_SET_GTEST_ENVIRONMENT() +else() + # Disable GTest integration if not enabled + OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_GTEST") + OCCT_CHECK_AND_UNSET_GROUP ("GTest") + OCCT_CHECK_AND_UNSET ("INSTALL_GTEST") +endif() + if (BUILD_DOC_Overview OR BUILD_DOC_RefMan) OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_doc") # Setup documentation targets diff --git a/adm/cmake/gtest.cmake b/adm/cmake/gtest.cmake new file mode 100644 index 0000000000..436713f35c --- /dev/null +++ b/adm/cmake/gtest.cmake @@ -0,0 +1,66 @@ +# Google Test integration for OCCT + +# Only proceed if tests are enabled +if (NOT BUILD_GTEST) + set(GOOGLETEST_FOUND FALSE) + return() +endif() + +# Check if the user has specified whether to install Google Test +if (NOT DEFINED INSTALL_GTEST) + set(INSTALL_GTEST OFF CACHE BOOL "Install Google Test") +endif() + +# Google Test configuration options +option(GTEST_USE_EXTERNAL "Use externally provided Google Test installation" OFF) +option(GTEST_USE_FETCHCONTENT "Use FetchContent to download and build Google Test" ON) + +# Try to find existing GTest installation +find_package(GTest QUIET) + +if(GTest_FOUND) + message(STATUS "Found Googletest installation") + set(GOOGLETEST_FOUND TRUE) + set(GTEST_USE_EXTERNAL TRUE) + set(GTEST_USE_FETCHCONTENT FALSE) +else() + message(STATUS "Googletest not found in system paths") + if(GTEST_USE_FETCHCONTENT) + include(FetchContent) + + # Set option to disable GMock before declaring the content + set(BUILD_GMOCK OFF CACHE BOOL "Builds the googlemock subproject" FORCE) + + # For Windows: Prevent overriding the parent project's compiler/linker settings + set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) + + FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/refs/tags/v1.16.0.zip + DOWNLOAD_EXTRACT_TIMESTAMP true + ) + + FetchContent_MakeAvailable(googletest) + + # Set proper grouping for the targets in solution explorer + if(TARGET gtest) + set_target_properties(gtest PROPERTIES FOLDER "ThirdParty/GoogleTest") + target_compile_definitions(gtest PRIVATE GTEST_CREATE_SHARED_LIBRARY=1) + endif() + if(TARGET gtest_main) + set_target_properties(gtest_main PROPERTIES FOLDER "ThirdParty/GoogleTest") + target_compile_definitions(gtest_main PRIVATE GTEST_CREATE_SHARED_LIBRARY=1) + endif() + + # Set variables for consistent use throughout the build system + set(GOOGLETEST_FOUND TRUE) + else() + message(STATUS "Google Test not available. Tests will be skipped.") + set(GOOGLETEST_FOUND FALSE) + endif() +endif() + +# Enable CTest if Google Test is available +if(GOOGLETEST_FOUND) + include(GoogleTest) +endif() diff --git a/adm/cmake/occt_gtest.cmake b/adm/cmake/occt_gtest.cmake new file mode 100644 index 0000000000..a095bf7df6 --- /dev/null +++ b/adm/cmake/occt_gtest.cmake @@ -0,0 +1,245 @@ +# Google Test integration for OCCT toolkits + +set (TEST_PROJECT_NAME OpenCascadeGTest) + +# Initialize Google Test environment and create the target +function(OCCT_INIT_GTEST) + if (NOT GOOGLETEST_FOUND) + message(STATUS "Google Test not available. Skipping test project ${TEST_PROJECT_NAME}") + return() + endif() + + # Initialize test data collections + set(OCCT_GTEST_SOURCE_FILES "" PARENT_SCOPE) + set(OCCT_GTEST_SOURCE_FILES_ABS "" PARENT_SCOPE) + set(OCCT_GTEST_TESTS_LIST "" PARENT_SCOPE) + + # Create the test executable once + add_executable(${TEST_PROJECT_NAME}) + + set_target_properties(${TEST_PROJECT_NAME} PROPERTIES FOLDER "Testing") + + # Link with Google Test + target_link_libraries(${TEST_PROJECT_NAME} PRIVATE GTest::gtest_main) + + # Add pthreads if necessary (for Linux) + if (UNIX AND NOT APPLE) + target_link_libraries(${TEST_PROJECT_NAME} PRIVATE pthread) + endif() + + target_compile_definitions(${TEST_PROJECT_NAME} PRIVATE GTEST_LINKED_AS_SHARED_LIBRARY=1) + + # Link with all active toolkits that are libraries + foreach(TOOLKIT ${BUILD_TOOLKITS}) + if(TARGET ${TOOLKIT}) + get_target_property(TOOLKIT_TYPE ${TOOLKIT} TYPE) + if(TOOLKIT_TYPE STREQUAL "SHARED_LIBRARY" OR TOOLKIT_TYPE STREQUAL "STATIC_LIBRARY") + target_link_libraries(${TEST_PROJECT_NAME} PRIVATE ${TOOLKIT}) + endif() + endif() + endforeach() + + if (INSTALL_GTEST) + # Install the test executable + install (TARGETS ${TEST_PROJECT_NAME} + DESTINATION "${INSTALL_DIR_BIN}\${OCCT_INSTALL_BIN_LETTER}") + + if (EMSCRIPTEN) + install(FILES ${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bin\${OCCT_INSTALL_BIN_LETTER}/${TEST_PROJECT_NAME}.wasm DESTINATION "${INSTALL_DIR_BIN}/${OCCT_INSTALL_BIN_LETTER}") + endif() + endif() +endfunction() + +# Add tests from a specific toolkit to the main test executable +function(OCCT_COLLECT_TOOLKIT_TESTS TOOLKIT_NAME) + # Skip if Google Test is not available or the test executable wasn't created + if (NOT GOOGLETEST_FOUND OR NOT TARGET ${TEST_PROJECT_NAME}) + return() + endif() + + # Extract test source files from FILES.cmake + set(FILES_CMAKE_PATH "${OCCT_${TOOLKIT_NAME}_FILES_LOCATION}/GTests/FILES.cmake") + if(EXISTS "${FILES_CMAKE_PATH}") + # Reset toolkit test files list + set(OCCT_${TOOLKIT_NAME}_GTests_FILES) + + # Include the toolkit's FILES.cmake which sets OCCT_${TOOLKIT_NAME}_GTests_FILES + include("${FILES_CMAKE_PATH}") + set(TEST_SOURCE_FILES "${OCCT_${TOOLKIT_NAME}_GTests_FILES}") + + # Skip if no test files found + if(NOT TEST_SOURCE_FILES) + return() + endif() + + # Get module name for test organization + get_target_property(TOOLKIT_MODULE ${TOOLKIT_NAME} MODULE) + if(NOT TOOLKIT_MODULE) + set(TOOLKIT_MODULE "Unknown") + endif() + + # Get absolute paths of test source files and add them to the executable + set(TEST_SOURCE_FILES_ABS) + foreach(TEST_SOURCE_FILE ${TEST_SOURCE_FILES}) + set(TEST_SOURCE_FILE_ABS "${OCCT_${TOOLKIT_NAME}_GTests_FILES_LOCATION}/${TEST_SOURCE_FILE}") + list(APPEND TEST_SOURCE_FILES_ABS "${TEST_SOURCE_FILE_ABS}") + endforeach() + + # Add test sources to the executable + target_sources(${TEST_PROJECT_NAME} PRIVATE ${TEST_SOURCE_FILES_ABS}) + + # Create a more reliable test discovery approach + # Use the WORKING_DIRECTORY parameter to ensure proper test execution context + gtest_add_tests( + TARGET ${TEST_PROJECT_NAME} + TEST_PREFIX "${TOOLKIT_MODULE}::${TOOLKIT_NAME}::" + SOURCES ${TEST_SOURCE_FILES_ABS} + TEST_LIST TOOLKIT_TESTS + SKIP_DEPENDENCY + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + + # Configure test output properties to improve result capture + foreach(test_name ${TOOLKIT_TESTS}) + set_tests_properties(${test_name} PROPERTIES + # Use proper result detection by checking output and return code + PASS_REGULAR_EXPRESSION "\\[ PASSED \\]" + FAIL_REGULAR_EXPRESSION "\\[ FAILED \\]" + ) + endforeach() + + # Add these tests to the main list so we can set environment for all tests later + # Get the existing list first + if(DEFINED OCCT_GTEST_TESTS_LIST) + set(TEMP_GTEST_TESTS_LIST ${OCCT_GTEST_TESTS_LIST}) + else() + set(TEMP_GTEST_TESTS_LIST "") + endif() + + # Append the new tests + list(APPEND TEMP_GTEST_TESTS_LIST ${TOOLKIT_TESTS}) + + # Update the parent scope variable + set(OCCT_GTEST_TESTS_LIST "${TEMP_GTEST_TESTS_LIST}" PARENT_SCOPE) + endif() +endfunction() + +# Set environment variables for all collected tests +function(OCCT_SET_GTEST_ENVIRONMENT) + if (NOT GOOGLETEST_FOUND OR NOT TARGET ${TEST_PROJECT_NAME}) + return() + endif() + + if (OCCT_GTEST_TESTS_LIST) + # Set common environment variables + set(TEST_ENVIRONMENT + "CSF_LANGUAGE=us" + "MMGT_CLEAR=1" + "CSF_SHMessage=${CMAKE_SOURCE_DIR}/resources/SHMessage" + "CSF_MDTVTexturesDirectory=${CMAKE_SOURCE_DIR}/resources/Textures" + "CSF_ShadersDirectory=${CMAKE_SOURCE_DIR}/resources/Shaders" + "CSF_XSMessage=${CMAKE_SOURCE_DIR}/resources/XSMessage" + "CSF_TObjMessage=${CMAKE_SOURCE_DIR}/resources/TObj" + "CSF_StandardDefaults=${CMAKE_SOURCE_DIR}/resources/StdResource" + "CSF_PluginDefaults=${CMAKE_SOURCE_DIR}/resources/StdResource" + "CSF_XCAFDefaults=${CMAKE_SOURCE_DIR}/resources/StdResource" + "CSF_TObjDefaults=${CMAKE_SOURCE_DIR}/resources/StdResource" + "CSF_StandardLiteDefaults=${CMAKE_SOURCE_DIR}/resources/StdResource" + "CSF_IGESDefaults=${CMAKE_SOURCE_DIR}/resources/XSTEPResource" + "CSF_STEPDefaults=${CMAKE_SOURCE_DIR}/resources/XSTEPResource" + "CSF_XmlOcafResource=${CMAKE_SOURCE_DIR}/resources/XmlOcafResource" + "CSF_MIGRATION_TYPES=${CMAKE_SOURCE_DIR}/resources/StdResource/MigrationSheet.txt" + "CSF_OCCTResourcePath=${CMAKE_SOURCE_DIR}/resources" + "CSF_OCCTDataPath=${CMAKE_SOURCE_DIR}/data" + "CSF_OCCTDocPath=${CMAKE_SOURCE_DIR}/doc" + "CSF_OCCTSamplesPath=${CMAKE_SOURCE_DIR}/samples" + "CSF_OCCTTestsPath=${CMAKE_SOURCE_DIR}/tests" + "CSF_OCCTBinPath=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + "CSF_OCCTLibPath=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}" + "CSF_OCCTIncludePath=${CMAKE_BINARY_DIR}/${INSTALL_DIR_INCLUDE}" + "CASROOT=${CMAKE_SOURCE_DIR}" + ) + + # Build PATH environment variable + set(PATH_ELEMENTS + "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + ) + + # Add 3rdparty paths to PATH + if(3RDPARTY_TCL_LIBRARY_DIR) + list(APPEND PATH_ELEMENTS "${3RDPARTY_TCL_LIBRARY_DIR}") + endif() + if(3RDPARTY_TK_LIBRARY_DIR) + list(APPEND PATH_ELEMENTS "${3RDPARTY_TK_LIBRARY_DIR}") + endif() + if(3RDPARTY_FREETYPE_LIBRARY_DIR) + list(APPEND PATH_ELEMENTS "${3RDPARTY_FREETYPE_LIBRARY_DIR}") + endif() + if(3RDPARTY_FREEIMAGE_LIBRARY_DIRS) + list(APPEND PATH_ELEMENTS "${3RDPARTY_FREEIMAGE_LIBRARY_DIRS}") + endif() + if(3RDPARTY_TBB_LIBRARY_DIR) + list(APPEND PATH_ELEMENTS "${3RDPARTY_TBB_LIBRARY_DIR}") + endif() + if(3RDPARTY_VTK_LIBRARY_DIR) + list(APPEND PATH_ELEMENTS "${3RDPARTY_VTK_LIBRARY_DIR}") + endif() + if(3RDPARTY_FFMPEG_LIBRARY_DIR) + list(APPEND PATH_ELEMENTS "${3RDPARTY_FFMPEG_LIBRARY_DIR}") + endif() + if(3RDPARTY_QT_DIR) + list(APPEND PATH_ELEMENTS "${3RDPARTY_QT_DIR}/bin") + endif() + if (3RDPARTY_DLL_DIRS) + foreach(DLL_DIR ${3RDPARTY_DLL_DIRS}) + list(APPEND PATH_ELEMENTS "${DLL_DIR}") + endforeach() + endif() + + # Create the PATH variable that ctest will use + if(WIN32) + string(REPLACE ";" "\\;" TEST_PATH_ENV "$ENV{PATH}") + string(REPLACE ";" "\\;" PATH_ELEMENTS_STR "${PATH_ELEMENTS}") + list(APPEND TEST_ENVIRONMENT "PATH=${PATH_ELEMENTS_STR}\\;${TEST_PATH_ENV}") + else() + string(REPLACE ";" ":" PATH_ELEMENTS_STR "${PATH_ELEMENTS}") + list(APPEND TEST_ENVIRONMENT "PATH=${PATH_ELEMENTS_STR}:$ENV{PATH}") + + # Set LD_LIBRARY_PATH for Unix systems + list(APPEND TEST_ENVIRONMENT "LD_LIBRARY_PATH=${PATH_ELEMENTS_STR}:$ENV{LD_LIBRARY_PATH}") + + # Set DYLD_LIBRARY_PATH for macOS + if(APPLE) + list(APPEND TEST_ENVIRONMENT "DYLD_LIBRARY_PATH=${PATH_ELEMENTS_STR}:$ENV{DYLD_LIBRARY_PATH}") + endif() + endif() + + # Add DrawResources related environment if it exists + if(EXISTS "${CMAKE_SOURCE_DIR}/resources/DrawResources") + list(APPEND TEST_ENVIRONMENT "DRAWHOME=${CMAKE_SOURCE_DIR}/resources/DrawResources") + list(APPEND TEST_ENVIRONMENT "CSF_DrawPluginDefaults=${CMAKE_SOURCE_DIR}/resources/DrawResources") + + if(EXISTS "${CMAKE_SOURCE_DIR}/resources/DrawResources/DrawDefault") + list(APPEND TEST_ENVIRONMENT "DRAWDEFAULT=${CMAKE_SOURCE_DIR}/resources/DrawResources/DrawDefault") + endif() + endif() + + # Set FPE signal handler if enabled + if(BUILD_ENABLE_FPE_SIGNAL_HANDLER) + list(APPEND TEST_ENVIRONMENT "CSF_FPE=1") + endif() + + # Set TCL/TK library paths if they differ + if(3RDPARTY_TCL_LIBRARY_DIR AND 3RDPARTY_TK_LIBRARY_DIR AND NOT 3RDPARTY_TCL_LIBRARY_DIR STREQUAL 3RDPARTY_TK_LIBRARY_DIR) + if(3RDPARTY_TCL_LIBRARY_VERSION_WITH_DOT) + list(APPEND TEST_ENVIRONMENT "TCL_LIBRARY=${3RDPARTY_TCL_LIBRARY_DIR}/../lib/tcl${3RDPARTY_TCL_LIBRARY_VERSION_WITH_DOT}") + endif() + if(3RDPARTY_TK_LIBRARY_VERSION_WITH_DOT) + list(APPEND TEST_ENVIRONMENT "TK_LIBRARY=${3RDPARTY_TK_LIBRARY_DIR}/../lib/tk${3RDPARTY_TK_LIBRARY_VERSION_WITH_DOT}") + endif() + endif() + + # Set environment for all tests in the project + set_tests_properties(${OCCT_GTEST_TESTS_LIST} PROPERTIES ENVIRONMENT "${TEST_ENVIRONMENT}") + endif() +endfunction() diff --git a/adm/cmake/occt_toolkit.cmake b/adm/cmake/occt_toolkit.cmake index b3d82bc0b9..378ff6928e 100644 --- a/adm/cmake/occt_toolkit.cmake +++ b/adm/cmake/occt_toolkit.cmake @@ -189,6 +189,7 @@ elseif (BUILD_SOVERSION_NUMBERS GREATER 1) elseif (BUILD_SOVERSION_NUMBERS GREATER 0) set (OCC_SOVERSION "${OCC_VERSION_MAJOR}") endif() + set_target_properties (${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "${PRECOMPILED_DEFS}" SOVERSION "${OCC_SOVERSION}" VERSION "${OCC_VERSION_MAJOR}.${OCC_VERSION_MINOR}.${OCC_VERSION_MAINTENANCE}") diff --git a/src/ApplicationFramework/TKBin/GTests/FILES.cmake b/src/ApplicationFramework/TKBin/GTests/FILES.cmake new file mode 100644 index 0000000000..03df2a6eca --- /dev/null +++ b/src/ApplicationFramework/TKBin/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKBin +set(OCCT_TKBin_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKBin_GTests_FILES +) diff --git a/src/ApplicationFramework/TKBinL/GTests/FILES.cmake b/src/ApplicationFramework/TKBinL/GTests/FILES.cmake new file mode 100644 index 0000000000..8480c4f406 --- /dev/null +++ b/src/ApplicationFramework/TKBinL/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKBinL +set(OCCT_TKBinL_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKBinL_GTests_FILES +) diff --git a/src/ApplicationFramework/TKBinTObj/GTests/FILES.cmake b/src/ApplicationFramework/TKBinTObj/GTests/FILES.cmake new file mode 100644 index 0000000000..f15e2b60b1 --- /dev/null +++ b/src/ApplicationFramework/TKBinTObj/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKBinTObj +set(OCCT_TKBinTObj_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKBinTObj_GTests_FILES +) diff --git a/src/ApplicationFramework/TKCAF/GTests/FILES.cmake b/src/ApplicationFramework/TKCAF/GTests/FILES.cmake new file mode 100644 index 0000000000..36955a93d5 --- /dev/null +++ b/src/ApplicationFramework/TKCAF/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKCAF +set(OCCT_TKCAF_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKCAF_GTests_FILES +) diff --git a/src/ApplicationFramework/TKCDF/GTests/FILES.cmake b/src/ApplicationFramework/TKCDF/GTests/FILES.cmake new file mode 100644 index 0000000000..ecf53ecf52 --- /dev/null +++ b/src/ApplicationFramework/TKCDF/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKCDF +set(OCCT_TKCDF_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKCDF_GTests_FILES +) diff --git a/src/ApplicationFramework/TKLCAF/GTests/FILES.cmake b/src/ApplicationFramework/TKLCAF/GTests/FILES.cmake new file mode 100644 index 0000000000..10e22a4119 --- /dev/null +++ b/src/ApplicationFramework/TKLCAF/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKLCAF +set(OCCT_TKLCAF_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKLCAF_GTests_FILES +) diff --git a/src/ApplicationFramework/TKStd/GTests/FILES.cmake b/src/ApplicationFramework/TKStd/GTests/FILES.cmake new file mode 100644 index 0000000000..5e6a433304 --- /dev/null +++ b/src/ApplicationFramework/TKStd/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKStd +set(OCCT_TKStd_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKStd_GTests_FILES +) diff --git a/src/ApplicationFramework/TKStdL/GTests/FILES.cmake b/src/ApplicationFramework/TKStdL/GTests/FILES.cmake new file mode 100644 index 0000000000..a13fa1ec33 --- /dev/null +++ b/src/ApplicationFramework/TKStdL/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKStdL +set(OCCT_TKStdL_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKStdL_GTests_FILES +) diff --git a/src/ApplicationFramework/TKTObj/GTests/FILES.cmake b/src/ApplicationFramework/TKTObj/GTests/FILES.cmake new file mode 100644 index 0000000000..81e8b06e43 --- /dev/null +++ b/src/ApplicationFramework/TKTObj/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKTObj +set(OCCT_TKTObj_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKTObj_GTests_FILES +) diff --git a/src/ApplicationFramework/TKVCAF/GTests/FILES.cmake b/src/ApplicationFramework/TKVCAF/GTests/FILES.cmake new file mode 100644 index 0000000000..22d93b30b4 --- /dev/null +++ b/src/ApplicationFramework/TKVCAF/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKVCAF +set(OCCT_TKVCAF_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKVCAF_GTests_FILES +) diff --git a/src/ApplicationFramework/TKXml/GTests/FILES.cmake b/src/ApplicationFramework/TKXml/GTests/FILES.cmake new file mode 100644 index 0000000000..22b8dcce33 --- /dev/null +++ b/src/ApplicationFramework/TKXml/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXml +set(OCCT_TKXml_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXml_GTests_FILES +) diff --git a/src/ApplicationFramework/TKXmlL/GTests/FILES.cmake b/src/ApplicationFramework/TKXmlL/GTests/FILES.cmake new file mode 100644 index 0000000000..9f7a52f6b1 --- /dev/null +++ b/src/ApplicationFramework/TKXmlL/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXmlL +set(OCCT_TKXmlL_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXmlL_GTests_FILES +) diff --git a/src/ApplicationFramework/TKXmlTObj/GTests/FILES.cmake b/src/ApplicationFramework/TKXmlTObj/GTests/FILES.cmake new file mode 100644 index 0000000000..ff66b243a4 --- /dev/null +++ b/src/ApplicationFramework/TKXmlTObj/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXmlTObj +set(OCCT_TKXmlTObj_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXmlTObj_GTests_FILES +) diff --git a/src/DataExchange/TKBinXCAF/GTests/FILES.cmake b/src/DataExchange/TKBinXCAF/GTests/FILES.cmake new file mode 100644 index 0000000000..29698db09b --- /dev/null +++ b/src/DataExchange/TKBinXCAF/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKBinXCAF +set(OCCT_TKBinXCAF_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKBinXCAF_GTests_FILES +) diff --git a/src/DataExchange/TKDE/GTests/FILES.cmake b/src/DataExchange/TKDE/GTests/FILES.cmake new file mode 100644 index 0000000000..b67b61223c --- /dev/null +++ b/src/DataExchange/TKDE/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKDE +set(OCCT_TKDE_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKDE_GTests_FILES +) diff --git a/src/DataExchange/TKDECascade/GTests/FILES.cmake b/src/DataExchange/TKDECascade/GTests/FILES.cmake new file mode 100644 index 0000000000..49cd9243a3 --- /dev/null +++ b/src/DataExchange/TKDECascade/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKDECascade +set(OCCT_TKDECascade_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKDECascade_GTests_FILES +) diff --git a/src/DataExchange/TKDEGLTF/GTests/FILES.cmake b/src/DataExchange/TKDEGLTF/GTests/FILES.cmake new file mode 100644 index 0000000000..12612060f1 --- /dev/null +++ b/src/DataExchange/TKDEGLTF/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKDEGLTF +set(OCCT_TKDEGLTF_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKDEGLTF_GTests_FILES +) diff --git a/src/DataExchange/TKDEIGES/GTests/FILES.cmake b/src/DataExchange/TKDEIGES/GTests/FILES.cmake new file mode 100644 index 0000000000..fdd8320015 --- /dev/null +++ b/src/DataExchange/TKDEIGES/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKDEIGES +set(OCCT_TKDEIGES_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKDEIGES_GTests_FILES +) diff --git a/src/DataExchange/TKDEOBJ/GTests/FILES.cmake b/src/DataExchange/TKDEOBJ/GTests/FILES.cmake new file mode 100644 index 0000000000..5406e9442a --- /dev/null +++ b/src/DataExchange/TKDEOBJ/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKDEOBJ +set(OCCT_TKDEOBJ_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKDEOBJ_GTests_FILES +) diff --git a/src/DataExchange/TKDEPLY/GTests/FILES.cmake b/src/DataExchange/TKDEPLY/GTests/FILES.cmake new file mode 100644 index 0000000000..5a77408edf --- /dev/null +++ b/src/DataExchange/TKDEPLY/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKDEPLY +set(OCCT_TKDEPLY_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKDEPLY_GTests_FILES +) diff --git a/src/DataExchange/TKDESTEP/GTests/FILES.cmake b/src/DataExchange/TKDESTEP/GTests/FILES.cmake new file mode 100644 index 0000000000..e1c97bde20 --- /dev/null +++ b/src/DataExchange/TKDESTEP/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKDESTEP +set(OCCT_TKDESTEP_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKDESTEP_GTests_FILES +) diff --git a/src/DataExchange/TKDESTL/GTests/FILES.cmake b/src/DataExchange/TKDESTL/GTests/FILES.cmake new file mode 100644 index 0000000000..0a43c909d6 --- /dev/null +++ b/src/DataExchange/TKDESTL/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKDESTL +set(OCCT_TKDESTL_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKDESTL_GTests_FILES +) diff --git a/src/DataExchange/TKDEVRML/GTests/FILES.cmake b/src/DataExchange/TKDEVRML/GTests/FILES.cmake new file mode 100644 index 0000000000..9a43166d36 --- /dev/null +++ b/src/DataExchange/TKDEVRML/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKDEVRML +set(OCCT_TKDEVRML_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKDEVRML_GTests_FILES +) diff --git a/src/DataExchange/TKRWMesh/GTests/FILES.cmake b/src/DataExchange/TKRWMesh/GTests/FILES.cmake new file mode 100644 index 0000000000..87e9e8d577 --- /dev/null +++ b/src/DataExchange/TKRWMesh/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKRWMesh +set(OCCT_TKRWMesh_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKRWMesh_GTests_FILES +) diff --git a/src/DataExchange/TKXCAF/GTests/FILES.cmake b/src/DataExchange/TKXCAF/GTests/FILES.cmake new file mode 100644 index 0000000000..da82766527 --- /dev/null +++ b/src/DataExchange/TKXCAF/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXCAF +set(OCCT_TKXCAF_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXCAF_GTests_FILES +) diff --git a/src/DataExchange/TKXSBase/GTests/FILES.cmake b/src/DataExchange/TKXSBase/GTests/FILES.cmake new file mode 100644 index 0000000000..f9484a455b --- /dev/null +++ b/src/DataExchange/TKXSBase/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXSBase +set(OCCT_TKXSBase_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXSBase_GTests_FILES +) diff --git a/src/DataExchange/TKXmlXCAF/GTests/FILES.cmake b/src/DataExchange/TKXmlXCAF/GTests/FILES.cmake new file mode 100644 index 0000000000..718cec28a3 --- /dev/null +++ b/src/DataExchange/TKXmlXCAF/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXmlXCAF +set(OCCT_TKXmlXCAF_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXmlXCAF_GTests_FILES +) diff --git a/src/Draw/TKD3DHostTest/GTests/FILES.cmake b/src/Draw/TKD3DHostTest/GTests/FILES.cmake new file mode 100644 index 0000000000..6447ce360c --- /dev/null +++ b/src/Draw/TKD3DHostTest/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKD3DHostTest +set(OCCT_TKD3DHostTest_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKD3DHostTest_GTests_FILES +) diff --git a/src/Draw/TKDCAF/GTests/FILES.cmake b/src/Draw/TKDCAF/GTests/FILES.cmake new file mode 100644 index 0000000000..02d77ba858 --- /dev/null +++ b/src/Draw/TKDCAF/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKDCAF +set(OCCT_TKDCAF_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKDCAF_GTests_FILES +) diff --git a/src/Draw/TKDraw/GTests/FILES.cmake b/src/Draw/TKDraw/GTests/FILES.cmake new file mode 100644 index 0000000000..d622773cf1 --- /dev/null +++ b/src/Draw/TKDraw/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKDraw +set(OCCT_TKDraw_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKDraw_GTests_FILES +) diff --git a/src/Draw/TKIVtkDraw/GTests/FILES.cmake b/src/Draw/TKIVtkDraw/GTests/FILES.cmake new file mode 100644 index 0000000000..f0c187e497 --- /dev/null +++ b/src/Draw/TKIVtkDraw/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKIVtkDraw +set(OCCT_TKIVtkDraw_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKIVtkDraw_GTests_FILES +) diff --git a/src/Draw/TKOpenGlTest/GTests/FILES.cmake b/src/Draw/TKOpenGlTest/GTests/FILES.cmake new file mode 100644 index 0000000000..c9ce50acaa --- /dev/null +++ b/src/Draw/TKOpenGlTest/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKOpenGlTest +set(OCCT_TKOpenGlTest_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKOpenGlTest_GTests_FILES +) diff --git a/src/Draw/TKOpenGlesTest/GTests/FILES.cmake b/src/Draw/TKOpenGlesTest/GTests/FILES.cmake new file mode 100644 index 0000000000..8d3580d45b --- /dev/null +++ b/src/Draw/TKOpenGlesTest/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKOpenGlesTest +set(OCCT_TKOpenGlesTest_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKOpenGlesTest_GTests_FILES +) diff --git a/src/Draw/TKQADraw/GTests/FILES.cmake b/src/Draw/TKQADraw/GTests/FILES.cmake new file mode 100644 index 0000000000..c8dc4d46c6 --- /dev/null +++ b/src/Draw/TKQADraw/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKQADraw +set(OCCT_TKQADraw_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKQADraw_GTests_FILES +) diff --git a/src/Draw/TKTObjDRAW/GTests/FILES.cmake b/src/Draw/TKTObjDRAW/GTests/FILES.cmake new file mode 100644 index 0000000000..058399d8b2 --- /dev/null +++ b/src/Draw/TKTObjDRAW/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKTObjDRAW +set(OCCT_TKTObjDRAW_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKTObjDRAW_GTests_FILES +) diff --git a/src/Draw/TKTopTest/GTests/FILES.cmake b/src/Draw/TKTopTest/GTests/FILES.cmake new file mode 100644 index 0000000000..3bc456ac2a --- /dev/null +++ b/src/Draw/TKTopTest/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKTopTest +set(OCCT_TKTopTest_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKTopTest_GTests_FILES +) diff --git a/src/Draw/TKViewerTest/GTests/FILES.cmake b/src/Draw/TKViewerTest/GTests/FILES.cmake new file mode 100644 index 0000000000..c03d59403c --- /dev/null +++ b/src/Draw/TKViewerTest/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKViewerTest +set(OCCT_TKViewerTest_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKViewerTest_GTests_FILES +) diff --git a/src/Draw/TKXDEDRAW/GTests/FILES.cmake b/src/Draw/TKXDEDRAW/GTests/FILES.cmake new file mode 100644 index 0000000000..41df1fee7e --- /dev/null +++ b/src/Draw/TKXDEDRAW/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXDEDRAW +set(OCCT_TKXDEDRAW_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXDEDRAW_GTests_FILES +) diff --git a/src/Draw/TKXSDRAW/GTests/FILES.cmake b/src/Draw/TKXSDRAW/GTests/FILES.cmake new file mode 100644 index 0000000000..929c6551cc --- /dev/null +++ b/src/Draw/TKXSDRAW/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXSDRAW +set(OCCT_TKXSDRAW_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXSDRAW_GTests_FILES +) diff --git a/src/Draw/TKXSDRAWDE/GTests/FILES.cmake b/src/Draw/TKXSDRAWDE/GTests/FILES.cmake new file mode 100644 index 0000000000..10bca69a3e --- /dev/null +++ b/src/Draw/TKXSDRAWDE/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXSDRAWDE +set(OCCT_TKXSDRAWDE_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXSDRAWDE_GTests_FILES +) diff --git a/src/Draw/TKXSDRAWGLTF/GTests/FILES.cmake b/src/Draw/TKXSDRAWGLTF/GTests/FILES.cmake new file mode 100644 index 0000000000..b436b16e41 --- /dev/null +++ b/src/Draw/TKXSDRAWGLTF/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXSDRAWGLTF +set(OCCT_TKXSDRAWGLTF_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXSDRAWGLTF_GTests_FILES +) diff --git a/src/Draw/TKXSDRAWIGES/GTests/FILES.cmake b/src/Draw/TKXSDRAWIGES/GTests/FILES.cmake new file mode 100644 index 0000000000..e2b2c56e5f --- /dev/null +++ b/src/Draw/TKXSDRAWIGES/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXSDRAWIGES +set(OCCT_TKXSDRAWIGES_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXSDRAWIGES_GTests_FILES +) diff --git a/src/Draw/TKXSDRAWOBJ/GTests/FILES.cmake b/src/Draw/TKXSDRAWOBJ/GTests/FILES.cmake new file mode 100644 index 0000000000..d73feac8ab --- /dev/null +++ b/src/Draw/TKXSDRAWOBJ/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXSDRAWOBJ +set(OCCT_TKXSDRAWOBJ_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXSDRAWOBJ_GTests_FILES +) diff --git a/src/Draw/TKXSDRAWPLY/GTests/FILES.cmake b/src/Draw/TKXSDRAWPLY/GTests/FILES.cmake new file mode 100644 index 0000000000..54a8775aae --- /dev/null +++ b/src/Draw/TKXSDRAWPLY/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXSDRAWPLY +set(OCCT_TKXSDRAWPLY_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXSDRAWPLY_GTests_FILES +) diff --git a/src/Draw/TKXSDRAWSTEP/GTests/FILES.cmake b/src/Draw/TKXSDRAWSTEP/GTests/FILES.cmake new file mode 100644 index 0000000000..046bff1efa --- /dev/null +++ b/src/Draw/TKXSDRAWSTEP/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXSDRAWSTEP +set(OCCT_TKXSDRAWSTEP_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXSDRAWSTEP_GTests_FILES +) diff --git a/src/Draw/TKXSDRAWSTL/GTests/FILES.cmake b/src/Draw/TKXSDRAWSTL/GTests/FILES.cmake new file mode 100644 index 0000000000..792e78e076 --- /dev/null +++ b/src/Draw/TKXSDRAWSTL/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXSDRAWSTL +set(OCCT_TKXSDRAWSTL_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXSDRAWSTL_GTests_FILES +) diff --git a/src/Draw/TKXSDRAWVRML/GTests/FILES.cmake b/src/Draw/TKXSDRAWVRML/GTests/FILES.cmake new file mode 100644 index 0000000000..d430008b80 --- /dev/null +++ b/src/Draw/TKXSDRAWVRML/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXSDRAWVRML +set(OCCT_TKXSDRAWVRML_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXSDRAWVRML_GTests_FILES +) diff --git a/src/FoundationClasses/TKMath/GTests/FILES.cmake b/src/FoundationClasses/TKMath/GTests/FILES.cmake new file mode 100644 index 0000000000..b9743de69d --- /dev/null +++ b/src/FoundationClasses/TKMath/GTests/FILES.cmake @@ -0,0 +1,6 @@ +# Test source files for TKMath +set(OCCT_TKMath_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKMath_GTests_FILES + PLib_JacobiPolynomial_Test.cxx +) diff --git a/src/FoundationClasses/TKMath/GTests/PLib_JacobiPolynomial_Test.cxx b/src/FoundationClasses/TKMath/GTests/PLib_JacobiPolynomial_Test.cxx new file mode 100644 index 0000000000..2ad1209355 --- /dev/null +++ b/src/FoundationClasses/TKMath/GTests/PLib_JacobiPolynomial_Test.cxx @@ -0,0 +1,169 @@ +// Copyright (c) 2025 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include +#include +#include + +#include + +TEST(PLib_JacobiPolynomialTest, ConstructorAndAccessors) +{ + // Test with GeomAbs_C0 + PLib_JacobiPolynomial aJacobi1(10, GeomAbs_C0); + EXPECT_EQ(10, aJacobi1.WorkDegree()); + EXPECT_EQ(0, aJacobi1.NivConstr()); + + // Test with GeomAbs_C1 + PLib_JacobiPolynomial aJacobi2(20, GeomAbs_C1); + EXPECT_EQ(20, aJacobi2.WorkDegree()); + EXPECT_EQ(1, aJacobi2.NivConstr()); + + // Test with GeomAbs_C2 + PLib_JacobiPolynomial aJacobi3(30, GeomAbs_C2); + EXPECT_EQ(30, aJacobi3.WorkDegree()); + EXPECT_EQ(2, aJacobi3.NivConstr()); +} + +TEST(PLib_JacobiPolynomialTest, Weights) +{ + PLib_JacobiPolynomial aJacobi(20, GeomAbs_C1); + + // Test with 10 Gauss points + Standard_Integer nPoints = 10; + Standard_Integer nDegree = 20; + TColStd_Array2OfReal aWeights(0, nPoints / 2, 0, nDegree); + aJacobi.Weights(nPoints, aWeights); + + // Weights should be positive + for (Standard_Integer i = 0; i <= nPoints / 2; i++) + { + for (Standard_Integer j = 0; j <= nDegree; j++) + { + // We don't check exact values, but they should be defined + EXPECT_FALSE(std::isnan(aWeights(i, j))); + } + } +} + +TEST(PLib_JacobiPolynomialTest, MaxValue) +{ + PLib_JacobiPolynomial aJacobi(15, GeomAbs_C0); + Standard_Integer q = aJacobi.WorkDegree() - 2 * (aJacobi.NivConstr() + 1); + + TColStd_Array1OfReal aTabMax(0, q); + aJacobi.MaxValue(aTabMax); + + // The maximum values should be positive + for (Standard_Integer i = 0; i <= q; i++) + { + EXPECT_GT(aTabMax(i), 0.0); + } +} + +TEST(PLib_JacobiPolynomialTest, D0) +{ + PLib_JacobiPolynomial aJacobi(10, GeomAbs_C0); + Standard_Integer q = aJacobi.WorkDegree() - 2 * (aJacobi.NivConstr() + 1); + + TColStd_Array1OfReal aBasisValue(0, q); + + // Test at u = 0 + aJacobi.D0(0.0, aBasisValue); + + // Test at u = 0.5 + aJacobi.D0(0.5, aBasisValue); + + // Test at u = 1.0 + aJacobi.D0(1.0, aBasisValue); + + // We don't check exact values here, just that the method executes without issues + EXPECT_TRUE(true); +} + +TEST(PLib_JacobiPolynomialTest, D1) +{ + PLib_JacobiPolynomial aJacobi(12, GeomAbs_C1); + Standard_Integer q = aJacobi.WorkDegree() - 2 * (aJacobi.NivConstr() + 1); + + TColStd_Array1OfReal aBasisValue(0, q); + TColStd_Array1OfReal aBasisD1(0, q); + + // Test at u = 0.5 + aJacobi.D1(0.5, aBasisValue, aBasisD1); + + // We don't check exact values here, just that the method executes without issues + EXPECT_TRUE(true); +} + +TEST(PLib_JacobiPolynomialTest, D2) +{ + PLib_JacobiPolynomial aJacobi(14, GeomAbs_C2); + Standard_Integer q = aJacobi.WorkDegree() - 2 * (aJacobi.NivConstr() + 1); + + TColStd_Array1OfReal aBasisValue(0, q); + TColStd_Array1OfReal aBasisD1(0, q); + TColStd_Array1OfReal aBasisD2(0, q); + + // Test at u = 0.5 + aJacobi.D2(0.5, aBasisValue, aBasisD1, aBasisD2); + + // We don't check exact values here, just that the method executes without issues + EXPECT_TRUE(true); +} + +TEST(PLib_JacobiPolynomialTest, D3) +{ + PLib_JacobiPolynomial aJacobi(16, GeomAbs_C2); + Standard_Integer q = aJacobi.WorkDegree() - 2 * (aJacobi.NivConstr() + 1); + + TColStd_Array1OfReal aBasisValue(0, q); + TColStd_Array1OfReal aBasisD1(0, q); + TColStd_Array1OfReal aBasisD2(0, q); + TColStd_Array1OfReal aBasisD3(0, q); + + // Test at u = 0.5 + aJacobi.D3(0.5, aBasisValue, aBasisD1, aBasisD2, aBasisD3); + + // We don't check exact values here, just that the method executes without issues + EXPECT_TRUE(true); +} + +TEST(PLib_JacobiPolynomialTest, ReduceDegree) +{ + PLib_JacobiPolynomial aJacobi(20, GeomAbs_C1); + Standard_Integer dimension = 3; + Standard_Integer maxDegree = 15; + Standard_Real tolerance = 1.0e-3; + + // Create sample JacCoeff array with increasing values + TColStd_Array1OfReal aJacCoeff(1, dimension * (maxDegree + 1)); + for (Standard_Integer i = 1; i <= dimension * (maxDegree + 1); i++) + { + aJacCoeff(i) = 0.1 * i; + } + + // Initialize output variables + Standard_Integer newDegree = 0; + Standard_Real maxError = 0.0; + + // Test the reduce degree functionality + aJacobi + .ReduceDegree(dimension, maxDegree, tolerance, aJacCoeff.ChangeValue(1), newDegree, maxError); + + // New degree should be less than or equal to maxDegree + EXPECT_LE(newDegree, maxDegree); + + // Max error should be defined + EXPECT_FALSE(std::isnan(maxError)); +} diff --git a/src/FoundationClasses/TKernel/GTests/FILES.cmake b/src/FoundationClasses/TKernel/GTests/FILES.cmake new file mode 100644 index 0000000000..c8e80d1d99 --- /dev/null +++ b/src/FoundationClasses/TKernel/GTests/FILES.cmake @@ -0,0 +1,7 @@ +# Test source files for TKernel +set(OCCT_TKernel_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKernel_GTests_FILES + TCollection_AsciiString_Test.cxx + TCollection_ExtendedString_Test.cxx +) diff --git a/src/FoundationClasses/TKernel/GTests/TCollection_AsciiString_Test.cxx b/src/FoundationClasses/TKernel/GTests/TCollection_AsciiString_Test.cxx new file mode 100644 index 0000000000..7249dd9ff6 --- /dev/null +++ b/src/FoundationClasses/TKernel/GTests/TCollection_AsciiString_Test.cxx @@ -0,0 +1,233 @@ +// Copyright (c) 2025 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include + +TEST(TCollection_AsciiStringTest, DefaultConstructor) +{ + TCollection_AsciiString aString; + EXPECT_EQ(0, aString.Length()); + EXPECT_TRUE(aString.IsEmpty()); +} + +TEST(TCollection_AsciiStringTest, ConstructorWithCString) +{ + TCollection_AsciiString aString("Test String"); + EXPECT_EQ(11, aString.Length()); + EXPECT_FALSE(aString.IsEmpty()); + EXPECT_STREQ("Test String", aString.ToCString()); +} + +TEST(TCollection_AsciiStringTest, ConstructorWithChar) +{ + TCollection_AsciiString aString('A'); + EXPECT_EQ(1, aString.Length()); + EXPECT_FALSE(aString.IsEmpty()); + EXPECT_STREQ("A", aString.ToCString()); +} + +TEST(TCollection_AsciiStringTest, CopyConstructor) +{ + TCollection_AsciiString aString1("Original"); + TCollection_AsciiString aString2(aString1); + EXPECT_STREQ(aString1.ToCString(), aString2.ToCString()); + EXPECT_EQ(aString1.Length(), aString2.Length()); +} + +TEST(TCollection_AsciiStringTest, AssignmentOperator) +{ + TCollection_AsciiString aString1("First"); + TCollection_AsciiString aString2; + aString2 = aString1; + EXPECT_STREQ(aString1.ToCString(), aString2.ToCString()); + + // Change original to verify deep copy + aString1 = "Changed"; + EXPECT_STRNE(aString1.ToCString(), aString2.ToCString()); + EXPECT_STREQ("First", aString2.ToCString()); +} + +TEST(TCollection_AsciiStringTest, Concatenation) +{ + TCollection_AsciiString aString1("Hello"); + TCollection_AsciiString aString2(" World"); + TCollection_AsciiString aString3 = aString1 + aString2; + EXPECT_STREQ("Hello World", aString3.ToCString()); + + // Using += operator + aString1 += aString2; + EXPECT_STREQ("Hello World", aString1.ToCString()); + + // Concatenate with char + aString1 += '!'; + EXPECT_STREQ("Hello World!", aString1.ToCString()); + + // Concatenate with C string + aString1 += " Test"; + EXPECT_STREQ("Hello World! Test", aString1.ToCString()); +} + +TEST(TCollection_AsciiStringTest, SubString) +{ + TCollection_AsciiString aString("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + TCollection_AsciiString subString = aString.SubString(3, 8); + EXPECT_STREQ("CDEFGH", subString.ToCString()); +} + +TEST(TCollection_AsciiStringTest, ChangeCase) +{ + TCollection_AsciiString aString("Hello World"); + + // Test to upper case + TCollection_AsciiString upperString = aString; + upperString.UpperCase(); + EXPECT_STREQ("HELLO WORLD", upperString.ToCString()); + + // Test to lower case + TCollection_AsciiString lowerString = aString; + lowerString.LowerCase(); + EXPECT_STREQ("hello world", lowerString.ToCString()); + + // Test capitalize + TCollection_AsciiString capitalizeString = lowerString; + capitalizeString.Capitalize(); + EXPECT_STREQ("Hello world", capitalizeString.ToCString()); +} + +TEST(TCollection_AsciiStringTest, SearchAndLocation) +{ + TCollection_AsciiString aString("This is a test string for testing search functions"); + + // Test Search + EXPECT_EQ(11, aString.Search("test")); + EXPECT_EQ(-1, aString.Search("nonexistent")); + + // Test SearchFromEnd + EXPECT_EQ(27, aString.SearchFromEnd("test")); + + // Test Location + EXPECT_EQ(3, aString.Location(TCollection_AsciiString("i"), 1, aString.Length())); + EXPECT_EQ(6, aString.Location(TCollection_AsciiString("i"), 4, aString.Length())); +} + +TEST(TCollection_AsciiStringTest, RemoveAndInsert) +{ + TCollection_AsciiString aString("Hello World"); + + // Test Remove + aString.Remove(6, 6); + EXPECT_STREQ("Hello", aString.ToCString()); + + // Test Insert + aString.Insert(6, " Universe"); + EXPECT_STREQ("Hello Universe", aString.ToCString()); + + // Test RemoveAll + aString.RemoveAll('e'); + EXPECT_STREQ("Hllo Univrs", aString.ToCString()); +} + +TEST(TCollection_AsciiStringTest, Comparison) +{ + TCollection_AsciiString aString1("Test"); + TCollection_AsciiString aString2("Test"); + TCollection_AsciiString aString3("Different"); + + EXPECT_TRUE(aString1.IsEqual(aString2)); + EXPECT_TRUE(aString1 == aString2); + EXPECT_FALSE(aString1.IsDifferent(aString2)); + EXPECT_FALSE(aString1 != aString2); + + EXPECT_FALSE(aString1.IsEqual(aString3)); + EXPECT_FALSE(aString1 == aString3); + EXPECT_TRUE(aString1.IsDifferent(aString3)); + EXPECT_TRUE(aString1 != aString3); + + // Testing with C strings + EXPECT_TRUE(aString1.IsEqual("Test")); + EXPECT_TRUE(aString1 == "Test"); + EXPECT_FALSE(aString1.IsEqual("Different")); + EXPECT_FALSE(aString1 == "Different"); + + // Test IsLess and IsGreater + TCollection_AsciiString aStringA("A"); + TCollection_AsciiString aStringZ("Z"); + + EXPECT_TRUE(aStringA.IsLess(aStringZ)); + EXPECT_TRUE(aStringA < aStringZ); + EXPECT_FALSE(aStringA.IsGreater(aStringZ)); + EXPECT_FALSE(aStringA > aStringZ); + + EXPECT_TRUE(aStringZ.IsGreater(aStringA)); + EXPECT_TRUE(aStringZ > aStringA); + EXPECT_FALSE(aStringZ.IsLess(aStringA)); + EXPECT_FALSE(aStringZ < aStringA); +} + +TEST(TCollection_AsciiStringTest, Token) +{ + TCollection_AsciiString aString("This is a test string"); + + EXPECT_STREQ("This", aString.Token().ToCString()); + EXPECT_STREQ("is", aString.Token(" ", 2).ToCString()); + EXPECT_STREQ("a", aString.Token(" ", 3).ToCString()); + EXPECT_STREQ("test", aString.Token(" ", 4).ToCString()); + EXPECT_STREQ("string", aString.Token(" ", 5).ToCString()); + EXPECT_STREQ("", aString.Token(" ", 6).ToCString()); // No 6th token + + // Test with different separators + TCollection_AsciiString aStringWithSeps("one,two;three:four"); + EXPECT_STREQ("one", aStringWithSeps.Token(",;:", 1).ToCString()); + EXPECT_STREQ("two", aStringWithSeps.Token(",;:", 2).ToCString()); + EXPECT_STREQ("three", aStringWithSeps.Token(",;:", 3).ToCString()); + EXPECT_STREQ("four", aStringWithSeps.Token(",;:", 4).ToCString()); +} + +TEST(TCollection_AsciiStringTest, ValueConversion) +{ + // Test integer conversion + TCollection_AsciiString intString("12345"); + EXPECT_EQ(12345, intString.IntegerValue()); + EXPECT_TRUE(intString.IsIntegerValue()); + + // Test real value conversion + TCollection_AsciiString realString("123.456"); + EXPECT_DOUBLE_EQ(123.456, realString.RealValue()); + EXPECT_TRUE(realString.IsRealValue()); + + // Test invalid conversions + TCollection_AsciiString invalidString("not a number"); + EXPECT_FALSE(invalidString.IsIntegerValue()); + EXPECT_FALSE(invalidString.IsRealValue()); +} + +TEST(TCollection_AsciiStringTest, HashCode) +{ + TCollection_AsciiString aString1("Test"); + TCollection_AsciiString aString2("Test"); + TCollection_AsciiString aString3("Different"); + + EXPECT_EQ(aString1.HashCode(), aString2.HashCode()); + EXPECT_NE(aString1.HashCode(), aString3.HashCode()); +} + +TEST(TCollection_AsciiStringTest, Split) +{ + TCollection_AsciiString aString("abcdefghij"); + TCollection_AsciiString remainder = aString.Split(5); + + EXPECT_STREQ("abcde", aString.ToCString()); + EXPECT_STREQ("fghij", remainder.ToCString()); +} diff --git a/src/FoundationClasses/TKernel/GTests/TCollection_ExtendedString_Test.cxx b/src/FoundationClasses/TKernel/GTests/TCollection_ExtendedString_Test.cxx new file mode 100644 index 0000000000..dda82b4ac7 --- /dev/null +++ b/src/FoundationClasses/TKernel/GTests/TCollection_ExtendedString_Test.cxx @@ -0,0 +1,203 @@ +// Copyright (c) 2025 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include +#include + +#include + +TEST(TCollection_ExtendedStringTest, DefaultConstructor) +{ + TCollection_ExtendedString aString; + EXPECT_EQ(0, aString.Length()); + EXPECT_TRUE(aString.IsEmpty()); +} + +TEST(TCollection_ExtendedStringTest, ConstructorWithCString) +{ + TCollection_ExtendedString aString("Test String"); + EXPECT_EQ(11, aString.Length()); + EXPECT_FALSE(aString.IsEmpty()); +} + +TEST(TCollection_ExtendedStringTest, ConstructorWithChar) +{ + TCollection_ExtendedString aString('A'); + EXPECT_EQ(1, aString.Length()); + EXPECT_FALSE(aString.IsEmpty()); +} + +TEST(TCollection_ExtendedStringTest, ConstructorWithAsciiString) +{ + TCollection_AsciiString asciiString("ASCII Test"); + TCollection_ExtendedString extendedString(asciiString); + EXPECT_EQ(asciiString.Length(), extendedString.Length()); +} + +TEST(TCollection_ExtendedStringTest, CopyConstructor) +{ + TCollection_ExtendedString aString1("Original"); + TCollection_ExtendedString aString2(aString1); + EXPECT_EQ(aString1.Length(), aString2.Length()); + EXPECT_TRUE(aString1.IsEqual(aString2)); +} + +TEST(TCollection_ExtendedStringTest, AssignmentOperator) +{ + TCollection_ExtendedString aString1("First"); + TCollection_ExtendedString aString2; + aString2 = aString1; + EXPECT_TRUE(aString1.IsEqual(aString2)); + + // Change original to verify deep copy + aString1 = TCollection_ExtendedString("Changed"); + EXPECT_FALSE(aString1.IsEqual(aString2)); +} + +TEST(TCollection_ExtendedStringTest, Concatenation) +{ + TCollection_ExtendedString aString1("Hello"); + TCollection_ExtendedString aString2(" World"); + TCollection_ExtendedString aString3 = aString1 + aString2; + EXPECT_EQ(11, aString3.Length()); + + // Convert to AsciiString for comparison + TCollection_AsciiString asciiResult(aString3); + EXPECT_STREQ("Hello World", asciiResult.ToCString()); + + // Using += operator + aString1 += aString2; + EXPECT_TRUE(aString1.IsEqual(aString3)); +} + +TEST(TCollection_ExtendedStringTest, ConversionToFromAscii) +{ + // ASCII to Extended + TCollection_AsciiString asciiString("Test String"); + TCollection_ExtendedString extendedString(asciiString); + + // Extended back to ASCII + TCollection_AsciiString convertedBack(extendedString); + + EXPECT_STREQ(asciiString.ToCString(), convertedBack.ToCString()); +} + +TEST(TCollection_ExtendedStringTest, Comparison) +{ + TCollection_ExtendedString aString1("Test"); + TCollection_ExtendedString aString2("Test"); + TCollection_ExtendedString aString3("Different"); + + EXPECT_TRUE(aString1.IsEqual(aString2)); + EXPECT_TRUE(aString1 == aString2); + EXPECT_FALSE(aString1.IsDifferent(aString2)); + EXPECT_FALSE(aString1 != aString2); + + EXPECT_FALSE(aString1.IsEqual(aString3)); + EXPECT_FALSE(aString1 == aString3); + EXPECT_TRUE(aString1.IsDifferent(aString3)); + EXPECT_TRUE(aString1 != aString3); + + // Test IsLess and IsGreater + TCollection_ExtendedString aStringA("A"); + TCollection_ExtendedString aStringZ("Z"); + + EXPECT_TRUE(aStringA.IsLess(aStringZ)); + EXPECT_TRUE(aStringA < aStringZ); + EXPECT_FALSE(aStringA.IsGreater(aStringZ)); + EXPECT_FALSE(aStringA > aStringZ); + + EXPECT_TRUE(aStringZ.IsGreater(aStringA)); + EXPECT_TRUE(aStringZ > aStringA); + EXPECT_FALSE(aStringZ.IsLess(aStringA)); + EXPECT_FALSE(aStringZ < aStringA); +} + +TEST(TCollection_ExtendedStringTest, UnicodeSupport) +{ + // Test with unicode characters + const Standard_ExtCharacter unicodeChars[] = {0x0041, 0x00A9, 0x2122, 0x20AC, 0}; // A, ©, ™, € + TCollection_ExtendedString unicodeString(unicodeChars); + + EXPECT_EQ(4, unicodeString.Length()); + EXPECT_EQ(0x0041, unicodeString.Value(1)); // A + EXPECT_EQ(0x00A9, unicodeString.Value(2)); // © + EXPECT_EQ(0x2122, unicodeString.Value(3)); // ™ + EXPECT_EQ(0x20AC, unicodeString.Value(4)); // € +} + +TEST(TCollection_ExtendedStringTest, HashCode) +{ + TCollection_ExtendedString aString1("Test"); + TCollection_ExtendedString aString2("Test"); + TCollection_ExtendedString aString3("Different"); + + EXPECT_EQ(aString1.HashCode(), aString2.HashCode()); + EXPECT_NE(aString1.HashCode(), aString3.HashCode()); +} + +TEST(TCollection_ExtendedStringTest, Remove) +{ + TCollection_ExtendedString aString("Hello World"); + aString.Remove(6, 6); // Remove "World" + + TCollection_AsciiString asciiResult(aString); + EXPECT_STREQ("Hello", asciiResult.ToCString()); +} + +TEST(TCollection_ExtendedStringTest, ToExtString) +{ + TCollection_ExtendedString aString("Test String"); + Standard_ExtString extString = aString.ToExtString(); + + // Check first few characters + EXPECT_EQ('T', extString[0]); + EXPECT_EQ('e', extString[1]); + EXPECT_EQ('s', extString[2]); + EXPECT_EQ('t', extString[3]); +} + +TEST(TCollection_ExtendedStringTest, IsAscii) +{ + TCollection_ExtendedString asciiString("Simple ASCII"); + EXPECT_TRUE(asciiString.IsAscii()); + + // Create a string with non-ASCII character + Standard_ExtCharacter unicodeChars[] = {'A', 0x20AC, 0}; // A, € + TCollection_ExtendedString unicodeString(unicodeChars); + EXPECT_FALSE(unicodeString.IsAscii()); +} + +TEST(TCollection_ExtendedStringTest, Cat) +{ + TCollection_ExtendedString aString("Hello"); + + // Cat with ExtendedString + TCollection_ExtendedString result1 = aString.Cat(TCollection_ExtendedString(" World")); + TCollection_AsciiString asciiResult1(result1); + EXPECT_STREQ("Hello World", asciiResult1.ToCString()); + + // Cat with character + TCollection_ExtendedString result2 = aString.Cat('!'); + TCollection_AsciiString asciiResult2(result2); + EXPECT_STREQ("Hello!", asciiResult2.ToCString()); +} + +TEST(TCollection_ExtendedStringTest, ChangeAll) +{ + TCollection_ExtendedString aString("Helloo Woorld"); + aString.ChangeAll('o', 'X'); + + TCollection_AsciiString asciiResult(aString); + EXPECT_STREQ("HellXX WXXrld", asciiResult.ToCString()); +} diff --git a/src/ModelingAlgorithms/TKBO/GTests/FILES.cmake b/src/ModelingAlgorithms/TKBO/GTests/FILES.cmake new file mode 100644 index 0000000000..ed1394a3e1 --- /dev/null +++ b/src/ModelingAlgorithms/TKBO/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKBO +set(OCCT_TKBO_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKBO_GTests_FILES +) diff --git a/src/ModelingAlgorithms/TKBool/GTests/FILES.cmake b/src/ModelingAlgorithms/TKBool/GTests/FILES.cmake new file mode 100644 index 0000000000..342aad2fe3 --- /dev/null +++ b/src/ModelingAlgorithms/TKBool/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKBool +set(OCCT_TKBool_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKBool_GTests_FILES +) diff --git a/src/ModelingAlgorithms/TKExpress/GTests/FILES.cmake b/src/ModelingAlgorithms/TKExpress/GTests/FILES.cmake new file mode 100644 index 0000000000..bb3305112c --- /dev/null +++ b/src/ModelingAlgorithms/TKExpress/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKExpress +set(OCCT_TKExpress_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKExpress_GTests_FILES +) diff --git a/src/ModelingAlgorithms/TKFeat/GTests/FILES.cmake b/src/ModelingAlgorithms/TKFeat/GTests/FILES.cmake new file mode 100644 index 0000000000..4831ee12fd --- /dev/null +++ b/src/ModelingAlgorithms/TKFeat/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKFeat +set(OCCT_TKFeat_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKFeat_GTests_FILES +) diff --git a/src/ModelingAlgorithms/TKFillet/GTests/FILES.cmake b/src/ModelingAlgorithms/TKFillet/GTests/FILES.cmake new file mode 100644 index 0000000000..6ccc5c50ad --- /dev/null +++ b/src/ModelingAlgorithms/TKFillet/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKFillet +set(OCCT_TKFillet_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKFillet_GTests_FILES +) diff --git a/src/ModelingAlgorithms/TKGeomAlgo/GTests/FILES.cmake b/src/ModelingAlgorithms/TKGeomAlgo/GTests/FILES.cmake new file mode 100644 index 0000000000..35c1a08a11 --- /dev/null +++ b/src/ModelingAlgorithms/TKGeomAlgo/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKGeomAlgo +set(OCCT_TKGeomAlgo_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKGeomAlgo_GTests_FILES +) diff --git a/src/ModelingAlgorithms/TKHLR/GTests/FILES.cmake b/src/ModelingAlgorithms/TKHLR/GTests/FILES.cmake new file mode 100644 index 0000000000..d3e9cc2ed2 --- /dev/null +++ b/src/ModelingAlgorithms/TKHLR/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKHLR +set(OCCT_TKHLR_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKHLR_GTests_FILES +) diff --git a/src/ModelingAlgorithms/TKMesh/GTests/FILES.cmake b/src/ModelingAlgorithms/TKMesh/GTests/FILES.cmake new file mode 100644 index 0000000000..5cae3edf4c --- /dev/null +++ b/src/ModelingAlgorithms/TKMesh/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKMesh +set(OCCT_TKMesh_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKMesh_GTests_FILES +) diff --git a/src/ModelingAlgorithms/TKOffset/GTests/FILES.cmake b/src/ModelingAlgorithms/TKOffset/GTests/FILES.cmake new file mode 100644 index 0000000000..9051fe7cd0 --- /dev/null +++ b/src/ModelingAlgorithms/TKOffset/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKOffset +set(OCCT_TKOffset_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKOffset_GTests_FILES +) diff --git a/src/ModelingAlgorithms/TKPrim/GTests/FILES.cmake b/src/ModelingAlgorithms/TKPrim/GTests/FILES.cmake new file mode 100644 index 0000000000..ef84f81c93 --- /dev/null +++ b/src/ModelingAlgorithms/TKPrim/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKPrim +set(OCCT_TKPrim_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKPrim_GTests_FILES +) diff --git a/src/ModelingAlgorithms/TKShHealing/GTests/FILES.cmake b/src/ModelingAlgorithms/TKShHealing/GTests/FILES.cmake new file mode 100644 index 0000000000..8c15769379 --- /dev/null +++ b/src/ModelingAlgorithms/TKShHealing/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKShHealing +set(OCCT_TKShHealing_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKShHealing_GTests_FILES +) diff --git a/src/ModelingAlgorithms/TKTopAlgo/GTests/FILES.cmake b/src/ModelingAlgorithms/TKTopAlgo/GTests/FILES.cmake new file mode 100644 index 0000000000..93a2650622 --- /dev/null +++ b/src/ModelingAlgorithms/TKTopAlgo/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKTopAlgo +set(OCCT_TKTopAlgo_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKTopAlgo_GTests_FILES +) diff --git a/src/ModelingAlgorithms/TKXMesh/GTests/FILES.cmake b/src/ModelingAlgorithms/TKXMesh/GTests/FILES.cmake new file mode 100644 index 0000000000..92dbf05bcc --- /dev/null +++ b/src/ModelingAlgorithms/TKXMesh/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKXMesh +set(OCCT_TKXMesh_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKXMesh_GTests_FILES +) diff --git a/src/ModelingData/TKBRep/GTests/FILES.cmake b/src/ModelingData/TKBRep/GTests/FILES.cmake new file mode 100644 index 0000000000..276ac996a7 --- /dev/null +++ b/src/ModelingData/TKBRep/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKBRep +set(OCCT_TKBRep_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKBRep_GTests_FILES +) diff --git a/src/ModelingData/TKG2d/GTests/FILES.cmake b/src/ModelingData/TKG2d/GTests/FILES.cmake new file mode 100644 index 0000000000..4dba436cee --- /dev/null +++ b/src/ModelingData/TKG2d/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKG2d +set(OCCT_TKG2d_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKG2d_GTests_FILES +) diff --git a/src/ModelingData/TKG3d/GTests/FILES.cmake b/src/ModelingData/TKG3d/GTests/FILES.cmake new file mode 100644 index 0000000000..28f2c9555d --- /dev/null +++ b/src/ModelingData/TKG3d/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKG3d +set(OCCT_TKG3d_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKG3d_GTests_FILES +) diff --git a/src/ModelingData/TKGeomBase/GTests/FILES.cmake b/src/ModelingData/TKGeomBase/GTests/FILES.cmake new file mode 100644 index 0000000000..2e91e956c8 --- /dev/null +++ b/src/ModelingData/TKGeomBase/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKGeomBase +set(OCCT_TKGeomBase_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKGeomBase_GTests_FILES +) diff --git a/src/Visualization/TKD3DHost/GTests/FILES.cmake b/src/Visualization/TKD3DHost/GTests/FILES.cmake new file mode 100644 index 0000000000..c102c8a9cf --- /dev/null +++ b/src/Visualization/TKD3DHost/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKD3DHost +set(OCCT_TKD3DHost_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKD3DHost_GTests_FILES +) diff --git a/src/Visualization/TKIVtk/GTests/FILES.cmake b/src/Visualization/TKIVtk/GTests/FILES.cmake new file mode 100644 index 0000000000..d7f1db4b57 --- /dev/null +++ b/src/Visualization/TKIVtk/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKIVtk +set(OCCT_TKIVtk_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKIVtk_GTests_FILES +) diff --git a/src/Visualization/TKMeshVS/GTests/FILES.cmake b/src/Visualization/TKMeshVS/GTests/FILES.cmake new file mode 100644 index 0000000000..df0c4fd2be --- /dev/null +++ b/src/Visualization/TKMeshVS/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKMeshVS +set(OCCT_TKMeshVS_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKMeshVS_GTests_FILES +) diff --git a/src/Visualization/TKOpenGl/GTests/FILES.cmake b/src/Visualization/TKOpenGl/GTests/FILES.cmake new file mode 100644 index 0000000000..f0517f9f92 --- /dev/null +++ b/src/Visualization/TKOpenGl/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKOpenGl +set(OCCT_TKOpenGl_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKOpenGl_GTests_FILES +) diff --git a/src/Visualization/TKOpenGles/GTests/FILES.cmake b/src/Visualization/TKOpenGles/GTests/FILES.cmake new file mode 100644 index 0000000000..a124e540bd --- /dev/null +++ b/src/Visualization/TKOpenGles/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKOpenGles +set(OCCT_TKOpenGles_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKOpenGles_GTests_FILES +) diff --git a/src/Visualization/TKService/GTests/FILES.cmake b/src/Visualization/TKService/GTests/FILES.cmake new file mode 100644 index 0000000000..ebcb404a79 --- /dev/null +++ b/src/Visualization/TKService/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKService +set(OCCT_TKService_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKService_GTests_FILES +) diff --git a/src/Visualization/TKV3d/GTests/FILES.cmake b/src/Visualization/TKV3d/GTests/FILES.cmake new file mode 100644 index 0000000000..afdb096c5f --- /dev/null +++ b/src/Visualization/TKV3d/GTests/FILES.cmake @@ -0,0 +1,5 @@ +# Test source files for TKV3d +set(OCCT_TKV3d_GTests_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + +set(OCCT_TKV3d_GTests_FILES +)