summaryrefslogtreecommitdiffstats
path: root/src/testlib
diff options
context:
space:
mode:
Diffstat (limited to 'src/testlib')
-rw-r--r--src/testlib/qtestcase.cpp17
-rw-r--r--src/testlib/qtestcase.qdoc21
2 files changed, 21 insertions, 17 deletions
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index f45999c7fa..74507c11e1 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Copyright (C) 2016 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
@@ -2525,16 +2525,21 @@ bool QTest::compare_helper(bool success, const char *failureMsg,
}
template <typename T>
-static bool floatingCompare(const T &t1, const T &t2)
+static bool floatingCompare(const T &actual, const T &expected)
{
- switch (qFpClassify(t1))
+ switch (qFpClassify(expected))
{
case FP_INFINITE:
- return (t1 < 0) == (t2 < 0) && qFpClassify(t2) == FP_INFINITE;
+ return (expected < 0) == (actual < 0) && qFpClassify(actual) == FP_INFINITE;
case FP_NAN:
- return qFpClassify(t2) == FP_NAN;
+ return qFpClassify(actual) == FP_NAN;
default:
- return qFuzzyCompare(t1, t2);
+ if (!qFuzzyIsNull(expected))
+ return qFuzzyCompare(actual, expected);
+ Q_FALLTHROUGH();
+ case FP_SUBNORMAL: // subnormal is always fuzzily null
+ case FP_ZERO:
+ return qFuzzyIsNull(actual);
}
}
diff --git a/src/testlib/qtestcase.qdoc b/src/testlib/qtestcase.qdoc
index e4e1825bb5..72f8cdaf8c 100644
--- a/src/testlib/qtestcase.qdoc
+++ b/src/testlib/qtestcase.qdoc
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
@@ -109,19 +109,18 @@
continues. If not, a failure is recorded in the test log and the test
function returns without attempting any later checks.
- Always respect QCOMPARE() parameter semantics. The first parameter passed to it
- should always be the actual value produced by the code-under-test, while the
- second parameter should always be the expected value. When the values don't
- match, QCOMPARE() prints them with the labels \e Actual and \e Expected.
- If the parameter order is swapped, debugging a failing test can be confusing.
+ Always respect QCOMPARE() parameter semantics. The first parameter passed to
+ it should always be the actual value produced by the code-under-test, while
+ the second parameter should always be the expected value. When the values
+ don't match, QCOMPARE() prints them with the labels \e Actual and \e
+ Expected. If the parameter order is swapped, debugging a failing test can be
+ confusing and tests expecting zero may fail due to rounding errors.
When comparing floating-point types (\c float, \c double, and \c qfloat16),
- \l qFuzzyCompare() is used for finite values. Infinities match if they have
+ \l qFuzzyCompare() is used for finite values. If qFuzzyIsNull() is true for
+ both values, they are also considered equal. Infinities match if they have
the same sign, and any NaN as actual value matches with any NaN as expected
- value (even though NaN != NaN, even when they're identical). This means that
- expecting 0 can fail when the actual value may be affected by rounding errors.
- One solution to this is to offset both actual and expected values by adding
- some suitable constant (such as 1).
+ value (even though NaN != NaN, even when they're identical).
QCOMPARE() tries to output the contents of the values if the comparison fails,
so it is visible from the test log why the comparison failed.