QUuid, GUID: use new comparison helper macros

Replace public friend operators operator==(), operator!=(),
operator<(), etc of QUuid and GUID with friend methods
comparesEqual() / compareThreeWay().

Use Q_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE, because
the (in)equality operators are constexpr.
And then we use helper macros, because the other relational
operators are not constexpr. Cannot make relational operators
constexpr, because it requires to make variant() and isNull() methods
constexpr and QT_CORE_INLINE_SINCE. But the experiments
show that it does not work with adding constexpr to
QT_CORE_INLINE_SINCE.

Put relational operators under !QT_CORE_REMOVED_SINCE(6, 8) to prevent
an ambiguity. On Windows the metatype for QUuid is created
in removed_api.cpp. That leads to an ambiguity, and as a result
the compiler fails to create the equals methods of QMetaTypeInterface.
This, in turn, leads to the failed comparisons.
The usage of !QT_CORE_REMOVED_SINCE(6, 8) solves the problem.

Task-number: QTBUG-120304
Change-Id: I640bdeb8f1f7306ba06b9e4193d008cf2bb6dbfb
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
bb10
Tatiana Borisova 2024-04-22 19:40:20 +02:00
parent bd0a6e8307
commit ef964c254c
5 changed files with 153 additions and 98 deletions

View File

@ -1129,6 +1129,18 @@ bool QUrlQuery::operator==(const QUrlQuery &other) const
return comparesEqual(*this, other);
}
#include "quuid.h"
bool QUuid::operator<(const QUuid &other) const noexcept
{
return is_lt(compareThreeWay(*this, other));
}
bool QUuid::operator>(const QUuid &other) const noexcept
{
return is_gt(compareThreeWay(*this, other));
}
#include "qxmlstream.h" // inlined API
// #include "qotherheader.h"

View File

@ -142,6 +142,11 @@ static QUuid createFromName(const QUuid &ns, const QByteArray &baseData, QCrypto
\reentrant
\compares strong
\compareswith strong GUID
\note Comparison with GUID is Windows-only.
\endcompareswith
Using \e{U}niversally \e{U}nique \e{ID}entifiers (UUID) is a
standard way to uniquely identify entities in a distributed
computing environment. A UUID is a 16-byte (128-bit) number
@ -600,16 +605,16 @@ QUuid QUuid::fromRfc4122(QByteArrayView bytes) noexcept
}
/*!
\fn bool QUuid::operator==(const QUuid &other) const
\fn bool QUuid::operator==(const QUuid &lhs, const QUuid &rhs)
Returns \c true if this QUuid and the \a other QUuid are identical;
Returns \c true if \a lhs QUuid and the \a rhs QUuid are identical;
otherwise returns \c false.
*/
/*!
\fn bool QUuid::operator!=(const QUuid &other) const
\fn bool QUuid::operator!=(const QUuid &lhs, const QUuid &rhs)
Returns \c true if this QUuid and the \a other QUuid are different;
Returns \c true if \a lhs QUuid and the \a rhs QUuid are different;
otherwise returns \c false.
*/
@ -898,51 +903,31 @@ QUuid::Version QUuid::version() const noexcept
}
/*!
\fn bool QUuid::operator<(const QUuid &other) const
\fn bool QUuid::operator<(const QUuid &lhs, const QUuid &rhs)
Returns \c true if this QUuid has the same \l{Variant field}
{variant field} as the \a other QUuid and is lexicographically
\e{before} the \a other QUuid. If the \a other QUuid has a
Returns \c true if \a lhs QUuid has the same \l{Variant field}
{variant field} as the \a rhs QUuid and is lexicographically
\e{before} the \a rhs QUuid. If the \a rhs QUuid has a
different variant field, the return value is determined by
comparing the two \l{QUuid::Variant} {variants}.
\sa variant()
*/
bool QUuid::operator<(const QUuid &other) const noexcept
{
if (variant() != other.variant())
return variant() < other.variant();
#define ISLESS(f1, f2) if (f1!=f2) return (f1<f2);
ISLESS(data1, other.data1);
ISLESS(data2, other.data2);
ISLESS(data3, other.data3);
for (int n = 0; n < 8; n++) {
ISLESS(data4[n], other.data4[n]);
}
#undef ISLESS
return false;
}
/*!
\fn bool QUuid::operator>(const QUuid &other) const
\fn bool QUuid::operator>(const QUuid &lhs, const QUuid &rhs)
Returns \c true if this QUuid has the same \l{Variant field}
{variant field} as the \a other QUuid and is lexicographically
\e{after} the \a other QUuid. If the \a other QUuid has a
Returns \c true if \a lhs QUuid has the same \l{Variant field}
{variant field} as the \a rhs QUuid and is lexicographically
\e{after} the \a rhs QUuid. If the \a rhs QUuid has a
different variant field, the return value is determined by
comparing the two \l{QUuid::Variant} {variants}.
\sa variant()
*/
bool QUuid::operator>(const QUuid &other) const noexcept
{
return other < *this;
}
/*!
\fn bool operator<=(const QUuid &lhs, const QUuid &rhs)
\relates QUuid
\fn bool QUuid::operator<=(const QUuid &lhs, const QUuid &rhs)
\since 5.5
Returns \c true if \a lhs has the same \l{Variant field}
@ -955,8 +940,7 @@ bool QUuid::operator>(const QUuid &other) const noexcept
*/
/*!
\fn bool operator>=(const QUuid &lhs, const QUuid &rhs)
\relates QUuid
\fn bool QUuid::operator>=(const QUuid &lhs, const QUuid &rhs)
\since 5.5
Returns \c true if \a lhs has the same \l{Variant field}
@ -1009,17 +993,17 @@ QUuid QUuid::createUuid()
#endif // !Q_OS_WIN && !QT_BOOTSTRAPPED
/*!
\fn bool QUuid::operator==(const GUID &guid) const
\fn bool QUuid::operator==(const QUuid &lhs, const GUID &rhs)
Returns \c true if this UUID is equal to the Windows GUID \a guid;
Returns \c true if \a lhs UUID is equal to the Windows GUID \a rhs;
otherwise returns \c false.
*/
/*!
\fn bool QUuid::operator!=(const GUID &guid) const
\fn bool QUuid::operator!=(const QUuid &lhs, const GUID &rhs)
Returns \c true if this UUID is not equal to the Windows GUID \a
guid; otherwise returns \c false.
Returns \c true if \a lhs UUID is not equal to the Windows GUID \a rhs;
otherwise returns \c false.
*/
#ifndef QT_NO_DEBUG_STREAM

