diff options
author | Tatiana Borisova <tatiana.borisova@qt.io> | 2024-03-15 17:23:16 +0100 |
---|---|---|
committer | Tatiana Borisova <tatiana.borisova@qt.io> | 2024-03-21 23:43:35 +0100 |
commit | 2499de88744c493bebda25c0135bd623ccf35729 (patch) | |
tree | 8ed42ea563b4c897f2b16e970283ffcc94444933 | |
parent | 587003c3ccf6f8abab9aa6e8131f5ff6ce368d8a (diff) |
QJsonArray: use new comparison helper macros
Replace public operators operator==(), operator!=() of
QJsonArray to friend methods comparesEqual().
Use QT_CORE_REMOVED_SINCE and removed_api.cpp to get rid of current
comparison methods and replace them with a friend.
Add friend method comparesEqual(QJsonArray, QJsonValue)
to the QJsonArray class, to support comparison between QJsonArray
and QJsonValue elements, see test-case fromToVariantConversions()
Task-number: QTBUG-120300
Change-Id: I8440ca0761bede8551ff792bfa7f22e47b56fa79
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r-- | src/corelib/compat/removed_api.cpp | 12 | ||||
-rw-r--r-- | src/corelib/serialization/qjsonarray.cpp | 42 | ||||
-rw-r--r-- | src/corelib/serialization/qjsonarray.h | 11 | ||||
-rw-r--r-- | tests/auto/corelib/serialization/json/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/auto/corelib/serialization/json/tst_qtjson.cpp | 40 |
5 files changed, 88 insertions, 18 deletions
diff --git a/src/corelib/compat/removed_api.cpp b/src/corelib/compat/removed_api.cpp index 5dbe213cc8..9b0dd81b30 100644 --- a/src/corelib/compat/removed_api.cpp +++ b/src/corelib/compat/removed_api.cpp @@ -959,6 +959,18 @@ bool QFileInfo::operator==(const QFileInfo &fileinfo) const return comparesEqual(*this, fileinfo); } +#include "qjsonarray.h" + +bool QJsonArray::operator==(const QJsonArray &other) const +{ + return comparesEqual(*this, other); +} + +bool QJsonArray::operator!=(const QJsonArray &other) const +{ + return !comparesEqual(*this, other); +} + #if QT_CONFIG(processenvironment) #include "qprocess.h" // inlined API diff --git a/src/corelib/serialization/qjsonarray.cpp b/src/corelib/serialization/qjsonarray.cpp index 2a660680b9..3ed91d4d0a 100644 --- a/src/corelib/serialization/qjsonarray.cpp +++ b/src/corelib/serialization/qjsonarray.cpp @@ -28,6 +28,10 @@ QT_BEGIN_NAMESPACE \brief The QJsonArray class encapsulates a JSON array. + \compares equality + \compareswith equality QJsonValue + \endcompareswith + A JSON array is a list of values. The list can be manipulated by inserting and removing QJsonValue's from the array. @@ -471,36 +475,40 @@ QJsonValue QJsonArray::operator[](qsizetype i) const return at(i); } -/*! - Returns \c true if this array is equal to \a other. - */ -bool QJsonArray::operator==(const QJsonArray &other) const +bool comparesEqual(const QJsonArray &lhs, const QJsonArray &rhs) noexcept { - if (a == other.a) + if (lhs.a == rhs.a) return true; - if (!a) - return !other.a->elements.size(); - if (!other.a) - return !a->elements.size(); - if (a->elements.size() != other.a->elements.size()) + if (!lhs.a) + return !rhs.a->elements.size(); + if (!rhs.a) + return !lhs.a->elements.size(); + if (lhs.a->elements.size() != rhs.a->elements.size()) return false; - for (qsizetype i = 0; i < a->elements.size(); ++i) { - if (a->valueAt(i) != other.a->valueAt(i)) + for (qsizetype i = 0; i < lhs.a->elements.size(); ++i) { + if (lhs.a->valueAt(i) != rhs.a->valueAt(i)) return false; } return true; } -/*! - Returns \c true if this array is not equal to \a other. - */ -bool QJsonArray::operator!=(const QJsonArray &other) const +bool comparesEqual(const QJsonArray &lhs, const QJsonValue &rhs) noexcept { - return !(*this == other); + return lhs == rhs.toArray(); } +/*! \fn bool QJsonArray::operator==(const QJsonArray &lhs, const QJsonArray &rhs) + + Returns \c true if \a lhs array is equal to \a rhs, \c false otherwise. +*/ + +/*! \fn bool QJsonArray::operator!=(const QJsonArray &lhs, const QJsonArray &rhs) + + Returns \c true if \a lhs array is not equal to \a rhs, \c false otherwise. +*/ + /*! \fn QJsonArray::iterator QJsonArray::begin() Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first item in diff --git a/src/corelib/serialization/qjsonarray.h b/src/corelib/serialization/qjsonarray.h index af4ac9fd37..a2baa7738c 100644 --- a/src/corelib/serialization/qjsonarray.h +++ b/src/corelib/serialization/qjsonarray.h @@ -60,9 +60,10 @@ public: QJsonValueRef operator[](qsizetype i); QJsonValue operator[](qsizetype i) const; +#if QT_CORE_REMOVED_SINCE(6, 8) bool operator==(const QJsonArray &other) const; bool operator!=(const QJsonArray &other) const; - +#endif void swap(QJsonArray &other) noexcept { a.swap(other.a); @@ -225,6 +226,14 @@ private: friend class QCborArray; friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonArray &); + friend Q_CORE_EXPORT bool comparesEqual(const QJsonArray &lhs, + const QJsonArray &rhs) noexcept; + + friend Q_CORE_EXPORT bool comparesEqual(const QJsonArray &lhs, + const QJsonValue &rhs) noexcept; + Q_DECLARE_EQUALITY_COMPARABLE(QJsonArray) + Q_DECLARE_EQUALITY_COMPARABLE(QJsonArray, QJsonValue) + QJsonArray(QCborContainerPrivate *array); bool detach(qsizetype reserve = 0); diff --git a/tests/auto/corelib/serialization/json/CMakeLists.txt b/tests/auto/corelib/serialization/json/CMakeLists.txt index 106b91daea..c73a99a3b8 100644 --- a/tests/auto/corelib/serialization/json/CMakeLists.txt +++ b/tests/auto/corelib/serialization/json/CMakeLists.txt @@ -26,6 +26,7 @@ qt_internal_add_test(tst_json tst_qtjson.cpp LIBRARIES Qt::CorePrivate + Qt::TestPrivate TESTDATA ${json_resource_files} ) diff --git a/tests/auto/corelib/serialization/json/tst_qtjson.cpp b/tests/auto/corelib/serialization/json/tst_qtjson.cpp index 783138945e..cdc51ec140 100644 --- a/tests/auto/corelib/serialization/json/tst_qtjson.cpp +++ b/tests/auto/corelib/serialization/json/tst_qtjson.cpp @@ -3,6 +3,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QTest> +#include <QtTest/private/qcomparisontesthelper_p.h> #include <QMap> #include <QVariantList> @@ -27,6 +28,7 @@ class tst_QtJson: public QObject private Q_SLOTS: void initTestCase(); + void compareCompiles(); void testValueSimple(); void testNumbers(); void testNumbers_2(); @@ -47,6 +49,8 @@ private Q_SLOTS: void testArrayNested(); void testArrayNestedEmpty(); void testArrayComfortOperators(); + void testArrayEquality_data(); + void testArrayEquality(); void testObjectNestedEmpty(); void testValueRef(); @@ -169,6 +173,12 @@ void tst_QtJson::initTestCase() testDataDir = QCoreApplication::applicationDirPath(); } +void tst_QtJson::compareCompiles() +{ + QTestPrivate::testEqualityOperatorsCompile<QJsonArray>(); + QTestPrivate::testEqualityOperatorsCompile<QJsonArray, QJsonValue>(); +} + void tst_QtJson::testValueSimple() { QJsonObject object; @@ -901,6 +911,36 @@ void tst_QtJson::testObjectNestedEmpty() QCOMPARE(object.value("inner").type(), QJsonValue::Object); } +void tst_QtJson::testArrayEquality_data() +{ + QTest::addColumn<QJsonArray>("array1"); + QTest::addColumn<QJsonArray>("array2"); + QTest::addColumn<bool>("expectedResult"); + QTest::addRow("QJsonArray(), QJsonArray{665, 666, 667}") + << QJsonArray() << QJsonArray{665, 666, 667} << false; + QTest::addRow("QJsonArray(), QJsonArray{}") + << QJsonArray() << QJsonArray{} <<true; + QTest::addRow("QJsonArray(), QJsonArray{123, QLatin1String(\"foo\")}") + << QJsonArray() << QJsonArray{123, QLatin1String("foo")} << false; + QTest::addRow( + "QJsonArray{123,QLatin1String(\"foo\")}, QJsonArray{123,QLatin1String(\"foo\")}") + << QJsonArray{123, QLatin1String("foo")} + << QJsonArray{123, QLatin1String("foo")} + << true; +} + +void tst_QtJson::testArrayEquality() +{ + QFETCH(QJsonArray, array1); + QFETCH(QJsonArray, array2); + QFETCH(bool, expectedResult); + + QJsonValue value = QJsonValue(array1); + + QT_TEST_EQUALITY_OPS(array1, array2, expectedResult); + QT_TEST_EQUALITY_OPS(value, array2, expectedResult); +} + void tst_QtJson::testArrayComfortOperators() { QJsonArray first; |