Skip to content

QtTest driver v2 #142

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 16 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
language: cpp
os:
- osx
- linux
sudo: required
dist: trusty
Expand All @@ -13,14 +12,19 @@ env:
- GMOCK_PATH=/usr/src/gmock #1.6.0 from ubuntu trusty repo
matrix:
exclude:
- os: osx
env: GMOCK_PATH=/usr/src/gmock
- os: osx
compiler: gcc #does anyone on osx use it?
- os: linux
compiler: gcc
env: GMOCK_VER=1.8.0
include:
- os: linux
compiler: gcc
env: GMOCK_VER=1.8.0 VALGRIND_TESTS=ON
- os: osx
compiler: clang
env: GMOCK_VER=1.8.0 QTDIR=/usr/local/Cellar/qt5/5.8.0_1
- os: osx
compiler: clang
env: GMOCK_VER=1.7.0

addons:
apt:
Expand All @@ -35,9 +39,10 @@ addons:
- google-mock
- ninja-build
- valgrind
- qtbase5-dev

before_install:
- if [[ "${TRAVIS_OS_NAME}" = "osx" ]]; then brew update && brew install ninja; fi
- if [[ "${TRAVIS_OS_NAME}" = "osx" ]]; then brew update && brew install ninja qt5; fi

script: ./travis.sh

Expand Down
55 changes: 42 additions & 13 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
cmake_minimum_required(VERSION 2.8.12)
cmake_minimum_required(VERSION 3.1)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, I think we already needed 3.1 anyway (for both find_dependency() and Threads::Threads).


project(Cucumber-Cpp)

set(CUKE_USE_STATIC_BOOST ${WIN32} CACHE BOOL "Statically link Boost (except boost::test)")
set(CUKE_USE_STATIC_GTEST ON CACHE BOOL "Statically link Google Test")

set(CUKE_DISABLE_BOOST_TEST OFF CACHE BOOL "Disable boost:test")
set(CUKE_DISABLE_GTEST OFF CACHE BOOL "Disable Google Test framework")
set(CUKE_DISABLE_UNIT_TESTS OFF CACHE BOOL "Disable unit tests")
set(CUKE_DISABLE_E2E_TESTS OFF CACHE BOOL "Disable end-to-end tests")
set(CUKE_ENABLE_EXAMPLES OFF CACHE BOOL "Enable the examples")
option(CUKE_USE_STATIC_BOOST "Statically link Boost (except boost::test)" ${WIN32})
option(CUKE_USE_STATIC_GTEST "Statically link Google Test" ON)
option(CUKE_DISABLE_BOOST_TEST "Disable boost:test" OFF)
option(CUKE_DISABLE_GTEST "Disable Google Test framework" OFF)
option(CUKE_DISABLE_UNIT_TESTS "Disable unit tests" OFF)
option(CUKE_DISABLE_E2E_TESTS "Disable end-to-end tests" OFF)
option(CUKE_ENABLE_EXAMPLES "Enable the examples" OFF)
option(VALGRIND_TESTS "Run tests within Valgrind" OFF)
option(CUKE_DISABLE_QT "Disable using Qt framework" OFF)
set(GMOCK_SRC_DIR "" CACHE STRING "Google Mock framework sources path (otherwise downloaded)")
set(GMOCK_VER "1.7.0" CACHE STRING "Google Mock framework version to be used")
option(VALGRIND_TESTS "Run tests within Valgrind" OFF)

set(ignoreMe "${QT_QMAKE_EXECUTABLE}") #supress warning
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/modules)

#
Expand Down Expand Up @@ -103,6 +104,36 @@ if(NOT CUKE_DISABLE_GTEST)
endif()
endif()

#
# Qt
#

if(NOT CUKE_DISABLE_QT)
set(CMAKE_PREFIX_PATH $ENV{QTDIR})
find_package(Qt5Core)
find_package(Qt5Widgets)
find_package(Qt5Test)

