diff options
-rw-r--r-- | src/corelib/tools/qmargins.cpp | 16 | ||||
-rw-r--r-- | src/corelib/tools/qmargins.h | 12 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qmargins/tst_qmargins.cpp | 45 |
3 files changed, 72 insertions, 1 deletions
diff --git a/src/corelib/tools/qmargins.cpp b/src/corelib/tools/qmargins.cpp index fbb431e7a4..c4cd0da30d 100644 --- a/src/corelib/tools/qmargins.cpp +++ b/src/corelib/tools/qmargins.cpp @@ -754,6 +754,22 @@ QDebug operator<<(QDebug dbg, const QMargins &m) \sa QMarginsF(), QMargins::toMarginsF() */ +/*! + \fn bool QMarginsF::qFuzzyCompare(const QMarginsF &lhs, const QMarginsF &rhs) + \since 6.8 + + Returns \c true if \a lhs is approximately equal to \a rhs; + otherwise returns \c false. +*/ + +/*! + \fn bool QMarginsF::qFuzzyIsNull(const QMarginsF &margins) + \since 6.8 + + Returns \c true if all components of margsins \a margins are + approximately equal to zero; otherwise returns \c false. +*/ + /***************************************************************************** QMarginsF stream functions *****************************************************************************/ diff --git a/src/corelib/tools/qmargins.h b/src/corelib/tools/qmargins.h index feaa91824a..3b29860d66 100644 --- a/src/corelib/tools/qmargins.h +++ b/src/corelib/tools/qmargins.h @@ -302,7 +302,7 @@ private: QT_WARNING_PUSH QT_WARNING_DISABLE_FLOAT_COMPARE - friend constexpr bool comparesEqual(const QMarginsF &lhs, const QMarginsF &rhs) noexcept + friend constexpr bool qFuzzyCompare(const QMarginsF &lhs, const QMarginsF &rhs) noexcept { return ((!lhs.m_left || !rhs.m_left) ? qFuzzyIsNull(lhs.m_left - rhs.m_left) : qFuzzyCompare(lhs.m_left, rhs.m_left)) @@ -314,6 +314,16 @@ private: : qFuzzyCompare(lhs.m_bottom, rhs.m_bottom)); } QT_WARNING_POP + friend constexpr bool qFuzzyIsNull(const QMarginsF &m) noexcept + { + return qFuzzyIsNull(m.m_left) && qFuzzyIsNull(m.m_top) + && qFuzzyIsNull(m.m_right) && qFuzzyIsNull(m.m_bottom); + } + + friend constexpr bool comparesEqual(const QMarginsF &lhs, const QMarginsF &rhs) noexcept + { + return qFuzzyCompare(lhs, rhs); + } Q_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE(QMarginsF) friend constexpr bool comparesEqual(const QMarginsF &lhs, const QMargins &rhs) noexcept diff --git a/tests/auto/corelib/tools/qmargins/tst_qmargins.cpp b/tests/auto/corelib/tools/qmargins/tst_qmargins.cpp index a7d50bf338..dc0b0e4085 100644 --- a/tests/auto/corelib/tools/qmargins/tst_qmargins.cpp +++ b/tests/auto/corelib/tools/qmargins/tst_qmargins.cpp @@ -48,6 +48,12 @@ private slots: void comparison_data(); void comparison(); + void fuzzyComparison_data(); + void fuzzyComparison(); + + void isNull_data(); + void isNull(); + void getSetCheck(); #ifndef QT_NO_DATASTREAM void dataStreamCheck(); @@ -119,6 +125,45 @@ void tst_QMargins::comparison() QT_TEST_EQUALITY_OPS(lhs, rhsInt, mixedResult); } +void tst_QMargins::fuzzyComparison_data() +{ + comparison_data(); +} + +void tst_QMargins::fuzzyComparison() +{ + QFETCH(const QMarginsF, lhs); + QFETCH(const QMarginsF, rhs); + QFETCH(const bool, floatResult); + + QCOMPARE_EQ(qFuzzyCompare(lhs, rhs), floatResult); +} + +void tst_QMargins::isNull_data() +{ + QTest::addColumn<QMarginsF>("margins"); + QTest::addColumn<bool>("result"); + + QTest::newRow("null") << QMarginsF(0.0, 0.0, 0.0, 0.0) << true; + QTest::newRow("non_null_left") << QMarginsF(1.0, 0.0, 0.0, 0.0) << false; + QTest::newRow("non_null_top") << QMarginsF(0.0, 0.5, 0.0, 0.0) << false; + QTest::newRow("non_null_right") << QMarginsF(0.0, 0.0, -2.0, 0.0) << false; + QTest::newRow("non_null_bottom") << QMarginsF(0.0, 0.0, 0.0, -0.6) << false; + QTest::newRow("almost_null") << QMarginsF(qreal_min, -qreal_min, qreal_min, -qreal_min) << true; +} + +void tst_QMargins::isNull() +{ + QFETCH(const QMarginsF, margins); + QFETCH(const bool, result); + + QCOMPARE_EQ(margins.isNull(), result); + QCOMPARE_EQ(qFuzzyIsNull(margins), result); + + const QMargins marginsInt = margins.toMargins(); + QCOMPARE_EQ(marginsInt.isNull(), result); +} + // Testing get/set functions void tst_QMargins::getSetCheck() { |