mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-22 21:36:11 +01:00
Add support for custom precision in floating point stringification
Closes #1612
This commit is contained in:
parent
9c741fe960
commit
53a83e855e
@ -234,11 +234,32 @@ std::string StringMaker<std::nullptr_t>::convert(std::nullptr_t) {
|
|||||||
return "nullptr";
|
return "nullptr";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int StringMaker<float>::m_precision = 5;
|
||||||
|
|
||||||
std::string StringMaker<float>::convert(float value) {
|
std::string StringMaker<float>::convert(float value) {
|
||||||
return fpToString(value, 5) + 'f';
|
return fpToString(value, m_precision) + 'f';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StringMaker<float>::setPrecision(int precision) {
|
||||||
|
m_precision = precision;
|
||||||
|
}
|
||||||
|
|
||||||
|
int StringMaker<float>::getPrecision() {
|
||||||
|
return m_precision;
|
||||||
|
}
|
||||||
|
|
||||||
|
int StringMaker<double>::m_precision = 10;
|
||||||
|
|
||||||
std::string StringMaker<double>::convert(double value) {
|
std::string StringMaker<double>::convert(double value) {
|
||||||
return fpToString(value, 10);
|
return fpToString(value, m_precision);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StringMaker<double>::setPrecision(int precision) {
|
||||||
|
m_precision = precision;
|
||||||
|
}
|
||||||
|
|
||||||
|
int StringMaker<double>::getPrecision() {
|
||||||
|
return m_precision;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ratio_string<std::atto>::symbol() { return "a"; }
|
std::string ratio_string<std::atto>::symbol() { return "a"; }
|
||||||
|
@ -261,10 +261,19 @@ namespace Catch {
|
|||||||
template<>
|
template<>
|
||||||
struct StringMaker<float> {
|
struct StringMaker<float> {
|
||||||
static std::string convert(float value);
|
static std::string convert(float value);
|
||||||
|
static void setPrecision(int precision);
|
||||||
|
static int getPrecision();
|
||||||
|
private:
|
||||||
|
static int m_precision;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
struct StringMaker<double> {
|
struct StringMaker<double> {
|
||||||
static std::string convert(double value);
|
static std::string convert(double value);
|
||||||
|
static void setPrecision(int precision);
|
||||||
|
static int getPrecision();
|
||||||
|
private:
|
||||||
|
static int m_precision;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -128,6 +128,29 @@ TEST_CASE("String views are stringified like other strings", "[toString][approva
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//TEMPLATE_TEST_CASE("Floating-point precision can be set", "[toString][floatingPoint]", float, double)
|
||||||
|
//{
|
||||||
|
// const auto oldPrecision = Catch::StringMaker<TestType>::getPrecision();
|
||||||
|
// const auto precision = GENERATE(-1, 0, 3, std::numeric_limits<TestType>::max_digits10);
|
||||||
|
// const auto expectedLength = unsigned(precision < 0 ? 3 : precision);
|
||||||
|
//
|
||||||
|
// CAPTURE( precision );
|
||||||
|
//
|
||||||
|
// if (precision >= 0)
|
||||||
|
// {
|
||||||
|
// Catch::StringMaker<TestType>::setPrecision(precision);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // Expected to fail to demonstrate the problem
|
||||||
|
// const auto str = Catch::StringMaker<TestType>::convert(std::numeric_limits<TestType>::epsilon());
|
||||||
|
// CHECK(str.length() >= expectedLength);
|
||||||
|
//
|
||||||
|
// if (precision >= 0)
|
||||||
|
// {
|
||||||
|
// Catch::StringMaker<TestType>::setPrecision(oldPrecision);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
struct WhatException : std::exception {
|
struct WhatException : std::exception {
|
||||||
|
Loading…
Reference in New Issue
Block a user