diff --git a/include/internal/catch_tostring.cpp b/include/internal/catch_tostring.cpp index b857d3fb..33d442d6 100644 --- a/include/internal/catch_tostring.cpp +++ b/include/internal/catch_tostring.cpp @@ -234,11 +234,32 @@ std::string StringMaker::convert(std::nullptr_t) { return "nullptr"; } +int StringMaker::m_precision = 5; + std::string StringMaker::convert(float value) { - return fpToString(value, 5) + 'f'; + return fpToString(value, m_precision) + 'f'; } + +void StringMaker::setPrecision(int precision) { + m_precision = precision; +} + +int StringMaker::getPrecision() { + return m_precision; +} + +int StringMaker::m_precision = 10; + std::string StringMaker::convert(double value) { - return fpToString(value, 10); + return fpToString(value, m_precision); +} + +void StringMaker::setPrecision(int precision) { + m_precision = precision; +} + +int StringMaker::getPrecision() { + return m_precision; } std::string ratio_string::symbol() { return "a"; } diff --git a/include/internal/catch_tostring.h b/include/internal/catch_tostring.h index 52634a8c..89d0d633 100644 --- a/include/internal/catch_tostring.h +++ b/include/internal/catch_tostring.h @@ -261,10 +261,19 @@ namespace Catch { template<> struct StringMaker { static std::string convert(float value); + static void setPrecision(int precision); + static int getPrecision(); + private: + static int m_precision; }; + template<> struct StringMaker { static std::string convert(double value); + static void setPrecision(int precision); + static int getPrecision(); + private: + static int m_precision; }; template diff --git a/projects/SelfTest/UsageTests/ToStringGeneral.tests.cpp b/projects/SelfTest/UsageTests/ToStringGeneral.tests.cpp index 09ac3045..bbcc9a66 100644 --- a/projects/SelfTest/UsageTests/ToStringGeneral.tests.cpp +++ b/projects/SelfTest/UsageTests/ToStringGeneral.tests.cpp @@ -128,6 +128,29 @@ TEST_CASE("String views are stringified like other strings", "[toString][approva #endif +//TEMPLATE_TEST_CASE("Floating-point precision can be set", "[toString][floatingPoint]", float, double) +//{ +// const auto oldPrecision = Catch::StringMaker::getPrecision(); +// const auto precision = GENERATE(-1, 0, 3, std::numeric_limits::max_digits10); +// const auto expectedLength = unsigned(precision < 0 ? 3 : precision); +// +// CAPTURE( precision ); +// +// if (precision >= 0) +// { +// Catch::StringMaker::setPrecision(precision); +// } +// +// // Expected to fail to demonstrate the problem +// const auto str = Catch::StringMaker::convert(std::numeric_limits::epsilon()); +// CHECK(str.length() >= expectedLength); +// +// if (precision >= 0) +// { +// Catch::StringMaker::setPrecision(oldPrecision); +// } +//} + namespace { struct WhatException : std::exception {