Fix QMarginsF::operator==() for zero margins
The (in)equality operators for QMarginsF are documented to use fuzzy comparison. However, the implementation unconditionally used qFuzzyCompare which is incorrect for the case of 0 margins. Update the implementation to use a combination of qFuzzyIsNull and qFuzzyCompare, like it's done for QPointF. [ChangeLog][QtCore][QMarginsF] Fixed a bug when equality comparison returned incorrect results if one of the margins was zero. Task-number: QTBUG-120308 Change-Id: I6e785fe8b523f6aa5f5317fb75877fdbf4e086c2 Reviewed-by: Tatiana Borisova <tatiana.borisova@qt.io>
This commit is contained in:
parent
9d4e1b9f8d
commit
8a54d25a46
@ -304,18 +304,25 @@ private:
|
|||||||
qreal m_right;
|
qreal m_right;
|
||||||
qreal m_bottom;
|
qreal m_bottom;
|
||||||
|
|
||||||
|
QT_WARNING_PUSH
|
||||||
|
QT_WARNING_DISABLE_FLOAT_COMPARE
|
||||||
friend constexpr inline bool operator==(const QMarginsF &lhs, const QMarginsF &rhs) noexcept
|
friend constexpr inline bool operator==(const QMarginsF &lhs, const QMarginsF &rhs) noexcept
|
||||||
{
|
{
|
||||||
return qFuzzyCompare(lhs.left(), rhs.left())
|
return ((!lhs.m_left || !rhs.m_left) ? qFuzzyIsNull(lhs.m_left - rhs.m_left)
|
||||||
&& qFuzzyCompare(lhs.top(), rhs.top())
|
: qFuzzyCompare(lhs.m_left, rhs.m_left))
|
||||||
&& qFuzzyCompare(lhs.right(), rhs.right())
|
&& ((!lhs.m_top || !rhs.m_top) ? qFuzzyIsNull(lhs.m_top - rhs.m_top)
|
||||||
&& qFuzzyCompare(lhs.bottom(), rhs.bottom());
|
: qFuzzyCompare(lhs.m_top, rhs.m_top))
|
||||||
|
&& ((!lhs.m_right || !rhs.m_right) ? qFuzzyIsNull(lhs.m_right - rhs.m_right)
|
||||||
|
: qFuzzyCompare(lhs.m_right, rhs.m_right))
|
||||||
|
&& ((!lhs.m_bottom || !rhs.m_bottom) ? qFuzzyIsNull(lhs.m_bottom - rhs.m_bottom)
|
||||||
|
: qFuzzyCompare(lhs.m_bottom, rhs.m_bottom));
|
||||||
}
|
}
|
||||||
|
|
||||||
friend constexpr inline bool operator!=(const QMarginsF &lhs, const QMarginsF &rhs) noexcept
|
friend constexpr inline bool operator!=(const QMarginsF &lhs, const QMarginsF &rhs) noexcept
|
||||||
{
|
{
|
||||||
return !(lhs == rhs);
|
return !(lhs == rhs);
|
||||||
}
|
}
|
||||||
|
QT_WARNING_POP
|
||||||
|
|
||||||
template <std::size_t I,
|
template <std::size_t I,
|
||||||
typename M,
|
typename M,
|
||||||
|
@ -14,4 +14,6 @@ endif()
|
|||||||
qt_internal_add_test(tst_qmargins
|
qt_internal_add_test(tst_qmargins
|
||||||
SOURCES
|
SOURCES
|
||||||
tst_qmargins.cpp
|
tst_qmargins.cpp
|
||||||
|
LIBRARIES
|
||||||
|
Qt::TestPrivate
|
||||||
)
|
)
|
||||||
|
@ -32,15 +32,21 @@ CHECK(const &&);
|
|||||||
|
|
||||||
#include <QTest>
|
#include <QTest>
|
||||||
#include <qmargins.h>
|
#include <qmargins.h>
|
||||||
|
#include <private/qcomparisontesthelper_p.h>
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(QMargins)
|
Q_DECLARE_METATYPE(QMargins)
|
||||||
|
|
||||||
|
constexpr static qreal qreal_min = std::numeric_limits<qreal>::min();
|
||||||
|
|
||||||
class tst_QMargins : public QObject
|
class tst_QMargins : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private slots:
|
private slots:
|
||||||
|
void comparison_data();
|
||||||
|
void comparison();
|
||||||
|
|
||||||
void getSetCheck();
|
void getSetCheck();
|
||||||
#ifndef QT_NO_DATASTREAM
|
#ifndef QT_NO_DATASTREAM
|
||||||
void dataStreamCheck();
|
void dataStreamCheck();
|
||||||
@ -65,6 +71,46 @@ private slots:
|
|||||||
void toMarginsF();
|
void toMarginsF();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void tst_QMargins::comparison_data()
|
||||||
|
{
|
||||||
|
QTest::addColumn<QMarginsF>("lhs");
|
||||||
|
QTest::addColumn<QMarginsF>("rhs");
|
||||||
|
QTest::addColumn<bool>("result");
|
||||||
|
QTest::addColumn<bool>("floatResult");
|
||||||
|
QTest::addColumn<bool>("mixedResult");
|
||||||
|
|
||||||
|
auto row = [](const QMarginsF &lhs, const QMarginsF &rhs, bool res, bool fRes, bool mRes) {
|
||||||
|
QString str;
|
||||||
|
QDebug dbg(&str);
|
||||||
|
dbg.nospace() << "(" << lhs.left() << ", " << lhs.top() << ", " << lhs.right() << ", "
|
||||||
|
<< lhs.bottom() << ") vs (" << rhs.left() << ", " << rhs.top() << ", "
|
||||||
|
<< rhs.right() << ", " << rhs.bottom() << ")";
|
||||||
|
QTest::addRow("%s", str.toLatin1().constData()) << lhs << rhs << res << fRes << mRes;
|
||||||
|
};
|
||||||
|
|
||||||
|
row(QMarginsF(0.0, 0.0, 0.0, 0.0), QMarginsF(0.0, 0.0, 0.0, 0.0), true, true, true);
|
||||||
|
row(QMarginsF(qreal_min, -qreal_min, -qreal_min, qreal_min), QMarginsF(0.0, 0.0, 0.0, 0.0), true, true, true);
|
||||||
|
row(QMarginsF(1.0, 2.0, 3.0, 4.0), QMarginsF(1.1, 2.1, 2.9, 3.9), true, false, true);
|
||||||
|
row(QMarginsF(1.5, 2.5, 3.0, 4.0), QMarginsF(1.1, 2.1, 2.9, 3.9), false, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QMargins::comparison()
|
||||||
|
{
|
||||||
|
QFETCH(const QMarginsF, lhs);
|
||||||
|
QFETCH(const QMarginsF, rhs);
|
||||||
|
QFETCH(const bool, result);
|
||||||
|
QFETCH(const bool, floatResult);
|
||||||
|
QFETCH(const bool, mixedResult);
|
||||||
|
|
||||||
|
QT_TEST_EQUALITY_OPS(lhs, rhs, floatResult);
|
||||||
|
|
||||||
|
const QMargins lhsInt = lhs.toMargins();
|
||||||
|
const QMargins rhsInt = rhs.toMargins();
|
||||||
|
QT_TEST_EQUALITY_OPS(lhsInt, rhsInt, result);
|
||||||
|
|
||||||
|
QT_TEST_EQUALITY_OPS(lhs, rhsInt, mixedResult);
|
||||||
|
}
|
||||||
|
|
||||||
// Testing get/set functions
|
// Testing get/set functions
|
||||||
void tst_QMargins::getSetCheck()
|
void tst_QMargins::getSetCheck()
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user