Merge pull request #596 from tbeu/update-cpp-cmake

Add test specific CMake options to C++ configuration
This commit is contained in:
Emily Bache 2025-02-16 05:57:30 +00:00 committed by GitHub
commit 71261052fa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 127 additions and 313 deletions

View File

@ -1,4 +0,0 @@
/build_meson/
/subprojects/Catch2-*/
/subprojects/packagecache/
/cmake-build-*/

View File

@ -1,54 +0,0 @@
cmake_minimum_required(VERSION 3.14..3.16)
set(CMAKE_VERBOSE_MAKEFILE ON)
project(GildedRoseKata VERSION 1.0
DESCRIPTION "The GildedRose Refactoring kata for an approval testing approach"
LANGUAGES CXX)
include(FetchContent)
FetchContent_Declare(
catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
GIT_TAG v2.13.10
)
FetchContent_MakeAvailable(catch2)
LIST(APPEND CMAKE_MODULE_PATH
${catch2_SOURCE_DIR}/contrib
)
FetchContent_Declare(
approvaltests_ho
URL https://github.com/approvals/ApprovalTests.cpp/releases/download/v.10.13.0/ApprovalTests.v.10.13.0.hpp
DOWNLOAD_NO_EXTRACT TRUE
DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/approvaltests
DOWNLOAD_NAME ApprovalTests.v.10.13.0.hpp
)
FetchContent_GetProperties(approvaltests_ho)
if (NOT approvaltests_ho_POPULATED)
FetchContent_Populate(approvaltests_ho)
endif ()
add_library(approvaltests INTERFACE)
target_include_directories(approvaltests
INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/approvaltests
INTERFACE ${catch2_SOURCE_DIR}/single_include/catch2
)
if( MINGW )
# https://stackoverflow.com/questions/31890021/mingw-too-many-sections-bug-while-compiling-huge-header-file-in-qt
set (CMAKE_CXX_FLAGS "-Wa,-mbig-obj ")
endif()
add_executable(gildedrose_catch2
src/GildedRose.h
src/GildedRose.cc
test/gildedrose_catch.cpp
test/main.cpp)
set_target_properties(gildedrose_catch2 PROPERTIES CXX_STANDARD 11)
target_include_directories(gildedrose_catch2
PUBLIC src)
target_link_libraries(gildedrose_catch2 Catch2::Catch2 approvaltests)
include(CTest)
include(ParseAndAddCatchTests)
ParseAndAddCatchTests(gildedrose_catch2)

View File

