diff --git a/CMakeLists.txt b/CMakeLists.txt index 5cd85e6c..65b794a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,7 @@ add_library(rapidcheck src/detail/Assertions.cpp src/detail/Base64.cpp src/detail/Configuration.cpp + src/detail/DefaultTestListener.cpp src/detail/FrequencyMap.cpp src/detail/ImplicitParam.cpp src/detail/LogTestListener.cpp diff --git a/src/Check.cpp b/src/Check.cpp index 5adde985..e75e5130 100644 --- a/src/Check.cpp +++ b/src/Check.cpp @@ -1,22 +1,11 @@ #include "rapidcheck/Check.h" -#include "detail/LogTestListener.h" +#include "detail/DefaultTestListener.h" #include "detail/Testing.h" namespace rc { namespace detail { -namespace { - -TestListener &defaultTestListener() { - const auto &config = configuration(); - static LogTestListener listener( - std::cerr, config.verboseProgress, config.verboseShrinking); - return listener; -} - -} // namespace - TestResult checkProperty(const Property &property, const TestMetadata &metadata, const TestParams ¶ms, @@ -27,7 +16,7 @@ TestResult checkProperty(const Property &property, TestResult checkProperty(const Property &property, const TestMetadata &metadata, const TestParams ¶ms) { - return checkProperty(property, metadata, params, defaultTestListener()); + return checkProperty(property, metadata, params, globalTestListener()); } TestResult checkProperty(const Property &property, diff --git a/src/detail/DefaultTestListener.cpp b/src/detail/DefaultTestListener.cpp new file mode 100644 index 00000000..d6259f13 --- /dev/null +++ b/src/detail/DefaultTestListener.cpp @@ -0,0 +1,21 @@ +#include "DefaultTestListener.h" + +#include "LogTestListener.h" + +namespace rc { +namespace detail { + +std::unique_ptr +makeDefaultTestListener(const Configuration &config, std::ostream &os) { + return std::unique_ptr( + new LogTestListener(os, config.verboseProgress, config.verboseShrinking)); +} + +TestListener &globalTestListener() { + static const auto listener = + makeDefaultTestListener(configuration(), std::cerr); + return *listener; +} + +} // namespace detail +} // namespace rc diff --git a/src/detail/DefaultTestListener.h b/src/detail/DefaultTestListener.h new file mode 100644 index 00000000..52e2733b --- /dev/null +++ b/src/detail/DefaultTestListener.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include "rapidcheck/detail/TestListener.h" +#include "rapidcheck/detail/Configuration.h" + +namespace rc { +namespace detail { + +/// Creates a default `TestListener`. +/// +/// @param config The configuration describing the listener. +/// @param os The output stream to print information to. +std::unique_ptr +makeDefaultTestListener(const Configuration &config, std::ostream &os); + +/// Returns the global default `TestListener`. +TestListener &globalTestListener(); + +} // namespace detail +} // namespace rc diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index f6aa2cc6..65be3818 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -25,6 +25,7 @@ add_executable(rapidcheck_tests detail/BitStreamTests.cpp detail/CaptureTests.cpp detail/ConfigurationTests.cpp + detail/DefaultTestListenerTests.cpp detail/FrequencyMapTests.cpp detail/ImplicitParamTests.cpp detail/LogTestListenerTests.cpp diff --git a/test/detail/DefaultTestListenerTests.cpp b/test/detail/DefaultTestListenerTests.cpp new file mode 100644 index 00000000..3c2e56c4 --- /dev/null +++ b/test/detail/DefaultTestListenerTests.cpp @@ -0,0 +1,49 @@ +#include + +#include "detail/DefaultTestListener.h" + +using namespace rc; +using namespace rc::detail; + +TEST_CASE("makeDefaultTestListener") { + std::ostringstream os; + + SECTION( + "should not print anything on test case finished if verboseProgress == " + "false") { + Configuration config; + config.verboseProgress = false; + const auto listener = makeDefaultTestListener(config, os); + listener->onTestCaseFinished(CaseDescription()); + REQUIRE(os.str().empty()); + } + + SECTION("should print . on test case success if verboseProgress == true") { + Configuration config; + config.verboseProgress = true; + const auto listener = makeDefaultTestListener(config, os); + CaseDescription desc; + desc.result = CaseResult(CaseResult::Type::Success); + listener->onTestCaseFinished(desc); + REQUIRE(os.str() == "."); + } + + SECTION( + "should not print anything on shrink tried if verboseShrinking == false") { + Configuration config; + config.verboseShrinking = false; + const auto listener = makeDefaultTestListener(config, os); + listener->onShrinkTried(CaseDescription(), false); + REQUIRE(os.str().empty()); + } + + SECTION("should print . on unaccepted shrink if verboseShrinking == true") { + Configuration config; + config.verboseShrinking = true; + const auto listener = makeDefaultTestListener(config, os); + CaseDescription desc; + desc.result = CaseResult(CaseResult::Type::Success); + listener->onShrinkTried(desc, false); + REQUIRE(os.str() == "."); + } +}