55#include < boost/decimal.hpp>
66#include < boost/core/lightweight_test.hpp>
77#include < limits>
8+ #include < array>
9+ #include < cctype>
10+ #include < string>
811
912using namespace boost ::decimal;
1013
@@ -173,21 +176,21 @@ void test_scientific()
173176template <typename T>
174177void test_hex ()
175178{
176- BOOST_TEST_EQ (std::format (" {:.0a }" , T {0 }), " 0p+00" );
177- BOOST_TEST_EQ (std::format (" {:.3A }" , T {0 }), " 0.000P+00" );
178- BOOST_TEST_EQ (std::format (" {:a }" , std::numeric_limits<T>::infinity ()), " inf" );
179- BOOST_TEST_EQ (std::format (" {:a }" , -std::numeric_limits<T>::infinity ()), " -inf" );
180- BOOST_TEST_EQ (std::format (" {:a }" , std::numeric_limits<T>::quiet_NaN ()), " nan" );
181- BOOST_TEST_EQ (std::format (" {:a }" , -std::numeric_limits<T>::quiet_NaN ()), " -nan(ind)" );
182- BOOST_TEST_EQ (std::format (" {:a }" , std::numeric_limits<T>::signaling_NaN ()), " nan(snan)" );
183- BOOST_TEST_EQ (std::format (" {:a }" , -std::numeric_limits<T>::signaling_NaN ()), " -nan(snan)" );
184-
185- BOOST_TEST_EQ (std::format (" {:A }" , std::numeric_limits<T>::infinity ()), " INF" );
186- BOOST_TEST_EQ (std::format (" {:A }" , -std::numeric_limits<T>::infinity ()), " -INF" );
187- BOOST_TEST_EQ (std::format (" {:A }" , std::numeric_limits<T>::quiet_NaN ()), " NAN" );
188- BOOST_TEST_EQ (std::format (" {:A }" , -std::numeric_limits<T>::quiet_NaN ()), " -NAN(IND)" );
189- BOOST_TEST_EQ (std::format (" {:A }" , std::numeric_limits<T>::signaling_NaN ()), " NAN(SNAN)" );
190- BOOST_TEST_EQ (std::format (" {:A }" , -std::numeric_limits<T>::signaling_NaN ()), " -NAN(SNAN)" );
179+ BOOST_TEST_EQ (std::format (" {:.0x }" , T {0 }), " 0p+00" );
180+ BOOST_TEST_EQ (std::format (" {:.3X }" , T {0 }), " 0.000P+00" );
181+ BOOST_TEST_EQ (std::format (" {:x }" , std::numeric_limits<T>::infinity ()), " inf" );
182+ BOOST_TEST_EQ (std::format (" {:x }" , -std::numeric_limits<T>::infinity ()), " -inf" );
183+ BOOST_TEST_EQ (std::format (" {:x }" , std::numeric_limits<T>::quiet_NaN ()), " nan" );
184+ BOOST_TEST_EQ (std::format (" {:x }" , -std::numeric_limits<T>::quiet_NaN ()), " -nan(ind)" );
185+ BOOST_TEST_EQ (std::format (" {:x }" , std::numeric_limits<T>::signaling_NaN ()), " nan(snan)" );
186+ BOOST_TEST_EQ (std::format (" {:x }" , -std::numeric_limits<T>::signaling_NaN ()), " -nan(snan)" );
187+
188+ BOOST_TEST_EQ (std::format (" {:X }" , std::numeric_limits<T>::infinity ()), " INF" );
189+ BOOST_TEST_EQ (std::format (" {:X }" , -std::numeric_limits<T>::infinity ()), " -INF" );
190+ BOOST_TEST_EQ (std::format (" {:X }" , std::numeric_limits<T>::quiet_NaN ()), " NAN" );
191+ BOOST_TEST_EQ (std::format (" {:X }" , -std::numeric_limits<T>::quiet_NaN ()), " -NAN(IND)" );
192+ BOOST_TEST_EQ (std::format (" {:X }" , std::numeric_limits<T>::signaling_NaN ()), " NAN(SNAN)" );
193+ BOOST_TEST_EQ (std::format (" {:X }" , -std::numeric_limits<T>::signaling_NaN ()), " -NAN(SNAN)" );
191194}
192195
193196template <typename T>
@@ -197,6 +200,52 @@ void test_with_string()
197200 BOOST_TEST_EQ (std::format (" Height is: {} meters" , T {2 }), " Height is: 2 meters" );
198201}
199202
203+ template <typename T>
204+ void test_cohort_preservation ()
205+ {
206+ const std::array<T, 7 > decimals = {
207+ T {5 , 4 },
208+ T {50 , 3 },
209+ T {500 , 2 },
210+ T {5000 , 1 },
211+ T {50000 , 0 },
212+ T {500000 , -1 },
213+ T {5000000 , -2 },
214+ };
215+
216+ const std::array<const char *, 7 > result_strings = {
217+ " 5e+04" ,
218+ " 5.0e+04" ,
219+ " 5.00e+04" ,
220+ " 5.000e+04" ,
221+ " 5.0000e+04" ,
222+ " 5.00000e+04" ,
223+ " 5.000000e+04" ,
224+ };
225+
226+ for (std::size_t i {}; i < decimals.size (); ++i)
227+ {
228+ BOOST_TEST_CSTR_EQ (std::format (" {:a}" , decimals[i]).c_str (), result_strings[i]);
229+
230+ std::string s {result_strings[i]};
231+
232+ #ifdef _MSC_VER
233+ # pragma warning(push)
234+ # pragma warning(disable : 4244)
235+ #endif
236+
237+ std::transform (s.begin (), s.end (), s.begin (),
238+ [](unsigned char c)
239+ { return std::toupper (c); });
240+
241+ #ifdef _MSC_VER
242+ # pragma warning(pop)
243+ #endif
244+
245+ BOOST_TEST_CSTR_EQ (std::format (" {:A}" , decimals[i]).c_str (), s.c_str ());
246+ }
247+ }
248+
200249int main ()
201250{
202251 test_general<decimal32_t >();
@@ -234,6 +283,10 @@ int main()
234283 test_with_string<decimal128_t >();
235284 test_with_string<decimal_fast128_t >();
236285
286+ test_cohort_preservation<decimal32_t >();
287+ test_cohort_preservation<decimal64_t >();
288+ test_cohort_preservation<decimal128_t >();
289+
237290 return boost::report_errors ();
238291}
239292
0 commit comments