diff --git a/CMakeLists.txt b/CMakeLists.txt index cc983531..a24d44b4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,7 +98,7 @@ endif() # if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_INIT} -Werror -Wall -Wextra -Wsuggest-override ${CMAKE_CXX_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_INIT} -Wall -Wextra -Wsuggest-override ${CMAKE_CXX_FLAGS}") # TODO: A better fix should handle ld's --as-needed flag if(UNIX AND NOT APPLE) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Xlinker '--no-as-needed'") @@ -165,15 +165,12 @@ if(CUKE_ENABLE_QT_5) message(STATUS "Found Qt version: ${Qt5Core_VERSION_STRING}") if(Qt5Core_VERSION_STRING VERSION_LESS 5.15.0) - add_library(Qt::Core INTERFACE IMPORTED) - add_library(Qt::Gui INTERFACE IMPORTED) - add_library(Qt::Widgets INTERFACE IMPORTED) - add_library(Qt::Test INTERFACE IMPORTED) - set_target_properties(Qt::Core PROPERTIES INTERFACE_LINK_LIBRARIES Qt5::Core ) - set_target_properties(Qt::Gui PROPERTIES INTERFACE_LINK_LIBRARIES Qt5::Gui ) - set_target_properties(Qt::Widgets PROPERTIES INTERFACE_LINK_LIBRARIES Qt5::Widgets) - set_target_properties(Qt::Test PROPERTIES INTERFACE_LINK_LIBRARIES Qt5::Test ) + add_library( Qt::Core ALIAS Qt5::Core) + add_library( Qt::Gui ALIAS Qt5::Gui) + add_library( Qt::Widgets ALIAS Qt5::Widgets) + add_library( Qt::Test ALIAS Qt5::Test) endif() + set( CUKE_QT_RUNTIME_PATH $ ) endif() if(CUKE_ENABLE_QT_6) @@ -185,6 +182,7 @@ if(CUKE_ENABLE_QT_6) ) message(STATUS "Found Qt version: ${Qt6Core_VERSION}") + set( CUKE_QT_RUNTIME_PATH $ ) endif() diff --git a/run-windows.ps1 b/run-windows.ps1 index 3adbc3cf..199a19eb 100755 --- a/run-windows.ps1 +++ b/run-windows.ps1 @@ -49,10 +49,10 @@ $cmake_params = "-E chdir build cmake", $cmake_params += "-DCMAKE_CXX_STANDARD=${cpp_standard}" $cmake_params += "-DCUKE_ENABLE_BOOST_TEST=OFF" -$cmake_params += "-DCUKE_ENABLE_GTEST=OFF" -$cmake_params += "-DCUKE_ENABLE_QT_6=OFF" -$cmake_params += "-DCUKE_ENABLE_EXAMPLES=OFF" -$cmake_params += "-DCUKE_TESTS_UNIT=OFF" +$cmake_params += "-DCUKE_ENABLE_GTEST=ON" +$cmake_params += "-DCUKE_ENABLE_QT_6=ON" +$cmake_params += "-DCUKE_ENABLE_EXAMPLES=ON" +$cmake_params += "-DCUKE_TESTS_UNIT=ON" $cmake_params += "-DCUKE_CODE_COVERAGE=OFF" $cmake_params += "-Dnlohmann_json_DIR=${nlohmann_json_DIR}" @@ -61,6 +61,44 @@ $cmake_params += "-DTCLAP_ROOT=${TCLAP_ROOT}" $cmake_params += ".." - Invoke-CMake "$cmake_params" -Invoke-CMake "--build","build" #,"--parallel" +Invoke-CMake "--build","build","--config","Release" #,"--parallel" +Invoke-CMake "--build","build","--config","Release","--target","RUN_TESTS" + +# +# Execute Calc examples +# + +$CalcTests = @("build\examples\Calc\Release\GTestCalculatorSteps.exe", +"build\examples\Calc\Release\BoostCalculatorSteps.exe", +"build\examples\Calc\Release\FuncArgsCalculatorSteps.exe", +"build\examples\Calc\Release\QtTestCalculatorSteps.exe") + +For ($i=0; $i -lt $CalcTests.Length; $i++) { + Write-Host "Start Test $($CalcTests[$i])" -f Green + Start-Process -NoNewWindow $CalcTests[$i] + Start-Sleep -Seconds 1.0 + Set-Location -Path 'examples/Calc' + Start-Process cucumber -NoNewWindow -Wait + set-Location -Path $PSScriptRoot +} +# +# Execute QtCalc examples +# + +$QtCalcTests = @("build\examples\CalcQt\Release\GTestCalculatorQtSteps.exe", +"build\examples\CalcQt\Release\QtTestCalculatorQtSteps.exe", +"build\examples\CalcQt\Release\BoostCalculatorQtSteps.exe") + +For ($i=0; $i -lt $QtCalcTests.Length; $i++) { + Write-Host "Start Test $($QtCalcTests[$i])" -f Green + Start-Process -NoNewWindow $QtCalcTests[$i] + Start-Sleep -Seconds 1.0 + Set-Location -Path 'examples/CalcQt' + Start-Process cucumber -NoNewWindow -Wait + set-Location -Path $PSScriptRoot +} + +Invoke-CMake "--build","build","--config","Release","--target","INSTALL" + + diff --git a/src/drivers/QtTestDriver.cpp b/src/drivers/QtTestDriver.cpp index 95b46f78..d702b1fe 100644 --- a/src/drivers/QtTestDriver.cpp +++ b/src/drivers/QtTestDriver.cpp @@ -4,28 +4,81 @@ #include #include +#include + namespace cucumber { namespace internal { +// wraps the QTemporaryFile creation +// on Windows the file could not be written as long as QTemporaryFile owner of the file. + +class TemporaryFileWrapper { +public: + static TemporaryFileWrapper create() { + QTemporaryFile tempFile(QString("%1/%2_%3") + .arg( + QDir::tempPath(), + qApp->applicationName().isEmpty() ? "qt_temp" + : qApp->applicationName() + ) + .arg(qApp->applicationPid())); + + if (!tempFile.open()) { + return {}; + } + + return {tempFile.fileName() + ".txt"}; + } + + TemporaryFileWrapper() : + filename{} { + } + + TemporaryFileWrapper(QString filename) : + filename{filename} { + } + + ~TemporaryFileWrapper() { + QFile::remove(filename); + } + + bool exists() const { + return !filename.isEmpty(); + } + + QString name() const { + return filename; + } + + QString read() const { + QFile file{filename}; + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + return QString(); + QTextStream in(&file); + return in.readAll(); + } + +private: + QString filename; +}; + const InvokeResult QtTestStep::invokeStepBody() { - QTemporaryFile file; - if (!file.open()) { + const auto file = TemporaryFileWrapper::create(); + if (!file.exists()) { return InvokeResult::failure("Unable to open temporary file needed for this test"); } - file.close(); QtTestObject testObject(this); int returnValue = QTest::qExec( &testObject, QStringList() << "test" - << "-o" << file.fileName() + << "-o" << file.name() ); + if (returnValue == 0) { return InvokeResult::success(); } else { - file.open(); - QTextStream ts(&file); - return InvokeResult::failure(ts.readAll().toLocal8Bit()); + return InvokeResult::failure(file.read().toLocal8Bit()); } } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 8a66c56b..cceda78c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -11,6 +11,30 @@ target_include_directories(utils INTERFACE . ) +function(cuke_set_environment environment) + set(options) + set(oneValueArgs ) + set(multiValueArgs RUNPATH) + + cmake_parse_arguments(CUKE_ENV "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if(NOT "${CUKE_ENV_UNPARSED_ARGUMENTS}" STREQUAL "") + message( + FATAL_ERROR + "unparsed arguments in call to cuke_set_environment: ${CUKE_ENV_UNPARSED_ARGUMENTS} from ${CMAKE_CURRENT_LIST_FILE}" + ) + endif() + + if( NOT "${CUKE_ENV_RUNPATH}" STREQUAL "") + if(WIN32) + string(REPLACE ";" "\;" CUKE_ENV_RUNPATH "${CUKE_ENV_RUNPATH}") + endif() + set(RUNPATH "$,PATH,LD_LIBRARY_PATH>") + list(APPEND environment "$,PATH,LD_LIBRARY_PATH>=path_list_prepend:$") + endif() + set(${environment} ${${environment}} PARENT_SCOPE) +endfunction() + function(cuke_add_driver_test TEST_FILE) get_filename_component(TEST_NAME ${TEST_FILE} NAME) message(STATUS "Adding " ${TEST_NAME}) @@ -63,6 +87,8 @@ if((TARGET Qt::Test) AND (NOT VALGRIND_TESTS) ) cuke_add_driver_test(integration/drivers/QtTestDriverTest Qt::Test) + cuke_set_environment( QTTEST_ENVIRONMENT RUNPATH "${CUKE_QT_RUNTIME_PATH}" ) + set_tests_properties(QtTestDriverTest PROPERTIES ENVIRONMENT_MODIFICATION ${QTTEST_ENVIRONMENT}) endif() cuke_add_driver_test(integration/drivers/GenericDriverTest)