View File

@ -4,6 +4,7 @@
#ifndef QUUID_H
#define QUUID_H
#include <QtCore/qcompare.h>
#include <QtCore/qendian.h>
#include <QtCore/qstring.h>
@ -122,27 +123,59 @@ QT_WARNING_POP
constexpr quint128 toUInt128(QSysInfo::Endian order = QSysInfo::BigEndian) const noexcept;
#endif
constexpr bool operator==(const QUuid &orig) const noexcept
private:
friend constexpr bool comparesEqual(const QUuid &lhs, const QUuid &rhs) noexcept
{
if (data1 != orig.data1 || data2 != orig.data2 ||
data3 != orig.data3)
if (lhs.data1 != rhs.data1 || lhs.data2 != rhs.data2 || lhs.data3 != rhs.data3)
return false;
for (uint i = 0; i < 8; i++)
if (data4[i] != orig.data4[i])
for (uint i = 0; i < 8; i++) {
if (lhs.data4[i] != rhs.data4[i])
return false;
}
return true;
}
friend Qt::strong_ordering compareThreeWay(const QUuid &lhs, const QUuid &rhs) noexcept
{
if (lhs.variant() != rhs.variant())
return Qt::compareThreeWay(lhs.variant(), rhs.variant());
#define CHECK(f1, f2) if ((f1) != (f2)) return Qt::compareThreeWay(f1, f2)
CHECK(lhs.data1, rhs.data1);
CHECK(lhs.data2, rhs.data2);
CHECK(lhs.data3, rhs.data3);
#undef CHECK
int c = std::memcmp(lhs.data4, rhs.data4, sizeof(lhs.data4));
return Qt::compareThreeWay(c, 0);
}
public:
/* To prevent a meta-type creation ambiguity on Windows, we put comparison
macros under NOT QT_CORE_REMOVED_SINCE(6, 8) part. */
#if QT_CORE_REMOVED_SINCE(6, 8)
constexpr bool operator==(const QUuid &orig) const noexcept
{
return comparesEqual(*this, orig);
}
constexpr bool operator!=(const QUuid &orig) const noexcept
{
return !(*this == orig);
return !operator==(orig);
}
bool operator<(const QUuid &other) const noexcept;
bool operator>(const QUuid &other) const noexcept;
#else
private:
#if defined(__cpp_lib_three_way_comparison) && !defined(Q_QDOC)
QT_DECLARE_3WAY_HELPER_STRONG(QUuid, QUuid, /* non-constexpr */, /* no attributes */)
#else
QT_DECLARE_ORDERING_HELPER_STRONG(QUuid, QUuid, /* non-constexpr */, /* no attributes */)
#endif // defined(__cpp_lib_three_way_comparison) && !defined(Q_QDOC)
Q_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE(QUuid)
#endif // QT_CORE_REMOVED_SINCE(6, 8)
public:
#if defined(Q_OS_WIN) || defined(Q_QDOC)
// On Windows we have a type GUID that is used by the platform API, so we
// provide convenience operators to cast from and to this type.
@ -162,17 +195,29 @@ QT_WARNING_POP
GUID guid = { data1, data2, data3, { data4[0], data4[1], data4[2], data4[3], data4[4], data4[5], data4[6], data4[7] } };
return guid;
}
private:
friend constexpr bool comparesEqual(const QUuid &lhs, const GUID &rhs) noexcept
{
return comparesEqual(lhs, QUuid(rhs));
}
public:
/* To prevent a meta-type creation ambiguity on Windows, we put comparison
macros under NOT QT_CORE_REMOVED_SINCE(6, 8) part. */
#if QT_CORE_REMOVED_SINCE(6, 8)
constexpr bool operator==(const GUID &guid) const noexcept
{
return *this == QUuid(guid);
return comparesEqual(*this, QUuid(guid));
}
constexpr bool operator!=(const GUID &guid) const noexcept
{
return !(*this == guid);
return !operator==(guid);
}
#else
Q_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE(QUuid, GUID)
#endif // !QT_CORE_REMOVED_SINCE(6, 8)
#endif
public:
static QUuid createUuid();
#ifndef QT_BOOTSTRAPPED
static QUuid createUuidV3(const QUuid &ns, const QByteArray &baseData);
@ -291,11 +336,6 @@ constexpr quint128 QUuid::toUInt128(QSysInfo::Endian order) const noexcept
}
#endif
inline bool operator<=(const QUuid &lhs, const QUuid &rhs) noexcept
{ return !(rhs < lhs); }
inline bool operator>=(const QUuid &lhs, const QUuid &rhs) noexcept
{ return !(lhs < rhs); }
#if defined(Q_QDOC)
// provide fake declarations of qXXXEndian() functions, so that qDoc could
// distinguish them from the general template

