2022-05-10 10:06:48 +00:00
|
|
|
// Copyright (C) 2019 The Qt Company Ltd.
|
2024-02-02 13:36:10 +00:00
|
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
|
Add testlib selftests for double and for non-finite float and double
Tidied up the existing float tests in the process.
(In particular, s/SUCCESS/PASS/ since that matches real test output.)
These verify that QCOMPARE() handles floats and doubles as intended.
Extended the existing qFuzzyCompare tests to probe the boundaries of
the ranges of values of both types, in the process.
Revised the toString<double> that qCompare() uses to give enough
precision to actually show some of the differences being tested there
(12 digits, to match what qFuzzyCompare tests, so as to show different
values rather than, e.g. 1e12 for both expected and actual) and to
give consistent results for infinities and NaN (MinGW had eccentric
versions for these, leading to different output from tests, which thus
failed); did the latter also for toString<float> and fixed stray zeros
in MinGW's exponents (which made a kludge in tst_selftest.cpp
redundant, so I removed that, too).
That's further complicated handling of floating-point types, so let's
just keep an eye on how expensive that's getting by adding a benchmark
test for QTest::toString(). Unfortunately, default settings only get
runs that take modest numbers of milliseconds (some as low as 40)
while increasing this with -minumumvalue 100 or more gets the process
killed - and I'm unable to find out who's doing the killing (it's not
QProcess::kill, ::kill or the QtTest WatchDog, as far as I can tell).
So results are rather noisy; the integral tests exhibit speed-ups by
factors up to 5, and slow-downs by factors up to 100, between runs
with and without this change, which does not affec the integral tests.
The relatively modest slow-downs and speed-ups in the floating point
tests thus seem likely to be happenstance rather than signal.
Change-Id: I4a6bbbab6a43bf14a4089e96238a7c8da2c3127e
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
2019-01-14 19:50:41 +00:00
|
|
|
|
2020-11-26 16:31:50 +00:00
|
|
|
#include <QTest>
|
Add testlib selftests for double and for non-finite float and double
Tidied up the existing float tests in the process.
(In particular, s/SUCCESS/PASS/ since that matches real test output.)
These verify that QCOMPARE() handles floats and doubles as intended.
Extended the existing qFuzzyCompare tests to probe the boundaries of
the ranges of values of both types, in the process.
Revised the toString<double> that qCompare() uses to give enough
precision to actually show some of the differences being tested there
(12 digits, to match what qFuzzyCompare tests, so as to show different
values rather than, e.g. 1e12 for both expected and actual) and to
give consistent results for infinities and NaN (MinGW had eccentric
versions for these, leading to different output from tests, which thus
failed); did the latter also for toString<float> and fixed stray zeros
in MinGW's exponents (which made a kludge in tst_selftest.cpp
redundant, so I removed that, too).
That's further complicated handling of floating-point types, so let's
just keep an eye on how expensive that's getting by adding a benchmark
test for QTest::toString(). Unfortunately, default settings only get
runs that take modest numbers of milliseconds (some as low as 40)
while increasing this with -minumumvalue 100 or more gets the process
killed - and I'm unable to find out who's doing the killing (it's not
QProcess::kill, ::kill or the QtTest WatchDog, as far as I can tell).
So results are rather noisy; the integral tests exhibit speed-ups by
factors up to 5, and slow-downs by factors up to 100, between runs
with and without this change, which does not affec the integral tests.
The relatively modest slow-downs and speed-ups in the floating point
tests thus seem likely to be happenstance rather than signal.
Change-Id: I4a6bbbab6a43bf14a4089e96238a7c8da2c3127e
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
2019-01-14 19:50:41 +00:00
|
|
|
#include <QtCore/qmath.h> // pi, e
|
|
|
|
|
|
|
|
// Tests for QTest::toString
|
|
|
|
class tst_toString : public QObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
template <typename T> void numeric_data();
|
|
|
|
template <typename T> void numeric();
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
void floatTst_data() { numeric_data<float>(); }
|
|
|
|
void floatTst() { numeric<float>(); }
|
|
|
|
void doubleTst_data() { numeric_data<double>(); }
|
|
|
|
void doubleTst() { numeric<double>(); }
|
|
|
|
void intTst_data() { numeric_data<int>(); }
|
|
|
|
void intTst() { numeric<int>(); }
|
|
|
|
void unsignedTst_data() { numeric_data<unsigned>(); }
|
|
|
|
void unsignedTst() { numeric<unsigned>(); }
|
|
|
|
void quint64Tst_data() { numeric_data<quint64>(); }
|
|
|
|
void quint64Tst() { numeric<quint64>(); }
|
|
|
|
void qint64Tst_data() { numeric_data<qint64>(); }
|
|
|
|
void qint64Tst() { numeric<qint64>(); }
|
2022-06-02 18:22:01 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
template <typename T> void compare();
|
|
|
|
template <typename T> void compare_eq();
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
void floatCompare_data() { numeric_data<float>(); }
|
|
|
|
void floatCompare() { compare<float>(); }
|
|
|
|
void floatCompareEq_data() { numeric_data<float>(); }
|
|
|
|
void floatCompareEq() { compare_eq<float>(); }
|
|
|
|
void doubleCompare_data() { numeric_data<double>(); }
|
|
|
|
void doubleCompare() { compare<double>(); }
|
|
|
|
void doubleCompareEq_data() { numeric_data<double>(); }
|
|
|
|
void doubleCompareEq() { compare_eq<double>(); }
|
|
|
|
void intCompare_data() { numeric_data<int>(); }
|
|
|
|
void intCompare() { compare<int>(); }
|
|
|
|
void intCompareEq_data() { numeric_data<int>(); }
|
|
|
|
void intCompareEq() { compare_eq<int>(); }
|
|
|
|
void unsignedCompare_data() { numeric_data<unsigned>(); }
|
|
|
|
void unsignedCompare() { compare<unsigned>(); }
|
|
|
|
void unsignedCompareEq_data() { numeric_data<unsigned>(); }
|
|
|
|
void unsignedCompareEq() { compare_eq<unsigned>(); }
|
|
|
|
void quint64Compare_data() { numeric_data<quint64>(); }
|
|
|
|
void quint64Compare() { compare<quint64>(); }
|
|
|
|
void quint64CompareEq_data() { numeric_data<quint64>(); }
|
|
|
|
void quint64CompareEq() { compare_eq<quint64>(); }
|
|
|
|
void qint64Compare_data() { numeric_data<qint64>(); }
|
|
|
|
void qint64Compare() { compare<qint64>(); }
|
|
|
|
void qint64CompareEq_data() { numeric_data<qint64>(); }
|
|
|
|
void qint64CompareEq() { compare_eq<qint64>(); }
|
Add testlib selftests for double and for non-finite float and double
Tidied up the existing float tests in the process.
(In particular, s/SUCCESS/PASS/ since that matches real test output.)
These verify that QCOMPARE() handles floats and doubles as intended.
Extended the existing qFuzzyCompare tests to probe the boundaries of
the ranges of values of both types, in the process.
Revised the toString<double> that qCompare() uses to give enough
precision to actually show some of the differences being tested there
(12 digits, to match what qFuzzyCompare tests, so as to show different
values rather than, e.g. 1e12 for both expected and actual) and to
give consistent results for infinities and NaN (MinGW had eccentric
versions for these, leading to different output from tests, which thus
failed); did the latter also for toString<float> and fixed stray zeros
in MinGW's exponents (which made a kludge in tst_selftest.cpp
redundant, so I removed that, too).
That's further complicated handling of floating-point types, so let's
just keep an eye on how expensive that's getting by adding a benchmark
test for QTest::toString(). Unfortunately, default settings only get
runs that take modest numbers of milliseconds (some as low as 40)
while increasing this with -minumumvalue 100 or more gets the process
killed - and I'm unable to find out who's doing the killing (it's not
QProcess::kill, ::kill or the QtTest WatchDog, as far as I can tell).
So results are rather noisy; the integral tests exhibit speed-ups by
factors up to 5, and slow-downs by factors up to 100, between runs
with and without this change, which does not affec the integral tests.
The relatively modest slow-downs and speed-ups in the floating point
tests thus seem likely to be happenstance rather than signal.
Change-Id: I4a6bbbab6a43bf14a4089e96238a7c8da2c3127e
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
2019-01-14 19:50:41 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
void tst_toString::numeric_data()
|
|
|
|
{
|
|
|
|
QTest::addColumn<T>("datum");
|
|
|
|
const bool floaty = std::is_floating_point<T>::value;
|
|
|
|
|
|
|
|
QTest::newRow("zero") << T(0);
|
|
|
|
QTest::newRow("one") << T(1);
|
|
|
|
if (floaty) {
|
|
|
|
QTest::newRow("pi") << T(M_PI);
|
|
|
|
QTest::newRow("e") << T(M_E);
|
|
|
|
|
|
|
|
// Stress canonicalisation of leading zeros on exponents:
|
|
|
|
QTest::newRow("milli") << T(1e-3);
|
|
|
|
QTest::newRow("micro") << T(1e-6);
|
|
|
|
QTest::newRow("mu0") << T(.4e-6 * M_PI); // Henry/metre
|
|
|
|
QTest::newRow("Planck") << T(662.606876e-36); // Joule.second/turn
|
|
|
|
}
|
|
|
|
QTest::newRow("2e9") << T(2000000000);
|
|
|
|
QTest::newRow("c.s/m") << T(299792458);
|
|
|
|
QTest::newRow("Avogadro") << T(6.022045e+23); // things/mol (.996 << 79, so ints overflow to max)
|
|
|
|
|
|
|
|
QTest::newRow("lowest") << std::numeric_limits<T>::lowest();
|
|
|
|
QTest::newRow("max") << std::numeric_limits<T>::max();
|
|
|
|
if (floaty) {
|
|
|
|
QTest::newRow("min") << std::numeric_limits<T>::min();
|
|
|
|
|
|
|
|
if (std::numeric_limits<T>::has_infinity) {
|
|
|
|
const T uge = std::numeric_limits<T>::infinity();
|
|
|
|
QTest::newRow("inf") << uge;
|
|
|
|
QTest::newRow("-inf") << -uge;
|
|
|
|
}
|
|
|
|
if (std::numeric_limits<T>::has_quiet_NaN)
|
|
|
|
QTest::newRow("nan") << std::numeric_limits<T>::quiet_NaN();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
void tst_toString::numeric()
|
|
|
|
{
|
|
|
|
QFETCH(T, datum);
|
|
|
|
|
|
|
|
QBENCHMARK {
|
2022-05-26 23:05:09 +00:00
|
|
|
auto tst = QTest::toString(datum);
|
2020-07-24 05:55:07 +00:00
|
|
|
delete [] tst;
|
Add testlib selftests for double and for non-finite float and double
Tidied up the existing float tests in the process.
(In particular, s/SUCCESS/PASS/ since that matches real test output.)
These verify that QCOMPARE() handles floats and doubles as intended.
Extended the existing qFuzzyCompare tests to probe the boundaries of
the ranges of values of both types, in the process.
Revised the toString<double> that qCompare() uses to give enough
precision to actually show some of the differences being tested there
(12 digits, to match what qFuzzyCompare tests, so as to show different
values rather than, e.g. 1e12 for both expected and actual) and to
give consistent results for infinities and NaN (MinGW had eccentric
versions for these, leading to different output from tests, which thus
failed); did the latter also for toString<float> and fixed stray zeros
in MinGW's exponents (which made a kludge in tst_selftest.cpp
redundant, so I removed that, too).
That's further complicated handling of floating-point types, so let's
just keep an eye on how expensive that's getting by adding a benchmark
test for QTest::toString(). Unfortunately, default settings only get
runs that take modest numbers of milliseconds (some as low as 40)
while increasing this with -minumumvalue 100 or more gets the process
killed - and I'm unable to find out who's doing the killing (it's not
QProcess::kill, ::kill or the QtTest WatchDog, as far as I can tell).
So results are rather noisy; the integral tests exhibit speed-ups by
factors up to 5, and slow-downs by factors up to 100, between runs
with and without this change, which does not affec the integral tests.
The relatively modest slow-downs and speed-ups in the floating point
tests thus seem likely to be happenstance rather than signal.
Change-Id: I4a6bbbab6a43bf14a4089e96238a7c8da2c3127e
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
2019-01-14 19:50:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-02 18:22:01 +00:00
|
|
|
template <typename T>
|
|
|
|
void tst_toString::compare()
|
|
|
|
{
|
|
|
|
QFETCH(T, datum);
|
|
|
|
|
|
|
|
QBENCHMARK {
|
|
|
|
QCOMPARE(datum, datum);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
void tst_toString::compare_eq()
|
|
|
|
{
|
|
|
|
QFETCH(T, datum);
|
|
|
|
|
|
|
|
if constexpr (std::numeric_limits<T>::has_quiet_NaN) {
|
|
|
|
if (qIsNaN(datum))
|
|
|
|
QSKIP("Unlike QCOMPARE, QCOMPARE_EQ doesn't handle NaN specially");
|
|
|
|
}
|
|
|
|
|
|
|
|
QBENCHMARK {
|
|
|
|
QCOMPARE_EQ(datum, datum);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Add testlib selftests for double and for non-finite float and double
Tidied up the existing float tests in the process.
(In particular, s/SUCCESS/PASS/ since that matches real test output.)
These verify that QCOMPARE() handles floats and doubles as intended.
Extended the existing qFuzzyCompare tests to probe the boundaries of
the ranges of values of both types, in the process.
Revised the toString<double> that qCompare() uses to give enough
precision to actually show some of the differences being tested there
(12 digits, to match what qFuzzyCompare tests, so as to show different
values rather than, e.g. 1e12 for both expected and actual) and to
give consistent results for infinities and NaN (MinGW had eccentric
versions for these, leading to different output from tests, which thus
failed); did the latter also for toString<float> and fixed stray zeros
in MinGW's exponents (which made a kludge in tst_selftest.cpp
redundant, so I removed that, too).
That's further complicated handling of floating-point types, so let's
just keep an eye on how expensive that's getting by adding a benchmark
test for QTest::toString(). Unfortunately, default settings only get
runs that take modest numbers of milliseconds (some as low as 40)
while increasing this with -minumumvalue 100 or more gets the process
killed - and I'm unable to find out who's doing the killing (it's not
QProcess::kill, ::kill or the QtTest WatchDog, as far as I can tell).
So results are rather noisy; the integral tests exhibit speed-ups by
factors up to 5, and slow-downs by factors up to 100, between runs
with and without this change, which does not affec the integral tests.
The relatively modest slow-downs and speed-ups in the floating point
tests thus seem likely to be happenstance rather than signal.
Change-Id: I4a6bbbab6a43bf14a4089e96238a7c8da2c3127e
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
2019-01-14 19:50:41 +00:00
|
|
|
QTEST_MAIN(tst_toString)
|
|
|
|
#include "tst_tostring.moc"
|