From c503bf8a2b772881184b6ddbb3cd660b1e1be2ea Mon Sep 17 00:00:00 2001 From: Anders Arnholm Date: Fri, 12 Oct 2018 19:19:50 +0200 Subject: [PATCH] Add Approval Tests for cpp * Add testcase using https://github.com/approvals/ApprovalTests.cpp and google test. * Change google test to be downloaded if not installed with cmake * Add a run-once-cmake.sh script to build and test with cmake * Add a run-approval-once.sh script to build and run approval test --- cpp/CMakeLists.txt | 67 ++++++++++++++----- cpp/GildedRoseApprovalMain.cc | 2 + ...rovalTests.VerifyCombinations.approved.txt | 2 + cpp/GildedRoseApprovalTests.cc | 28 ++++++++ cpp/run-approval-once.sh | 8 +++ cpp/run-once-cmake.sh | 8 +++ 6 files changed, 100 insertions(+), 15 deletions(-) create mode 100644 cpp/GildedRoseApprovalMain.cc create mode 100644 cpp/GildedRoseApprovalTests.VerifyCombinations.approved.txt create mode 100644 cpp/GildedRoseApprovalTests.cc create mode 100755 cpp/run-approval-once.sh create mode 100755 cpp/run-once-cmake.sh diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index e704f0c5..189e2c4b 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -6,25 +6,62 @@ project(cpp) set(CMAKE_THREAD_LIBS_INIT pthread) enable_testing() -find_package(GTest REQUIRED) +find_package(GTest) + +include(ExternalProject) +if(NOT ${GTEST_FOUND}) # Download gtest if not installed + message("No system gtest use external project") + ExternalProject_Add(googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG master + SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-src" + BINARY_DIR "${CMAKE_BINARY_DIR}/googletest-build" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" + ) + add_subdirectory(${CMAKE_BINARY_DIR}/googletest-src + ${CMAKE_BINARY_DIR}/googletest-build + EXCLUDE_FROM_ALL) + set(GTEST_BOTH_LIBRARIES gtest gtest_main) +endif() + +ExternalProject_Add(aprovaltest + PREFIX ${CMAKE_BINARY_DIR}/aprovaltest + URL https://github.com/approvals/ApprovalTests.cpp/releases/download/v.2.0.0/ApprovalTests.v.2.0.0.hpp + DOWNLOAD_NO_EXTRACT 1 + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" +) + include_directories(${GTEST_INCLUDE_DIRS}) +include_directories(${CMAKE_BINARY_DIR}/aprovaltest/src) -set(GILDED_ROSE_SOURCE_FILES +add_executable(GildedRose GildedRose.cc GildedRose.h - GildedRoseUnitTests.cc) - -set(GILDED_ROSE_TEXT_TESTS_SOURCE_FILES - GildedRose.cc - GildedRose.h - GildedRoseTextTests.cc) - -set(SOURCE_FILES - ${GILDED_ROSE_SOURCE_FILES} - ${GILDED_ROSE_TEXT_TESTS_SOURCE_FILES}) - -add_executable(GildedRose ${GILDED_ROSE_SOURCE_FILES}) + GildedRoseUnitTests.cc + ) target_link_libraries(GildedRose ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) +add_test(NAME GildedRose COMMAND GildedRose) -add_executable(GildedRoseTextTests ${GILDED_ROSE_TEXT_TESTS_SOURCE_FILES}) +add_executable(GildedRoseTextTests + GildedRose.cc + GildedRose.h + GildedRoseTextTests.cc + ) target_link_libraries(GildedRoseTextTests ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) +add_test(NAME GildedRoseTextTests COMMAND GildedRoseTextTests) + +add_executable(GildedRoseApprovalTests + GildedRose.cc + GildedRose.h + GildedRoseApprovalTests.cc + GildedRoseApprovalMain.cc + ) +target_link_libraries(GildedRoseApprovalTests ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) +set_property(TARGET GildedRoseApprovalTests PROPERTY CXX_STANDARD 14) +add_dependencies(GildedRoseApprovalTests aprovaltest) +add_test(NAME GildedRoseApprovalTests COMMAND GildedRoseApprovalTests) diff --git a/cpp/GildedRoseApprovalMain.cc b/cpp/GildedRoseApprovalMain.cc new file mode 100644 index 00000000..76a20b1e --- /dev/null +++ b/cpp/GildedRoseApprovalMain.cc @@ -0,0 +1,2 @@ +#define APPROVALS_GOOGLETEST +#include "ApprovalTests.v.2.0.0.hpp" diff --git a/cpp/GildedRoseApprovalTests.VerifyCombinations.approved.txt b/cpp/GildedRoseApprovalTests.VerifyCombinations.approved.txt new file mode 100644 index 00000000..d056cec5 --- /dev/null +++ b/cpp/GildedRoseApprovalTests.VerifyCombinations.approved.txt @@ -0,0 +1,2 @@ +(Foo, 1, 1) => name: Foo, sellIn: 0, quality: 0 + diff --git a/cpp/GildedRoseApprovalTests.cc b/cpp/GildedRoseApprovalTests.cc new file mode 100644 index 00000000..7633977a --- /dev/null +++ b/cpp/GildedRoseApprovalTests.cc @@ -0,0 +1,28 @@ +#include "ApprovalTests.v.2.0.0.hpp" +#include +#include "GildedRose.h" + +std::ostream& operator<<(std::ostream& os, const Item& obj) +{ + return os + << "name: " << obj.name + << ", sellIn: " << obj.sellIn + << ", quality: " << obj.quality; +} + +TEST(GildedRoseApprovalTests, VerifyCombinations) +{ + std::vector names { "Foo" }; + std::vector sellIns { 1 }; + std::vector qualities { 1 }; + + CombinationApprovals::verifyAllCombinations< + std::vector, std::vector, std::vector, Item>( + [](string name, int sellIn, int quality) { + vector items = {Item(name, sellIn, quality)}; + GildedRose app(items); + app.updateQuality(); + return items[0]; + }, + names, sellIns, qualities); +} diff --git a/cpp/run-approval-once.sh b/cpp/run-approval-once.sh new file mode 100755 index 00000000..47686053 --- /dev/null +++ b/cpp/run-approval-once.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +if [[ ! -d build ]]; then + mkdir -p build +fi + +cd build +cmake .. -DCMAKE_BUILD_TYPE=DEBUG && cmake --build . && ctest --output-on-failure -R GildedRoseApprovalTests diff --git a/cpp/run-once-cmake.sh b/cpp/run-once-cmake.sh new file mode 100755 index 00000000..74e2c0e0 --- /dev/null +++ b/cpp/run-once-cmake.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +if [[ ! -d build ]]; then + mkdir -p build +fi + +cd build +cmake .. -DCMAKE_BUILD_TYPE=DEBUG && cmake --build . && ctest --output-on-failure