QString/QByteArray::number(double): Test big numbers
Exhausts the entire buffer which double-conversion is left to work with. Also has a large amount of precision, which apparently we need to store temporarily. Task-number: QTBUG-88484 Change-Id: I87e8c323676465f1b8695e086020df1240d0d0d7 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
b43afd5315
commit
4603d7e231
@ -1304,12 +1304,18 @@ void tst_QByteArray::number_double_data()
|
|||||||
// This function is implemented in ../shared/test_number_shared.h
|
// This function is implemented in ../shared/test_number_shared.h
|
||||||
add_number_double_shared_data([](NumberDoubleTestData datum) {
|
add_number_double_shared_data([](NumberDoubleTestData datum) {
|
||||||
QByteArray ba(datum.expected.data(), datum.expected.size());
|
QByteArray ba(datum.expected.data(), datum.expected.size());
|
||||||
QTest::addRow("%s, format '%c', precision %d", ba.data(), datum.f, datum.p)
|
const char *title = !datum.optTitle.isEmpty() ? datum.optTitle.data() : ba.data();
|
||||||
|
QTest::addRow("%s, format '%c', precision %d", title, datum.f, datum.p)
|
||||||
<< datum.d << datum.f << datum.p << ba;
|
<< datum.d << datum.f << datum.p << ba;
|
||||||
if (datum.f != 'f') { // Also test uppercase format
|
if (datum.f != 'f') { // Also test uppercase format
|
||||||
datum.f = toupper(datum.f);
|
datum.f = toupper(datum.f);
|
||||||
QByteArray upper = ba.toUpper();
|
QByteArray upper = ba.toUpper();
|
||||||
QTest::addRow("%s, format '%c', precision %d", upper.data(), datum.f, datum.p)
|
QByteArray upperTitle = QByteArray(title);
|
||||||
|
if (!datum.optTitle.isEmpty())
|
||||||
|
upperTitle += ", uppercase";
|
||||||
|
else
|
||||||
|
upperTitle = upperTitle.toUpper();
|
||||||
|
QTest::addRow("%s, format '%c', precision %d", upperTitle.data(), datum.f, datum.p)
|
||||||
<< datum.d << datum.f << datum.p << upper;
|
<< datum.d << datum.f << datum.p << upper;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -5210,11 +5210,18 @@ void tst_QString::number_double_data()
|
|||||||
|
|
||||||
// This function is implemented in ../shared/test_number_shared.h
|
// This function is implemented in ../shared/test_number_shared.h
|
||||||
add_number_double_shared_data([](NumberDoubleTestData datum) {
|
add_number_double_shared_data([](NumberDoubleTestData datum) {
|
||||||
QTest::addRow("%s, format '%c', precision %d", datum.expected.data(), datum.f, datum.p)
|
const char *title =
|
||||||
|
!datum.optTitle.isEmpty() ? datum.optTitle.data() : datum.expected.data();
|
||||||
|
QTest::addRow("%s, format '%c', precision %d", title, datum.f, datum.p)
|
||||||
<< datum.d << datum.f << datum.p << datum.expected.toString();
|
<< datum.d << datum.f << datum.p << datum.expected.toString();
|
||||||
if (datum.f != 'f') { // Also test uppercase format
|
if (datum.f != 'f') { // Also test uppercase format
|
||||||
datum.f = toupper(datum.f);
|
datum.f = toupper(datum.f);
|
||||||
QString upper = datum.expected.toString().toUpper();
|
QString upper = datum.expected.toString().toUpper();
|
||||||
|
QString upperTitle = QString::fromLatin1(title);
|
||||||
|
if (!datum.optTitle.isEmpty())
|
||||||
|
upperTitle += ", uppercase";
|
||||||
|
else
|
||||||
|
upperTitle = upperTitle.toUpper();
|
||||||
QTest::addRow("%s, format '%c', precision %d", qPrintable(upper), datum.f, datum.p)
|
QTest::addRow("%s, format '%c', precision %d", qPrintable(upper), datum.f, datum.p)
|
||||||
<< datum.d << datum.f << datum.p << upper;
|
<< datum.d << datum.f << datum.p << upper;
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,7 @@ struct NumberDoubleTestData
|
|||||||
char f;
|
char f;
|
||||||
int p;
|
int p;
|
||||||
QLatin1String expected;
|
QLatin1String expected;
|
||||||
|
QLatin1String optTitle = {}; // optional
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Fun>
|
template<typename Fun>
|
||||||
@ -55,6 +56,31 @@ inline void add_number_double_shared_data(Fun addTestRowFunction)
|
|||||||
{ -100000, 'f', 15, QLatin1String("-100000.000000000000000") },
|
{ -100000, 'f', 15, QLatin1String("-100000.000000000000000") },
|
||||||
{ 0.5 + qSqrt(1.25), 'f', 15, QLatin1String("1.618033988749895") },
|
{ 0.5 + qSqrt(1.25), 'f', 15, QLatin1String("1.618033988749895") },
|
||||||
{ 0.5 + qSqrt(1.25), 'e', 15, QLatin1String("1.618033988749895e+00") },
|
{ 0.5 + qSqrt(1.25), 'e', 15, QLatin1String("1.618033988749895e+00") },
|
||||||
|
{ 1.7976931348623157e+308, 'f', 120,
|
||||||
|
QLatin1String(
|
||||||
|
"17976931348623157081452742373170435679807056752584499659891747680315726078002853"
|
||||||
|
"87605895586327668781715404589535143824642343213268894641827684675467035375169860"
|
||||||
|
"49910576551282076245490090389328944075868508455133942304583236903222948165808559"
|
||||||
|
"332123348274797826204144723168738177180919299881250404026184124858368."
|
||||||
|
"00000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
"0000000000000000000000000000000000000000"),
|
||||||
|
QLatin1String("Big number, high precision") },
|
||||||
|
{ 1.0, 'f', 350,
|
||||||
|
QLatin1String(
|
||||||
|
"1.0000000000000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
"00000000000000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
"00000000000000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
"00000000000000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
"0000000000000000000000000000000000000000000000000000000"),
|
||||||
|
QLatin1String("Very high precision 1") },
|
||||||
|
{ 1.0e-308, 'f', 350,
|
||||||
|
QLatin1String("0."
|
||||||
|
"00000000000000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
"00000000000000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
"00000000000000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
"00000000000000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
"000000000000999999999999999909326625337248461995470489"),
|
||||||
|
QLatin1String("Very small number, very high precision") },
|
||||||
{ std::numeric_limits<double>::epsilon(), 'g', 10, QLatin1String("2.220446049e-16") },
|
{ std::numeric_limits<double>::epsilon(), 'g', 10, QLatin1String("2.220446049e-16") },
|
||||||
{ 0.0001, 'e', 1, QLatin1String("1.0e-04") },
|
{ 0.0001, 'e', 1, QLatin1String("1.0e-04") },
|
||||||
{ 1e8, 'e', 1, QLatin1String("1.0e+08") },
|
{ 1e8, 'e', 1, QLatin1String("1.0e+08") },
|
||||||
|
Loading…
x
Reference in New Issue
Block a user