From 150c6fb74bb7bc702d1d319a1e9acba6b644944b Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Mon, 14 Jan 2019 20:50:41 +0100 Subject: 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 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 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 --- tests/benchmarks/benchmarks.pro | 5 +- tests/benchmarks/testlib/testlib.pro | 3 + tests/benchmarks/testlib/tostring/tostring.pro | 4 + tests/benchmarks/testlib/tostring/tst_tostring.cpp | 103 +++++++++++++++++++++ 4 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 tests/benchmarks/testlib/testlib.pro create mode 100644 tests/benchmarks/testlib/tostring/tostring.pro create mode 100644 tests/benchmarks/testlib/tostring/tst_tostring.cpp (limited to 'tests/benchmarks') diff --git a/tests/benchmarks/benchmarks.pro b/tests/benchmarks/benchmarks.pro index 9e288f7aa2..a98b9a62c6 100644 --- a/tests/benchmarks/benchmarks.pro +++ b/tests/benchmarks/benchmarks.pro @@ -3,10 +3,11 @@ SUBDIRS = \ corelib \ sql \ -# removed-by-refactor qtHaveModule(opengl): SUBDIRS += opengl qtHaveModule(dbus): SUBDIRS += dbus -qtHaveModule(network): SUBDIRS += network qtHaveModule(gui): SUBDIRS += gui +qtHaveModule(network): SUBDIRS += network +# removed-by-refactor qtHaveModule(opengl): SUBDIRS += opengl +qtHaveModule(testlib): SUBDIRS += testlib qtHaveModule(widgets): SUBDIRS += widgets check-trusted.CONFIG += recursive diff --git a/tests/benchmarks/testlib/testlib.pro b/tests/benchmarks/testlib/testlib.pro new file mode 100644 index 0000000000..c325f3de9a --- /dev/null +++ b/tests/benchmarks/testlib/testlib.pro @@ -0,0 +1,3 @@ +TEMPLATE = subdirs +SUBDIRS = \ + tostring \ diff --git a/tests/benchmarks/testlib/tostring/tostring.pro b/tests/benchmarks/testlib/tostring/tostring.pro new file mode 100644 index 0000000000..a5aebe1c81 --- /dev/null +++ b/tests/benchmarks/testlib/tostring/tostring.pro @@ -0,0 +1,4 @@ +TARGET = tst_bench_tostring +QT = core testlib + +SOURCES += tst_tostring.cpp diff --git a/tests/benchmarks/testlib/tostring/tst_tostring.cpp b/tests/benchmarks/testlib/tostring/tst_tostring.cpp new file mode 100644 index 0000000000..1731929f98 --- /dev/null +++ b/tests/benchmarks/testlib/tostring/tst_tostring.cpp @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include // pi, e + +// Tests for QTest::toString +class tst_toString : public QObject +{ + Q_OBJECT + + template void numeric_data(); + template void numeric(); + +private slots: + void floatTst_data() { numeric_data(); } + void floatTst() { numeric(); } + void doubleTst_data() { numeric_data(); } + void doubleTst() { numeric(); } + void intTst_data() { numeric_data(); } + void intTst() { numeric(); } + void unsignedTst_data() { numeric_data(); } + void unsignedTst() { numeric(); } + void quint64Tst_data() { numeric_data(); } + void quint64Tst() { numeric(); } + void qint64Tst_data() { numeric_data(); } + void qint64Tst() { numeric(); } +}; + +template +void tst_toString::numeric_data() +{ + QTest::addColumn("datum"); + const bool floaty = std::is_floating_point::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::lowest(); + QTest::newRow("max") << std::numeric_limits::max(); + if (floaty) { + QTest::newRow("min") << std::numeric_limits::min(); + + if (std::numeric_limits::has_infinity) { + const T uge = std::numeric_limits::infinity(); + QTest::newRow("inf") << uge; + QTest::newRow("-inf") << -uge; + } + if (std::numeric_limits::has_quiet_NaN) + QTest::newRow("nan") << std::numeric_limits::quiet_NaN(); + } +} + +template +void tst_toString::numeric() +{ + QFETCH(T, datum); + + QBENCHMARK { + QTest::toString(datum); + } +} + +QTEST_MAIN(tst_toString) +#include "tst_tostring.moc" -- cgit v1.2.3