@ -1,21 +0,0 @@
C++ version of Gilded Rose with Catch 2 and Approvals
======================================================
This is a C++ start of the Gilded Rose Refactoring Kata. See
the [top level readme](https://github.com/emilybache/GildedRose-Refactoring-Kata)
for a general description of the exercise.
There are two (failing) unit tests included here. One uses only the catch2 framework, the other additionally uses [ApprovalTests](https://github.com/approvals/approvaltests.cpp). You should choose one of these tests to work with and delete the other.
CMake
-----
CMake is included in CLion from JetBrains. Without CMake files
CLion has a hard time to handle c-projects.
To install CMake (if you don't use CLion) on macOS using brew
brew install cmake
Tested on CMake 3.15.3 (included with CLion 2019.3) on macOS

View File

@ -1,80 +0,0 @@
#include "GildedRose.h"
GildedRose::GildedRose(vector<Item> & items) : items(items)
{}
void GildedRose::updateQuality()
{
for (int i = 0; i < items.size(); i++)
{
if (items[i].name != "Aged Brie" && items[i].name != "Backstage passes to a TAFKAL80ETC concert")
{
if (items[i].quality > 0)
{
if (items[i].name != "Sulfuras, Hand of Ragnaros")
{
items[i].quality = items[i].quality - 1;
}
}
}
else
{
if (items[i].quality < 50)
{
items[i].quality = items[i].quality + 1;
if (items[i].name == "Backstage passes to a TAFKAL80ETC concert")
{
if (items[i].sellIn < 11)
{
if (items[i].quality < 50)
{
items[i].quality = items[i].quality + 1;
}
}
if (items[i].sellIn < 6)
{
if (items[i].quality < 50)
{
items[i].quality = items[i].quality + 1;
}
}
}
}
}
if (items[i].name != "Sulfuras, Hand of Ragnaros")
{
items[i].sellIn = items[i].sellIn - 1;
}
if (items[i].sellIn < 0)
{
if (items[i].name != "Aged Brie")
{
if (items[i].name != "Backstage passes to a TAFKAL80ETC concert")
{
if (items[i].quality > 0)
{
if (items[i].name != "Sulfuras, Hand of Ragnaros")
{
items[i].quality = items[i].quality - 1;
}
}
}
else
{
items[i].quality = items[i].quality - items[i].quality;
}
}
else
{
if (items[i].quality < 50)
{
items[i].quality = items[i].quality + 1;
}
}
}
}
}

View File

@ -1,24 +0,0 @@
#include <string>
#include <vector>
using namespace std;
class Item
{
public:
string name;
int sellIn;
int quality;
Item(string name, int sellIn, int quality) : name(name), sellIn(sellIn), quality(quality)
{}
};
class GildedRose
{
public:
vector<Item> & items;
GildedRose(vector<Item> & items);
void updateQuality();
};

View File

@ -1 +0,0 @@
#include "ApprovalTests.v.10.13.0.hpp"

View File

@ -1,32 +0,0 @@
#include <catch2/catch.hpp>
#include "ApprovalTests.hpp"
#include "GildedRose.h"
std::ostream& operator<<(std::ostream& os, const Item& obj)
{
return os
<< "name: " << obj.name
<< ", sellIn: " << obj.sellIn
<< ", quality: " << obj.quality;
}
// This is a normal unit test using Catch2
TEST_CASE("UpdateQuality") {
vector<Item> items;
items.push_back(Item("foo", 0, 0));
GildedRose app(items);
app.updateQuality();
REQUIRE("fixme" == app.items[0].name);
}
// This is an Approval test using https://github.com/approvals/approvaltests.cpp
TEST_CASE("UpdateQualityApprovalTest") {
vector<Item> items;
items.push_back(Item("foo", 0, 0));
GildedRose app(items);
app.updateQuality();
auto item = app.items[0];
ApprovalTests::Approvals::verify(item);
}

View File

@ -1,5 +0,0 @@
#define CATCH_CONFIG_MAIN
#define APPROVALS_CATCH
#include "catch2/catch.hpp"
#include "ApprovalTests.hpp"

View File

@ -6,6 +6,14 @@ set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# uncomment this line to enable coverage measurements using gcov # uncomment this line to enable coverage measurements using gcov
# set(CMAKE_CXX_FLAGS "--coverage") # set(CMAKE_CXX_FLAGS "--coverage")
option(BUILD_APPROVAL_TESTS_WITH_GTEST "Use GoogleTest for approval testing" ON)
option(BUILD_UNIT_TESTS_WITH_GTEST "Use GoogleTest for unit testing" ON)
option(BUILD_APPROVAL_TESTS_WITH_CATCH2 "Use Catch2 for approval testing" ON)
option(BUILD_UNIT_TESTS_WITH_CATCH2 "Use Catch2 for unit testing" ON)
enable_testing() enable_testing()
add_subdirectory(src) add_subdirectory(src)
add_subdirectory(test) add_subdirectory(test)

View File

@ -7,14 +7,14 @@ The C++ version of the Gilded Rose refactoring kata is available in four variant
1. Traditional unit test with the [Catch2](https://github.com/catchorg/Catch2) test framework in the `test/cpp_catch2_unittest` folder. 1. Traditional unit test with the [Catch2](https://github.com/catchorg/Catch2) test framework in the `test/cpp_catch2_unittest` folder.
2. [Approval tests](https://github.com/approvals/ApprovalTests.cpp) with the [Catch2](https://github.com/catchorg/Catch2) test framework in the `test/cpp_catch2_approvaltest` folder. 2. [Approval tests](https://github.com/approvals/ApprovalTests.cpp) with the [Catch2](https://github.com/catchorg/Catch2) test framework in the `test/cpp_catch2_approvaltest` folder.
* GoogleTest framework * GoogleTest framework
1. Traditional unit test with the [Googletest](https://github.com/google/googletest) test framework in the `test/cpp_googletest_unittest` folder. 1. Traditional unit test with the [GoogleTest](https://github.com/google/googletest) test framework in the `test/cpp_googletest_unittest` folder.
2. [Approval tests](https://github.com/approvals/ApprovalTests.cpp) with the [Googletest](https://github.com/google/googletest) test framework in the `test/cpp_googletest_approvaltest` folder. 2. [Approval tests](https://github.com/approvals/ApprovalTests.cpp) with the [GoogleTest](https://github.com/google/googletest) test framework in the `test/cpp_googletest_approvaltest` folder.
The `GildedRose.cc` file, i.e. the code under test, is identical in all four variants. The `GildedRose.cc` file, i.e. the code under test, is identical in all four variants.
## Prerequisites ## Prerequisites
* CMake version >= 3.13 * CMake version &GreaterEqual; 3.13
* C++ compiler that supports C++14 * C++ compiler that supports C++14
## How to build and run tests in a terminal ## How to build and run tests in a terminal
@ -27,6 +27,19 @@ The `GildedRose.cc` file, i.e. the code under test, is identical in all four var
$ cmake .. $ cmake ..
$ cmake --build . $ cmake --build .
The following test specific options for building with CMake are available.
* `BUILD_APPROVAL_TESTS_WITH_CATCH2:BOOL=ON`
This option builds the approval tests with the Catch2 test framework.
* `BUILD_UNIT_TESTS_WITH_CATCH2:BOOL=ON`
This option builds the unit tests with the Catch2 test framework.
* `BUILD_APPROVAL_TESTS_WITH_GTEST:BOOL=ON`
This option builds the approval tests with the GoogleTest test framework.
* `BUILD_UNIT_TESTS_WITH_GTEST:BOOL=ON`
This option builds the unit tests with the GoogleTest test framework.
For example, run the CMake configuration `cmake -DBUILD_APPROVAL_TESTS_WITH_CATCH2=OFF -DBUILD_UNIT_TESTS_WITH_CATCH2=OFF ..` to disable the Catch2 based tests.
### Show available tests ### Show available tests
$ cd ${GIT_FOLDER}/GildedRose-Refactoring-Kata/cpp/build $ cd ${GIT_FOLDER}/GildedRose-Refactoring-Kata/cpp/build
@ -55,12 +68,12 @@ The `GildedRose.cc` file, i.e. the code under test, is identical in all four var
2. Select menu `File - Open...` 2. Select menu `File - Open...`
3. Select folder `${GIT_FOLDER}/GildedRose-Refactoring-Kata/cpp` 3. Select folder `${GIT_FOLDER}/GildedRose-Refactoring-Kata/cpp`
4. Select menu `Build - Build Project` 4. Select menu `Build - Build Project`
4. Select menu `Run - Run...` 5. Select menu `Run - Run...`
4. Select what test variant to run, e.g. `GildedRoseCatch2ApprovalTests`. 6. Select what test variant to run, e.g. `GildedRoseCatch2ApprovalTests`.
## How to build and run tests using Visual Studio 2019 ## How to build and run tests using Visual Studio &GreaterEqual; 2019
1. Start Visual Studio 2019 1. Start Visual Studio
2. Select `Open a local folder` 2. Select `Open a local folder`
3. Select folder `${GIT_FOLDER}/GildedRose-Refactoring-Kata/cpp` 3. Select folder `${GIT_FOLDER}/GildedRose-Refactoring-Kata/cpp`
4. Wait for message `CMake generation finished.` in the CMake output window at the bottom 4. Wait for message `CMake generation finished.` in the CMake output window at the bottom

View File

@ -1,21 +1,26 @@
include(FetchContent) include(FetchContent)
if (BUILD_APPROVAL_TESTS_WITH_GTEST OR BUILD_UNIT_TESTS_WITH_GTEST)
FetchContent_Declare( FetchContent_Declare(
googletest googletest
GIT_REPOSITORY https://github.com/google/googletest.git GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG v1.16.0 GIT_TAG v1.16.0
GIT_SHALLOW TRUE GIT_SHALLOW TRUE
) )
FetchContent_MakeAvailable(googletest)
endif()
if (BUILD_APPROVAL_TESTS_WITH_CATCH2 OR BUILD_UNIT_TESTS_WITH_CATCH2)
FetchContent_Declare( FetchContent_Declare(
catch2 catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2.git GIT_REPOSITORY https://github.com/catchorg/Catch2.git
GIT_TAG v3.8.0 GIT_TAG v3.8.0
GIT_SHALLOW TRUE GIT_SHALLOW TRUE
) )
FetchContent_MakeAvailable(catch2)
endif()
FetchContent_MakeAvailable(googletest catch2) if (BUILD_APPROVAL_TESTS_WITH_GTEST OR BUILD_UNIT_TESTS_WITH_GTEST)
# Force Google Test to link the C/C++ runtimes dynamically # Force Google Test to link the C/C++ runtimes dynamically
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
@ -24,6 +29,7 @@ set(BUILD_GMOCK OFF CACHE BOOL "" FORCE)
# Do not install GTest # Do not install GTest
set(INSTALL_GTEST OFF CACHE BOOL "" FORCE) set(INSTALL_GTEST OFF CACHE BOOL "" FORCE)
endif()
add_subdirectory(cpp_catch2_approvaltest) add_subdirectory(cpp_catch2_approvaltest)
add_subdirectory(cpp_catch2_unittest) add_subdirectory(cpp_catch2_unittest)

View File

@ -1,3 +1,4 @@
if (BUILD_APPROVAL_TESTS_WITH_CATCH2)
set(TEST_NAME GildedRoseCatch2ApprovalTests) set(TEST_NAME GildedRoseCatch2ApprovalTests)
add_executable(${TEST_NAME}) add_executable(${TEST_NAME})
target_sources(${TEST_NAME} PRIVATE GildedRoseCatch2ApprovalTests.cc) target_sources(${TEST_NAME} PRIVATE GildedRoseCatch2ApprovalTests.cc)
@ -18,3 +19,4 @@ add_test(
if (MSVC) if (MSVC)
target_compile_options(${TEST_NAME} PRIVATE "/FC") target_compile_options(${TEST_NAME} PRIVATE "/FC")
endif() endif()
endif()

View File

@ -1,3 +1,4 @@
if (BUILD_UNIT_TESTS_WITH_CATCH2)
set(TEST_NAME GildedRoseCatch2UnitTests) set(TEST_NAME GildedRoseCatch2UnitTests)
add_executable(${TEST_NAME}) add_executable(${TEST_NAME})
target_sources(${TEST_NAME} PRIVATE GildedRoseCatch2UnitTests.cc) target_sources(${TEST_NAME} PRIVATE GildedRoseCatch2UnitTests.cc)
@ -17,3 +18,4 @@ add_test(
if (MSVC) if (MSVC)
target_compile_options(${TEST_NAME} PRIVATE "/FC") target_compile_options(${TEST_NAME} PRIVATE "/FC")
endif() endif()
endif()

View File

@ -1,3 +1,4 @@
if (BUILD_APPROVAL_TESTS_WITH_GTEST)
set(TEST_NAME GildedRoseGoogletestApprovalTests) set(TEST_NAME GildedRoseGoogletestApprovalTests)
add_executable(${TEST_NAME}) add_executable(${TEST_NAME})
target_sources(${TEST_NAME} PRIVATE GildedRoseGoogletestApprovalTests.cc) target_sources(${TEST_NAME} PRIVATE GildedRoseGoogletestApprovalTests.cc)
@ -18,3 +19,4 @@ add_test(
if (MSVC) if (MSVC)
target_compile_options(${TEST_NAME} PRIVATE "/FC") target_compile_options(${TEST_NAME} PRIVATE "/FC")
endif() endif()
endif()

View File

@ -1,3 +1,4 @@
if (BUILD_UNIT_TESTS_WITH_GTEST)
set(TEST_NAME GildedRoseGoogletestUnitTests) set(TEST_NAME GildedRoseGoogletestUnitTests)
add_executable(${TEST_NAME}) add_executable(${TEST_NAME})
target_sources(${TEST_NAME} PRIVATE GildedRoseGoogletestUnitTests.cc) target_sources(${TEST_NAME} PRIVATE GildedRoseGoogletestUnitTests.cc)
@ -17,3 +18,4 @@ add_test(
if (MSVC) if (MSVC)
target_compile_options(${TEST_NAME} PRIVATE "/FC") target_compile_options(${TEST_NAME} PRIVATE "/FC")
endif() endif()
endif()