From 4603d7e231edb13c91f1f3b5d2414e751aa73533 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Tue, 10 Aug 2021 19:30:03 +0200 Subject: [PATCH] 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 Reviewed-by: Thiago Macieira --- .../text/qbytearray/tst_qbytearray.cpp | 10 +++++-- .../auto/corelib/text/qstring/tst_qstring.cpp | 9 ++++++- .../corelib/text/shared/test_number_shared.h | 26 +++++++++++++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp b/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp index 9f4949f5b38..41695ec0c30 100644 --- a/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp +++ b/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp @@ -1304,12 +1304,18 @@ void tst_QByteArray::number_double_data() // This function is implemented in ../shared/test_number_shared.h add_number_double_shared_data([](NumberDoubleTestData datum) { 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; if (datum.f != 'f') { // Also test uppercase format datum.f = toupper(datum.f); 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; } }); diff --git a/tests/auto/corelib/text/qstring/tst_qstring.cpp b/tests/auto/corelib/text/qstring/tst_qstring.cpp index 733be3c3534..f0ed8f3e6d0 100644 --- a/tests/auto/corelib/text/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/text/qstring/tst_qstring.cpp @@ -5210,11 +5210,18 @@ void tst_QString::number_double_data() // This function is implemented in ../shared/test_number_shared.h 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(); if (datum.f != 'f') { // Also test uppercase format datum.f = toupper(datum.f); 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) << datum.d << datum.f << datum.p << upper; } diff --git a/tests/auto/corelib/text/shared/test_number_shared.h b/tests/auto/corelib/text/shared/test_number_shared.h index 5061a4fda55..0cbe4492e57 100644 --- a/tests/auto/corelib/text/shared/test_number_shared.h +++ b/tests/auto/corelib/text/shared/test_number_shared.h @@ -36,6 +36,7 @@ struct NumberDoubleTestData char f; int p; QLatin1String expected; + QLatin1String optTitle = {}; // optional }; template @@ -55,6 +56,31 @@ inline void add_number_double_shared_data(Fun addTestRowFunction) { -100000, 'f', 15, QLatin1String("-100000.000000000000000") }, { 0.5 + qSqrt(1.25), 'f', 15, QLatin1String("1.618033988749895") }, { 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::epsilon(), 'g', 10, QLatin1String("2.220446049e-16") }, { 0.0001, 'e', 1, QLatin1String("1.0e-04") }, { 1e8, 'e', 1, QLatin1String("1.0e+08") },