View File

@ -9,6 +9,8 @@ qt_internal_add_test(tst_quuid
OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../"
SOURCES
../tst_quuid.cpp
LIBRARIES
Qt::TestPrivate
)
## Scopes:

View File

@ -3,6 +3,7 @@
#include <QTest>
#include <QtTest/private/qcomparisontesthelper_p.h>
#if QT_CONFIG(process)
#include <QProcess>
#endif
@ -17,6 +18,7 @@ class tst_QUuid : public QObject
private slots:
void initTestCase();
void compareCompiles();
void fromChar();
void toString();
void fromString_data();
@ -89,20 +91,28 @@ void tst_QUuid::initTestCase()
uuidD = QUuid(0x21f7f8de, 0x8051, 0x5b89, 0x86, 0x80, 0x01, 0x95, 0xef, 0x79, 0x8b, 0x6a);
}
void tst_QUuid::compareCompiles()
{
QTestPrivate::testAllComparisonOperatorsCompile<QUuid>();
#if defined(Q_OS_WIN)
QTestPrivate::testEqualityOperatorsCompile<QUuid, GUID>();
#endif
}
void tst_QUuid::fromChar()
{
QCOMPARE(uuidA, QUuid("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}"));
QCOMPARE(uuidA, QUuid("fc69b59e-cc34-4436-a43c-ee95d128b8c5}"));
QCOMPARE(uuidA, QUuid("{fc69b59e-cc34-4436-a43c-ee95d128b8c5"));
QCOMPARE(uuidA, QUuid("fc69b59e-cc34-4436-a43c-ee95d128b8c5"));
QCOMPARE(QUuid(), QUuid("{fc69b59e-cc34-4436-a43c-ee95d128b8c"));
QCOMPARE(QUuid(), QUuid("{fc69b59e-cc34"));
QCOMPARE(QUuid(), QUuid("fc69b59e-cc34-"));
QCOMPARE(QUuid(), QUuid("fc69b59e-cc34"));
QCOMPARE(QUuid(), QUuid("cc34"));
QCOMPARE(QUuid(), QUuid(nullptr));
QT_TEST_EQUALITY_OPS(uuidA, QUuid("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}"), true);
QT_TEST_EQUALITY_OPS(uuidA, QUuid("fc69b59e-cc34-4436-a43c-ee95d128b8c5}"), true);
QT_TEST_EQUALITY_OPS(uuidA, QUuid("{fc69b59e-cc34-4436-a43c-ee95d128b8c5"), true);
QT_TEST_EQUALITY_OPS(uuidA, QUuid("fc69b59e-cc34-4436-a43c-ee95d128b8c5"), true);
QT_TEST_EQUALITY_OPS(QUuid(), QUuid("{fc69b59e-cc34-4436-a43c-ee95d128b8c"), true);
QT_TEST_EQUALITY_OPS(QUuid(), QUuid("{fc69b59e-cc34"), true);
QT_TEST_EQUALITY_OPS(QUuid(), QUuid("fc69b59e-cc34-"), true);
QT_TEST_EQUALITY_OPS(QUuid(), QUuid("fc69b59e-cc34"), true);
QT_TEST_EQUALITY_OPS(QUuid(), QUuid("cc34"), true);
QT_TEST_EQUALITY_OPS(QUuid(), QUuid(nullptr), true);
QCOMPARE(uuidB, QUuid(QString("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}")));
QT_TEST_EQUALITY_OPS(uuidB, QUuid(QString("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}")), true);
}
void tst_QUuid::toString()
@ -162,21 +172,21 @@ void tst_QUuid::fromString()
const auto inputL1 = input.toLatin1();
const auto inputU8 = input.toUtf8();
QCOMPARE(expected, QUuid(input));
QCOMPARE(expected, QUuid(inputU8));
QCOMPARE(expected, QUuid(inputL1));
QT_TEST_EQUALITY_OPS(expected, QUuid(input), true);
QT_TEST_EQUALITY_OPS(expected, QUuid(inputU8), true);
QT_TEST_EQUALITY_OPS(expected, QUuid(inputL1), true);
QCOMPARE(expected, QUuid::fromString(input));
QT_TEST_EQUALITY_OPS(expected, QUuid::fromString(input), true);
// for QLatin1String, construct one whose data() is not NUL-terminated:
const auto longerInputL1 = inputL1 + '5'; // the '5' makes the premature end check incorrectly succeed
const auto inputL1S = QLatin1String(longerInputL1.data(), inputL1.size());
QCOMPARE(expected, QUuid::fromString(inputL1S));
QT_TEST_EQUALITY_OPS(expected, QUuid::fromString(inputL1S), true);
// for QUtf8StringView, too:
const auto longerInputU8 = inputU8 + '5'; // the '5' makes the premature end check incorrectly succeed
const auto inputU8S = QUtf8StringView(longerInputU8.data(), inputU8.size());
QCOMPARE(expected, QUuid::fromString(inputU8S));
QT_TEST_EQUALITY_OPS(expected, QUuid::fromString(inputU8S), true);
}
void tst_QUuid::toByteArray()
@ -196,27 +206,30 @@ void tst_QUuid::toByteArray()
void tst_QUuid::fromByteArray()
{
QCOMPARE(uuidA, QUuid(QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}")));
QCOMPARE(uuidA, QUuid(QByteArray("fc69b59e-cc34-4436-a43c-ee95d128b8c5}")));
QCOMPARE(uuidA, QUuid(QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c5")));
QCOMPARE(uuidA, QUuid(QByteArray("fc69b59e-cc34-4436-a43c-ee95d128b8c5")));
QCOMPARE(QUuid(), QUuid(QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c")));
QT_TEST_EQUALITY_OPS(uuidA, QUuid(QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}")), true);
QT_TEST_EQUALITY_OPS(uuidA, QUuid(QByteArray("fc69b59e-cc34-4436-a43c-ee95d128b8c5}")), true);
QT_TEST_EQUALITY_OPS(uuidA, QUuid(QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c5")), true);
QT_TEST_EQUALITY_OPS(uuidA, QUuid(QByteArray("fc69b59e-cc34-4436-a43c-ee95d128b8c5")), true);
QT_TEST_EQUALITY_OPS(QUuid(), QUuid(QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c")), true);
QCOMPARE(uuidB, QUuid(QByteArray("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}")));
QT_TEST_EQUALITY_OPS(uuidB, QUuid(QByteArray("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}")), true);
}
void tst_QUuid::toRfc4122()
{
QCOMPARE(uuidA.toRfc4122(), QByteArray::fromHex("fc69b59ecc344436a43cee95d128b8c5"));
QCOMPARE(uuidB.toRfc4122(), QByteArray::fromHex("1ab6e93ab1cb4a87ba47ec7e99039a7b"));
}
void tst_QUuid::fromRfc4122()
{
QCOMPARE(uuidA, QUuid::fromRfc4122(QByteArray::fromHex("fc69b59ecc344436a43cee95d128b8c5")));
QT_TEST_EQUALITY_OPS(
uuidA,
QUuid::fromRfc4122(QByteArray::fromHex("fc69b59ecc344436a43cee95d128b8c5")), true);
QCOMPARE(uuidB, QUuid::fromRfc4122(QByteArray::fromHex("1ab6e93ab1cb4a87ba47ec7e99039a7b")));
QT_TEST_EQUALITY_OPS(
uuidB, QUuid::fromRfc4122(QByteArray::fromHex("1ab6e93ab1cb4a87ba47ec7e99039a7b")),
true);
}
void tst_QUuid::id128()
@ -234,15 +247,15 @@ void tst_QUuid::id128()
0xba, 0x47, 0xec, 0x7e, 0x99, 0x03, 0x9a, 0x7b,
} };
QCOMPARE(QUuid(bytesA), uuidA);
QCOMPARE(QUuid(bytesB), uuidB);
QT_TEST_EQUALITY_OPS(QUuid(bytesA), uuidA, true);
QT_TEST_EQUALITY_OPS(QUuid(bytesB), uuidB, true);
QVERIFY(memcmp(uuidA.toBytes().data, bytesA.data, sizeof(QUuid::Id128Bytes)) == 0);
QVERIFY(memcmp(uuidB.toBytes().data, bytesB.data, sizeof(QUuid::Id128Bytes)) == 0);
QUuid::Id128Bytes leBytesA = {};
for (int i = 0; i < 16; i++)
leBytesA.data[15 - i] = bytesA.data[i];
QCOMPARE(QUuid(leBytesA, QSysInfo::LittleEndian), uuidA);
QT_TEST_EQUALITY_OPS(QUuid(leBytesA, QSysInfo::LittleEndian), uuidA, true);
QVERIFY(memcmp(uuidA.toBytes(QSysInfo::LittleEndian).data, leBytesA.data, sizeof(leBytesA)) == 0);
// check the new q{To,From}{Big,Little}Endian() overloads
@ -271,16 +284,16 @@ void tst_QUuid::uint128()
constexpr QUuid uuid = QUuid::fromUInt128(be);
static_assert(uuid.toUInt128() == be, "Round-trip through QUuid failed");
QCOMPARE(uuid, uuidA);
QT_TEST_EQUALITY_OPS(uuid, uuidA, true);
QCOMPARE(uuid.toUInt128(), be);
quint128 le = qFromBigEndian(be);
QCOMPARE(uuid.toUInt128(QSysInfo::LittleEndian), le);
QCOMPARE(QUuid::fromUInt128(le, QSysInfo::LittleEndian), uuidA);
QT_TEST_EQUALITY_OPS(QUuid::fromUInt128(le, QSysInfo::LittleEndian), uuidA, true);
QUuid::Id128Bytes bytes = { .data128 = { qToBigEndian(u) } };
QUuid uuid2(bytes);
QCOMPARE(uuid2, uuid);
QT_TEST_EQUALITY_OPS(uuid2, uuid, true);
// verify that toBytes() and toUInt128() provide bytewise similar result
constexpr quint128 val = uuid.toUInt128();
@ -294,11 +307,11 @@ void tst_QUuid::uint128()
void tst_QUuid::createUuidV3OrV5()
{
//"www.widgets.com" is also from RFC4122
QCOMPARE(uuidC, QUuid::createUuidV3(uuidNS, QByteArray("www.widgets.com")));
QCOMPARE(uuidC, QUuid::createUuidV3(uuidNS, QString("www.widgets.com")));
QT_TEST_EQUALITY_OPS(uuidC, QUuid::createUuidV3(uuidNS, QByteArray("www.widgets.com")), true);
QT_TEST_EQUALITY_OPS(uuidC, QUuid::createUuidV3(uuidNS, QString("www.widgets.com")), true);
QCOMPARE(uuidD, QUuid::createUuidV5(uuidNS, QByteArray("www.widgets.com")));
QCOMPARE(uuidD, QUuid::createUuidV5(uuidNS, QString("www.widgets.com")));
QT_TEST_EQUALITY_OPS(uuidD, QUuid::createUuidV5(uuidNS, QByteArray("www.widgets.com")), true);
QT_TEST_EQUALITY_OPS(uuidD, QUuid::createUuidV5(uuidNS, QString("www.widgets.com")), true);
}
void tst_QUuid::check_QDataStream()
@ -314,7 +327,7 @@ void tst_QUuid::check_QDataStream()
QDataStream in(&ar,QIODevice::ReadOnly);
in.setByteOrder(QDataStream::BigEndian);
in >> tmp;
QCOMPARE(uuidA, tmp);
QT_TEST_EQUALITY_OPS(uuidA, tmp, true);
}
{
QDataStream out(&ar,QIODevice::WriteOnly);
@ -325,7 +338,7 @@ void tst_QUuid::check_QDataStream()
QDataStream in(&ar,QIODevice::ReadOnly);
in.setByteOrder(QDataStream::LittleEndian);
in >> tmp;
QCOMPARE(uuidA, tmp);
QT_TEST_EQUALITY_OPS(uuidA, tmp, true);
}
}
@ -340,14 +353,14 @@ void tst_QUuid::isNull()
void tst_QUuid::equal()
{
QVERIFY( !(uuidA == uuidB) );
QT_TEST_EQUALITY_OPS(uuidA, uuidB, false);
QUuid copy(uuidA);
QCOMPARE(uuidA, copy);
QT_TEST_EQUALITY_OPS(uuidA, copy, true);
QUuid assigned;
assigned = uuidA;
QCOMPARE(uuidA, assigned);
QT_TEST_EQUALITY_OPS(uuidA, assigned, true);
}
@ -384,10 +397,12 @@ void tst_QUuid::less()
QVERIFY( uuidB <= uuidA);
QVERIFY(!(uuidA < uuidB) );
QVERIFY(!(uuidA <= uuidB));
QT_TEST_ALL_COMPARISON_OPS(uuidB, uuidA, Qt::strong_ordering::less);
QUuid null_uuid;
QVERIFY(null_uuid < uuidA); // Null uuid is always less than a valid one
QVERIFY(null_uuid <= uuidA);
QT_TEST_ALL_COMPARISON_OPS(null_uuid, uuidA, Qt::strong_ordering::less);
QVERIFY(null_uuid <= null_uuid);
QVERIFY(uuidA <= uuidA);
@ -400,6 +415,7 @@ void tst_QUuid::more()
QVERIFY( uuidA >= uuidB);
QVERIFY(!(uuidB > uuidA));
QVERIFY(!(uuidB >= uuidA));
QT_TEST_ALL_COMPARISON_OPS(uuidA, uuidB, Qt::strong_ordering::greater);
QUuid null_uuid;
QVERIFY(!(null_uuid > uuidA)); // Null uuid is always less than a valid one
@ -407,6 +423,7 @@ void tst_QUuid::more()
QVERIFY(null_uuid >= null_uuid);
QVERIFY(uuidA >= uuidA);
QT_TEST_ALL_COMPARISON_OPS(uuidA, uuidA, Qt::strong_ordering::equal);
}
@ -512,7 +529,7 @@ void tst_QUuid::qvariant()
QUuid uuid2 = v.value<QUuid>();
QVERIFY(!uuid2.isNull());
QCOMPARE(uuid, uuid2);
QT_TEST_EQUALITY_OPS(uuid, uuid2, true);
}
void tst_QUuid::qvariant_conversion()
@ -544,7 +561,7 @@ void tst_QUuid::qvariant_conversion()
QVariant sv = QVariant::fromValue(uuid.toByteArray());
QCOMPARE(sv.metaType(), QMetaType(QMetaType::QByteArray));
QVERIFY(sv.canConvert<QUuid>());
QCOMPARE(sv.value<QUuid>(), uuid);
QT_TEST_EQUALITY_OPS(sv.value<QUuid>(), uuid, true);
}
}