if(${Qt5Core_FOUND} AND ${Qt5Widgets_FOUND} AND ${Qt5Test_FOUND})
set(QT5_FOUND true)
message(STATUS "Found Qt version: ${Qt5Core_VERSION_STRING}")
if (Qt5_POSITION_INDEPENDENT_CODE)
SET(CMAKE_POSITION_INDEPENDENT_CODE ON)
endif()
set(QT_LIBRARIES Qt5::Core Qt5::Widgets Qt5::Test)
if(NOT ${Qt5Core_VERSION_STRING} VERSION_LESS 5.7)
message(STATUS "C++11 is needed from Qt version 5.7.0, building with c++11 enabled")
set(CMAKE_CXX_STANDARD 11)
endif()
else()
find_package(Qt4 COMPONENTS QtCore QtGui QtTest)
if(QT4_FOUND)
set(QT_LIBRARIES Qt4::QtCore Qt4::QtGui Qt4::QtTest)
include(${QT_USE_FILE})
endif()
endif()
endif()

#
# Valgrind
#
Expand Down Expand Up @@ -154,11 +185,8 @@ endif()
#

set(CUKE_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)

include_directories(${CUKE_INCLUDE_DIR})

set(CUKE_LIBRARIES cucumber-cpp ${CUKE_EXTRA_LIBRARIES})

add_subdirectory(src)

#
Expand Down Expand Up @@ -223,3 +251,4 @@ endif()
if(CUKE_ENABLE_EXAMPLES)
add_subdirectory(examples)
endif()

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ with [CPP].

It relies on a few executables:

* [cmake](https://cmake.org/download/) 2.8.12 or later.
* [cmake](https://cmake.org/download/) 3.1 or later.
Required to setup environment and build software

It relies on a few libraries:
Expand Down
20 changes: 20 additions & 0 deletions appveyor.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
set PATH=C:\Ruby200\bin;%BOOST_LIBRARYDIR%;%PATH%
if defined MINGW_ROOT set PATH=%MINGW_ROOT%\bin;C:\msys64\usr\bin\;%PATH%
if defined QT_DIR set PATH=%QT_DIR%\bin;%PATH%
if "%CMAKE_GENERATOR%"=="NMake Makefiles" call "%VS140COMNTOOLS%\..\..\VC\vcvarsall.bat" %PLATFORM%
echo %PATH%

git submodule init
git submodule update
call gem install bundle
call bundle install
if defined MINGW_ARCH bash -lc "pacman --needed --noconfirm -S mingw-w64-%MINGW_ARCH%-boost

cmake -E make_directory build
cmake -E chdir build cmake -G "%CMAKE_GENERATOR%" -DCUKE_ENABLE_EXAMPLES=on -DBOOST_ROOT="%BOOST_ROOT%" -DBOOST_INCLUDEDIR="%BOOST_INCLUDEDIR%" -DBOOST_LIBRARYDIR="%BOOST_LIBRARYDIR%" -DQT_QMAKE_EXECUTABLE="%QT_DIR%/bin/qmake.exe" ..
cmake --build build

set CTEST_OUTPUT_ON_FAILURE=ON
cmake --build build --target test
cmake --build build --target features

40 changes: 8 additions & 32 deletions appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,59 +2,35 @@ version: "{branch}-ci-{build}"
os: Visual Studio 2015

environment:
RUBY_VERSION: 200
matrix:
- build: mingw
platform: x86
- CMAKE_GENERATOR: 'MSYS Makefiles'
MINGW_ARCH: i686
MSYSTEM: MINGW32
MINGW_ROOT: C:\msys64\mingw32
BOOST_ROOT: C:\msys64\mingw32
BOOST_LIBRARYDIR: C:\msys64\mingw32\lib
BOOST_INCLUDEDIR: C:\msys64\mingw32\include\boost
CMAKE_GENERATOR: 'MSYS Makefiles'
- build: mingw
platform: x64
QT_DIR: C:\Qt\5.8\mingw53_32
- CMAKE_GENERATOR: 'MSYS Makefiles'
MINGW_ARCH: x86_64
MSYSTEM: MINGW64
MINGW_ROOT: C:\msys64\mingw64
BOOST_ROOT: C:\msys64\mingw64
BOOST_LIBRARYDIR: C:\msys64\mingw64\lib
BOOST_INCLUDEDIR: C:\msys64\mingw64\include\boost
CMAKE_GENERATOR: 'MSYS Makefiles'
- build: msvc
- CMAKE_GENERATOR: 'NMake Makefiles'
platform: x86
BOOST_ROOT: C:\Libraries\boost_1_59_0
BOOST_LIBRARYDIR: C:\Libraries\boost_1_59_0\lib32-msvc-14.0
BOOST_INCLUDEDIR: C:\Libraries\boost_1_59_0\boost
CMAKE_GENERATOR: 'NMake Makefiles'
- build: msvc
QT_DIR: C:\Qt\5.6\msvc2015
- CMAKE_GENERATOR: 'NMake Makefiles'
platform: x64
BOOST_ROOT: C:\Libraries\boost_1_59_0
BOOST_INCLUDEDIR: C:\Libraries\boost_1_59_0\boost
BOOST_LIBRARYDIR: C:\Libraries\boost_1_59_0\lib64-msvc-14.0
CMAKE_GENERATOR: 'NMake Makefiles'

install:
- git submodule init
- git submodule update
- set PATH=C:\Ruby%RUBY_VERSION%\bin;%BOOST_LIBRARYDIR%;%PATH%
- gem install bundle
- bundle install
- bundle env
- if "%build%"=="mingw" set PATH=%MINGW_ROOT%\bin;C:\msys64\usr\bin\;%PATH%
- if "%build%"=="mingw" bash -lc "pacman --needed --noconfirm -S mingw-w64-%MINGW_ARCH%-boost
QT_DIR: C:\Qt\5.8\msvc2015_64

build_script:
- cmd: if "%build%"=="msvc" call "%VS140COMNTOOLS%\..\..\VC\vcvarsall.bat" %PLATFORM%
- cmd: cmake -E make_directory build
- cmd: cmake -E chdir build cmake -G "%CMAKE_GENERATOR%" -DCUKE_ENABLE_EXAMPLES=ON -DBOOST_ROOT="%BOOST_ROOT%" -DBOOST_INCLUDEDIR="%BOOST_INCLUDEDIR%" -DBOOST_LIBRARYDIR="%BOOST_LIBRARYDIR%" ..
- cmd: cmake --build build

test_script:
- cmd: set CTEST_OUTPUT_ON_FAILURE=ON
- cmd: cmake --build build --target test
- cmd: cmake --build build --target features
- cmd: call appveyor.bat

notifications:
- provider: Email
Expand Down
5 changes: 5 additions & 0 deletions examples/Calc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,8 @@ if(Boost_UNIT_TEST_FRAMEWORK_FOUND)
add_executable(BoostCalculatorSteps features/step_definitions/BoostCalculatorSteps)
target_link_libraries(BoostCalculatorSteps Calc ${CUKE_LIBRARIES} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
endif()

if(QT5_FOUND)
add_executable(QtTestCalculatorSteps features/step_definitions/QtTestCalculatorSteps)
target_link_libraries(QtTestCalculatorSteps Calc ${QT_LIBRARIES} ${CUKE_LIBRARIES})
endif()
38 changes: 38 additions & 0 deletions examples/Calc/features/step_definitions/QtTestCalculatorSteps.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#include <QTest>
#include <cucumber-cpp/autodetect.hpp>

#include "Calculator.h"

using cucumber::ScenarioScope;

struct CalcCtx {
Calculator calc;
double result;
};

GIVEN("^I have entered (\\d+) into the calculator$") {
REGEX_PARAM(double, n);
ScenarioScope<CalcCtx> context;

context->calc.push(n);
}

WHEN("^I press add") {
ScenarioScope<CalcCtx> context;

context->result = context->calc.add();
}

WHEN("^I press divide") {
ScenarioScope<CalcCtx> context;

context->result = context->calc.divide();
}

THEN("^the result should be (.*) on the screen$") {
REGEX_PARAM(double, expected);
ScenarioScope<CalcCtx> context;

QCOMPARE(context->result, expected);
}

36 changes: 11 additions & 25 deletions examples/CalcQt/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,36 +1,22 @@
project(CalcQt)

set(CALCQT_HEADERS src/CalculatorWidget.h)
set(CALCQT_SOURCES src/CalcQt.cpp src/CalculatorWidget.cpp)
include_directories(${CUKE_INCLUDE_DIRS} src)
include_directories(src)

find_package(Qt5Core QUIET)
find_package(Qt5Widgets QUIET)
find_package(Qt5Test QUIET)

if(${Qt5Core_FOUND} AND ${Qt5Widgets_FOUND} AND ${Qt5Test_FOUND})
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(QT_LIBRARIES Qt5::Core Qt5::Widgets Qt5::Test)

add_library(libcalcqt src/CalculatorWidget.cpp ${CALCQT_HEADERS})
if(QT_LIBRARIES)
if(QT4_FOUND)
qt4_wrap_cpp(CALCQT_MOC ${CALCQT_HEADERS})
else()
qt5_wrap_cpp(CALCQT_MOC ${CALCQT_HEADERS})
add_executable(QtTestCalculatorQtSteps features/step_definitions/QtTestCalculatorQtSteps)
target_link_libraries(QtTestCalculatorQtSteps libcalcqt ${QT_LIBRARIES} ${CUKE_LIBRARIES})
endif()
add_library(libcalcqt src/CalculatorWidget.cpp ${CALCQT_MOC})
target_link_libraries(libcalcqt ${QT_LIBRARIES})

add_executable(calcqt ${CALCQT_SOURCES})
add_executable(calcqt src/CalcQt.cpp)
target_link_libraries(calcqt libcalcqt ${QT_LIBRARIES})
else()
find_package(Qt4 COMPONENTS QtCore QtGui QtTest)
if(QT4_FOUND)
include(${QT_USE_FILE})
qt4_wrap_cpp(CALCQT_HEADERS_MOC ${CALCQT_HEADERS})
add_library(libcalcqt src/CalculatorWidget ${CALCQT_HEADERS_MOC})

add_executable(calcqt ${CALCQT_SOURCES} ${CALCQT_HEADERS_MOC})
target_link_libraries(calcqt ${QT_LIBRARIES})
endif()
endif()

if(QT_LIBRARIES)
if(Boost_UNIT_TEST_FRAMEWORK_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(BoostCalculatorQtSteps features/step_definitions/BoostCalculatorQtSteps)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
#include <QTest>
#include "cucumber-cpp/autodetect.hpp"
#include <cstdlib>
#include <QApplication>
#include "CalculatorWidget.h"

std::istream& operator>> (std::istream& in, QString& val) { std::string s; in >> s; val = QString::fromLocal8Bit(s.c_str()); return in; }
std::ostream& operator<< (std::ostream& out, const QString& val) { out << val.toLocal8Bit().data(); return out; }

static int argc = 0;
static QApplication app(argc, 0);
static int milliseconds = -1;

int millisecondsToWait() {
if (milliseconds < 0)
{
char* envVariable = getenv("CALCQT_STEP_DELAY");
milliseconds = (envVariable) ? atoi(envVariable) : 0;
}
return milliseconds;
}

AFTER_STEP(){
QTest::qWait(millisecondsToWait());
}

GIVEN("^I just turned on the calculator$") {
cucumber::ScenarioScope<CalculatorWidget> calculator;
calculator->move(0, 0);
calculator->show();
#if QT_VERSION >= 0x050000
QTest::qWaitForWindowExposed(calculator.get());
#else
QTest::qWaitForWindowShown(calculator.get());
#endif
}

WHEN("^I press (\\d+)$") {
REGEX_PARAM(unsigned int, n);
cucumber::ScenarioScope<CalculatorWidget> calculator;
QTest::keyClick(calculator.get(), Qt::Key_0 + n, Qt::NoModifier, 0);
}

WHEN("^I press add") {
cucumber::ScenarioScope<CalculatorWidget> calculator;
QTest::keyClick(calculator.get(), Qt::Key_Plus, Qt::NoModifier, 0);
}

WHEN("^I press calculate") {
cucumber::ScenarioScope<CalculatorWidget> calculator;
QTest::keyClick(calculator.get(), Qt::Key_Return, Qt::NoModifier, 0);
}

WHEN("^I press clear") {
cucumber::ScenarioScope<CalculatorWidget> calculator;
QTest::keyClick(calculator.get(), Qt::Key_Escape, Qt::NoModifier, 0);
}

WHEN("^I press subtract") {
cucumber::ScenarioScope<CalculatorWidget> calculator;
QTest::keyClick(calculator.get(), Qt::Key_Minus, Qt::NoModifier, 0);
}

THEN("^the display should be empty$") {
cucumber::ScenarioScope<CalculatorWidget> calculator;
QCOMPARE(calculator->display().size(), 0);
}

THEN("^the display should show (.*)$") {
REGEX_PARAM(QString, expected);
cucumber::ScenarioScope<CalculatorWidget> calculator;
QCOMPARE(calculator->display(), expected);
}
Loading