summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/corelib/tools')
-rw-r--r--tests/auto/corelib/tools/CMakeLists.txt2
-rw-r--r--tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp111
-rw-r--r--tests/auto/corelib/tools/qcryptographichash/tst_qcryptographichash.cpp28
-rw-r--r--tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp62
-rw-r--r--tests/auto/corelib/tools/qsize/CMakeLists.txt2
-rw-r--r--tests/auto/corelib/tools/qsize/tst_qsize.cpp37
-rw-r--r--tests/auto/corelib/tools/qsizef/CMakeLists.txt2
-rw-r--r--tests/auto/corelib/tools/qsizef/tst_qsizef.cpp96
-rw-r--r--tests/auto/corelib/tools/qspan/CMakeLists.txt4
-rw-r--r--tests/auto/corelib/tools/qspan/tst_qspan.cpp67
10 files changed, 325 insertions, 86 deletions
diff --git a/tests/auto/corelib/tools/CMakeLists.txt b/tests/auto/corelib/tools/CMakeLists.txt
index 5cca2e2df6..5d4d4e9998 100644
--- a/tests/auto/corelib/tools/CMakeLists.txt
+++ b/tests/auto/corelib/tools/CMakeLists.txt
@@ -47,7 +47,9 @@ add_subdirectory(qset)
add_subdirectory(qsharedpointer)
add_subdirectory(qsize)
add_subdirectory(qsizef)
+if (NOT WASM) # QTBUG-121822
add_subdirectory(qspan)
+endif()
add_subdirectory(qstl)
add_subdirectory(quniquehandle)
add_subdirectory(qvarlengtharray)
diff --git a/tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp b/tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp
index f52a368aa9..4281d93179 100644
--- a/tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp
+++ b/tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp
@@ -375,6 +375,13 @@ void tst_QBitArray::operator_andeq_data()
<< QStringToQBitArray(QString());
}
+#define COMPARE_BITARRAY_EQ(actual, expected) do { \
+ QT_TEST_EQUALITY_OPS(actual, expected, true); \
+ QCOMPARE(actual.count(), expected.count()); \
+ QCOMPARE(actual.count(true), expected.count(true)); \
+ QCOMPARE(actual.count(false), expected.count(false)); \
+ } while (false)
+
void tst_QBitArray::operator_andeq()
{
QFETCH(QBitArray, input1);
@@ -383,32 +390,32 @@ void tst_QBitArray::operator_andeq()
QBitArray result = input1;
result &= input2;
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input1;
result &= std::move(input2);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input1;
result &= detached(input2);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
// operation is commutative
result = input2;
result &= input1;
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input2;
result &= std::move(input1);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input2;
result &= detached(input1);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
// operation is idempotent
result &= result;
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result &= std::move(result);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result &= detached(result);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
}
void tst_QBitArray::operator_and()
@@ -418,27 +425,27 @@ void tst_QBitArray::operator_and()
QFETCH(QBitArray, res);
QBitArray result = input1 & input2;
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input1 & QBitArray(input2);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input1 & detached(input2);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
// operation is commutative
result = input2 & input1;
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input2 & QBitArray(input1);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input2 & detached(input1);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
// operation is idempotent
result = result & result;
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = result & QBitArray(result);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = result & detached(result);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
}
void tst_QBitArray::operator_oreq_data()
@@ -489,32 +496,32 @@ void tst_QBitArray::operator_oreq()
QBitArray result = input1;
result |= input2;
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input1;
result |= QBitArray(input2);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input1;
result |= detached(input2);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
// operation is commutative
result = input2;
result |= input1;
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input2;
result |= QBitArray(input1);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input2;
result |= detached(input1);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
// operation is idempotent
result |= result;
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result |= QBitArray(result);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result |= detached(result);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
}
void tst_QBitArray::operator_or()
@@ -524,27 +531,27 @@ void tst_QBitArray::operator_or()
QFETCH(QBitArray, res);
QBitArray result = input1 | input2;
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input1 | QBitArray(input2);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input1 | detached(input2);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
// operation is commutative
result = input2 | input1;
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input2 | QBitArray(input1);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input2 | detached(input1);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
// operation is idempotent
result = result | result;
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = result | QBitArray(result);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = result | detached(result);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
}
void tst_QBitArray::operator_xoreq_data()
@@ -593,24 +600,24 @@ void tst_QBitArray::operator_xoreq()
QBitArray result = input1;
result ^= input2;
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input1;
result ^= QBitArray(input2);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input1;
result ^= detached(input2);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
// operation is commutative
result = input2;
result ^= input1;
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input2;
result ^= QBitArray(input1);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input2;
result ^= detached(input1);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
// XORing with oneself is nilpotent
result = input1;
@@ -651,19 +658,19 @@ void tst_QBitArray::operator_xor()
QFETCH(QBitArray, res);
QBitArray result = input1 ^ input2;
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input1 ^ QBitArray(input2);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input1 ^ detached(input2);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
// operation is commutative
result = input2 ^ input1;
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input2 ^ QBitArray(input1);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
result = input2 ^ detached(input1);
- QT_TEST_EQUALITY_OPS(result, res, true);
+ COMPARE_BITARRAY_EQ(result, res);
// XORing with oneself is nilpotent
result = input1 ^ input1;
@@ -734,7 +741,7 @@ void tst_QBitArray::operator_neg()
input = ~input;
- QT_TEST_EQUALITY_OPS(input, res, true);
+ COMPARE_BITARRAY_EQ(input, res);
QT_TEST_EQUALITY_OPS(~~input, res, true); // performs two in-place negations
}
@@ -795,9 +802,9 @@ void tst_QBitArray::datastream()
QCOMPARE(array1.count(true), onBits);
QCOMPARE(array1.count(false), numBits - onBits);
- QT_TEST_EQUALITY_OPS(array1, bits, true);
- QT_TEST_EQUALITY_OPS(array2, bits, true);
- QT_TEST_EQUALITY_OPS(array3, bits, true);
+ COMPARE_BITARRAY_EQ(array1, bits);
+ COMPARE_BITARRAY_EQ(array2, bits);
+ COMPARE_BITARRAY_EQ(array3, bits);
}
void tst_QBitArray::invertOnNull() const
diff --git a/tests/auto/corelib/tools/qcryptographichash/tst_qcryptographichash.cpp b/tests/auto/corelib/tools/qcryptographichash/tst_qcryptographichash.cpp
index c08afd67c4..47e0ead270 100644
--- a/tests/auto/corelib/tools/qcryptographichash/tst_qcryptographichash.cpp
+++ b/tests/auto/corelib/tools/qcryptographichash/tst_qcryptographichash.cpp
@@ -20,6 +20,8 @@ private slots:
void repeated_result();
void intermediary_result_data();
void intermediary_result();
+ void static_hash_data() { intermediary_result_data(); }
+ void static_hash();
void sha1();
void sha3_data();
void sha3();
@@ -29,9 +31,9 @@ private slots:
void blake2();
void files_data();
void files();
- void hashLength_data();
+ void hashLength_data() { all_methods(true); }
void hashLength();
- void addDataAcceptsNullByteArrayView_data() { hashLength_data(); }
+ void addDataAcceptsNullByteArrayView_data() { all_methods(false); }
void addDataAcceptsNullByteArrayView();
void move();
void swap();
@@ -40,6 +42,7 @@ private slots:
void moreThan4GiBOfData();
void keccakBufferOverflow();
private:
+ void all_methods(bool includingNumAlgorithms) const;
void ensureLargeData();
std::vector<char> large;
};
@@ -197,6 +200,20 @@ void tst_QCryptographicHash::intermediary_result()
hash.reset();
}
+void tst_QCryptographicHash::static_hash()
+{
+ QFETCH(const int, algo);
+ QFETCH(const QByteArray, first);
+ QFETCH(const QByteArray, hash_first);
+
+ const auto _algo = QCryptographicHash::Algorithm(algo);
+
+ QCOMPARE(QCryptographicHash::hash(first, _algo), hash_first);
+
+ std::byte buffer[1024];
+ QCOMPARE(QCryptographicHash::hashInto(buffer, first, _algo), hash_first);
+}
+
void tst_QCryptographicHash::sha1()
{
@@ -474,12 +491,14 @@ void tst_QCryptographicHash::files()
}
}
-void tst_QCryptographicHash::hashLength_data()
+void tst_QCryptographicHash::all_methods(bool inclNumAlgos) const
{
QTest::addColumn<QCryptographicHash::Algorithm>("algorithm");
auto metaEnum = QMetaEnum::fromType<QCryptographicHash::Algorithm>();
for (int i = 0, value = metaEnum.value(i); value != -1; value = metaEnum.value(++i)) {
auto algorithm = QCryptographicHash::Algorithm(value);
+ if (!inclNumAlgos && algorithm == QCryptographicHash::Algorithm::NumAlgorithms)
+ continue;
QTest::addRow("%s", metaEnum.key(i)) << algorithm;
}
}
@@ -495,6 +514,9 @@ void tst_QCryptographicHash::hashLength()
expectedSize = 0;
} else {
expectedSize = QCryptographicHash::hash("test", algorithm).size();
+
+ std::byte buffer[1024];
+ QCOMPARE(QCryptographicHash::hashInto(buffer, "foo", algorithm).size(), expectedSize);
}
QCOMPARE(QCryptographicHash::hashLength(algorithm), expectedSize);
}
diff --git a/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp b/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp
index f42637a3fe..772b3f827f 100644
--- a/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp
+++ b/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp
@@ -59,6 +59,7 @@ private slots:
void objectCastStdSharedPtr();
void differentPointers();
void virtualBaseDifferentPointers();
+ void virtualBaseWeakPointerConversions();
#ifndef QTEST_NO_RTTI
void dynamicCast();
void dynamicCastDifferentPointers();
@@ -1294,6 +1295,67 @@ void tst_QSharedPointer::virtualBaseDifferentPointers()
safetyCheck();
}
+void tst_QSharedPointer::virtualBaseWeakPointerConversions()
+{
+ struct Base { virtual ~Base() = default; };
+ struct Derived : virtual Base {};
+
+ {
+ QSharedPointer<Derived> d(new Derived);
+ QSharedPointer<const Base> cb = d;
+ QCOMPARE(cb, d);
+ QCOMPARE(cb.get(), d.get());
+ }
+ safetyCheck();
+
+ {
+ QSharedPointer<Derived> d(new Derived);
+ QWeakPointer<const Base> wcb = d;
+ QCOMPARE(wcb, d);
+ QCOMPARE(wcb.lock().get(), d.get());
+ }
+ safetyCheck();
+
+ {
+ QSharedPointer<Derived> d(new Derived);
+ QWeakPointer<Derived> wd = d;
+ QCOMPARE(wd, d);
+ QCOMPARE(wd.lock().get(), d.get());
+ QWeakPointer<const Base> wcb = wd;
+ QCOMPARE(wcb, wd);
+ QCOMPARE(wcb.lock().get(), d.get());
+ }
+ safetyCheck();
+
+ {
+ auto raw = new Derived;
+ QSharedPointer<Derived> d(raw);
+ QSharedPointer<const Base> cb = std::move(d);
+ QCOMPARE(d, nullptr);
+ QCOMPARE(cb.get(), raw);
+ }
+ safetyCheck();
+
+ {
+ QSharedPointer<Derived> d(new Derived);
+ QWeakPointer<const Base> wcb = std::move(d);
+ QCOMPARE(wcb, d);
+ QCOMPARE(wcb.lock().get(), d.get());
+ }
+ safetyCheck();
+
+ {
+ QSharedPointer<Derived> d(new Derived);
+ QWeakPointer<Derived> wd = std::move(d);
+ QCOMPARE(wd, d);
+ QCOMPARE(wd.lock().get(), d.get());
+ QWeakPointer<const Base> wcb = std::move(wd);
+ QCOMPARE(wd, nullptr);
+ QCOMPARE(wcb.lock().get(), d.get());
+ }
+ safetyCheck();
+}
+
#ifndef QTEST_NO_RTTI
void tst_QSharedPointer::dynamicCast()
{
diff --git a/tests/auto/corelib/tools/qsize/CMakeLists.txt b/tests/auto/corelib/tools/qsize/CMakeLists.txt
index 91de696ddd..4a4c96b52c 100644
--- a/tests/auto/corelib/tools/qsize/CMakeLists.txt
+++ b/tests/auto/corelib/tools/qsize/CMakeLists.txt
@@ -14,4 +14,6 @@ endif()
qt_internal_add_test(tst_qsize
SOURCES
tst_qsize.cpp
+ LIBRARIES
+ Qt::TestPrivate
)
diff --git a/tests/auto/corelib/tools/qsize/tst_qsize.cpp b/tests/auto/corelib/tools/qsize/tst_qsize.cpp
index c9699c5e76..d379275dd8 100644
--- a/tests/auto/corelib/tools/qsize/tst_qsize.cpp
+++ b/tests/auto/corelib/tools/qsize/tst_qsize.cpp
@@ -24,6 +24,7 @@ CHECK(const &&);
#undef CHECK
#include <QTest>
+#include <QtTest/private/qcomparisontesthelper_p.h>
#include <qsize.h>
#include <array>
@@ -34,6 +35,10 @@ class tst_QSize : public QObject
{
Q_OBJECT
private slots:
+ void compareCompiles();
+ void compare_data();
+ void compare();
+
void getSetCheck();
void scale();
@@ -55,6 +60,38 @@ private slots:
void structuredBinding();
};
+void tst_QSize::compareCompiles()
+{
+ QTestPrivate::testEqualityOperatorsCompile<QSize>();
+}
+
+void tst_QSize::compare_data()
+{
+ QTest::addColumn<QSize>("lhs");
+ QTest::addColumn<QSize>("rhs");
+ QTest::addColumn<bool>("result");
+
+ auto row = [](QSize lhs, QSize rhs, bool res) {
+ QTest::addRow("(%d, %d) vs (%d, %d)", lhs.width(), lhs.height(), rhs.width(), rhs.height())
+ << lhs << rhs << res;
+ };
+
+ row(QSize(0, 0), QSize(0, 0), true);
+ row(QSize(1, 0), QSize(0, 1), false);
+ row(QSize(-1, -1), QSize(-1, -1), true);
+ row(QSize(-1, -1), QSize(1, 1), false);
+ row(QSize(INT_MIN, INT_MAX), QSize(INT_MAX, INT_MIN), false);
+}
+
+void tst_QSize::compare()
+{
+ QFETCH(QSize, lhs);
+ QFETCH(QSize, rhs);
+ QFETCH(bool, result);
+
+ QT_TEST_EQUALITY_OPS(lhs, rhs, result);
+}
+
// Testing get/set functions
void tst_QSize::getSetCheck()
{
diff --git a/tests/auto/corelib/tools/qsizef/CMakeLists.txt b/tests/auto/corelib/tools/qsizef/CMakeLists.txt
index 9adaafe2ea..d8a1c7f46e 100644
--- a/tests/auto/corelib/tools/qsizef/CMakeLists.txt
+++ b/tests/auto/corelib/tools/qsizef/CMakeLists.txt
@@ -14,4 +14,6 @@ endif()
qt_internal_add_test(tst_qsizef
SOURCES
tst_qsizef.cpp
+ LIBRARIES
+ Qt::TestPrivate
)
diff --git a/tests/auto/corelib/tools/qsizef/tst_qsizef.cpp b/tests/auto/corelib/tools/qsizef/tst_qsizef.cpp
index ee33fa13b6..bb087e89de 100644
--- a/tests/auto/corelib/tools/qsizef/tst_qsizef.cpp
+++ b/tests/auto/corelib/tools/qsizef/tst_qsizef.cpp
@@ -24,17 +24,30 @@ CHECK(const &&);
#undef CHECK
#include <QTest>
+#include <QtTest/private/qcomparisontesthelper_p.h>
#include <qsize.h>
Q_DECLARE_METATYPE(QMarginsF)
+static constexpr qreal qreal_min = std::numeric_limits<qreal>::min();
+
class tst_QSizeF : public QObject
{
Q_OBJECT
private slots:
+ void compareCompiles();
+ void compare_data();
+ void compare();
+
+ void fuzzyCompare_data();
+ void fuzzyCompare();
+
void isNull_data();
void isNull();
+ void fuzzyIsNull_data();
+ void fuzzyIsNull();
+
void scale();
void expandedTo();
@@ -52,6 +65,61 @@ private slots:
void structuredBinding();
};
+void tst_QSizeF::compareCompiles()
+{
+ QTestPrivate::testEqualityOperatorsCompile<QSizeF>();
+ QTestPrivate::testEqualityOperatorsCompile<QSizeF, QSize>();
+}
+
+void tst_QSizeF::compare_data()
+{
+ QTest::addColumn<QSizeF>("lhs");
+ QTest::addColumn<QSizeF>("rhs");
+ QTest::addColumn<bool>("result");
+ QTest::addColumn<bool>("mixedResult");
+
+ auto row = [&](QSizeF lhs, QSizeF rhs, bool res, bool mixedRes) {
+ QString str;
+ QDebug dbg(&str);
+ dbg.nospace() << "(" << lhs.width() << ", " << lhs.height() << ") vs "
+ << "(" << rhs.width() << ", " << rhs.height() << ")";
+ QTest::addRow("%s", str.toLatin1().constData()) << lhs << rhs << res << mixedRes;
+ };
+
+ row(QSizeF(0.0, 0.0), QSizeF(0.0, 0.0), true, true);
+ row(QSizeF(1.0, 2.0), QSizeF(1.0, 2.0), true, true);
+ row(QSizeF(1.0, -1.0), QSizeF(-1.0, 1.0), false, false);
+ row(QSizeF(0.1, 1.1), QSizeF(0.1, 1.1), true, false);
+ row(QSizeF(qreal_min, 0.0), QSizeF(0.0, -qreal_min), true, true);
+}
+
+void tst_QSizeF::compare()
+{
+ QFETCH(QSizeF, lhs);
+ QFETCH(QSizeF, rhs);
+ QFETCH(bool, result);
+ QFETCH(bool, mixedResult);
+
+ QT_TEST_EQUALITY_OPS(lhs, rhs, result);
+
+ const QSize rhsFixed = rhs.toSize();
+ QT_TEST_EQUALITY_OPS(lhs, rhsFixed, mixedResult);
+}
+
+void tst_QSizeF::fuzzyCompare_data()
+{
+ compare_data();
+}
+
+void tst_QSizeF::fuzzyCompare()
+{
+ QFETCH(QSizeF, lhs);
+ QFETCH(QSizeF, rhs);
+ QFETCH(bool, result);
+
+ QCOMPARE_EQ(qFuzzyCompare(lhs, rhs), result);
+}
+
void tst_QSizeF::isNull_data()
{
QTest::addColumn<qreal>("width");
@@ -66,6 +134,7 @@ void tst_QSizeF::isNull_data()
QTest::newRow("0, -0.1") << qreal(0) << qreal(-0.1) << false;
QTest::newRow("0.1, 0") << qreal(0.1) << qreal(0) << false;
QTest::newRow("0, 0.1") << qreal(0) << qreal(0.1) << false;
+ QTest::newRow("qreal_min, -qreal_min") << qreal_min << -qreal_min << false;
}
void tst_QSizeF::isNull()
@@ -80,6 +149,33 @@ void tst_QSizeF::isNull()
QCOMPARE(size.isNull(), isNull);
}
+void tst_QSizeF::fuzzyIsNull_data()
+{
+ QTest::addColumn<qreal>("width");
+ QTest::addColumn<qreal>("height");
+ QTest::addColumn<bool>("fuzzyNull");
+
+ QTest::newRow("0, 0") << qreal(0.0) << qreal(0.0) << true;
+ QTest::newRow("-0, -0") << qreal(-0.0) << qreal(-0.0) << true;
+ QTest::newRow("0, -0") << qreal(0) << qreal(-0.0) << true;
+ QTest::newRow("-0, 0") << qreal(-0.0) << qreal(0) << true;
+ QTest::newRow("-0.1, 0") << qreal(-0.1) << qreal(0) << false;
+ QTest::newRow("0, -0.1") << qreal(0) << qreal(-0.1) << false;
+ QTest::newRow("0.1, 0") << qreal(0.1) << qreal(0) << false;
+ QTest::newRow("0, 0.1") << qreal(0) << qreal(0.1) << false;
+ QTest::newRow("qreal_min, -qreal_min") << qreal_min << -qreal_min << true;
+}
+
+void tst_QSizeF::fuzzyIsNull()
+{
+ QFETCH(qreal, width);
+ QFETCH(qreal, height);
+ QFETCH(bool, fuzzyNull);
+
+ QSizeF size(width, height);
+ QCOMPARE(qFuzzyIsNull(size), fuzzyNull);
+}
+
void tst_QSizeF::scale() {
QSizeF t1(10.4, 12.8);
t1.scale(60.6, 60.6, Qt::IgnoreAspectRatio);
diff --git a/tests/auto/corelib/tools/qspan/CMakeLists.txt b/tests/auto/corelib/tools/qspan/CMakeLists.txt
index 595d19dc43..b4517640a0 100644
--- a/tests/auto/corelib/tools/qspan/CMakeLists.txt
+++ b/tests/auto/corelib/tools/qspan/CMakeLists.txt
@@ -10,4 +10,8 @@ endif()
qt_internal_add_test(tst_qspan
SOURCES
tst_qspan.cpp
+ NO_BATCH # QTBUG-121815
+ DEFINES
+ QTEST_THROW_ON_FAIL
+ QTEST_THROW_ON_SKIP
)
diff --git a/tests/auto/corelib/tools/qspan/tst_qspan.cpp b/tests/auto/corelib/tools/qspan/tst_qspan.cpp
index 91d2ecf739..95c60ee953 100644
--- a/tests/auto/corelib/tools/qspan/tst_qspan.cpp
+++ b/tests/auto/corelib/tools/qspan/tst_qspan.cpp
@@ -6,6 +6,10 @@
#include <QList>
#include <QTest>
+#ifndef QTEST_THROW_ON_FAIL
+# error This test requires QTEST_THROW_ON_FAIL being active.
+#endif
+
#include <algorithm>
#include <array>
#ifdef __cpp_lib_span
@@ -141,31 +145,27 @@ private:
void from_variable_size_container_impl(C &&c) const;
};
-#define RETURN_IF_FAILED() \
- do { if (QTest::currentTestFailed()) return; } while (false)
+template <typename T>
+const void *as_const_void(T *p) noexcept { return static_cast<const void *>(p); }
void tst_QSpan::onlyZeroExtentSpansHaveDefaultCtors() const
{
static_assert(std::is_nothrow_default_constructible_v<QSpan<int, 0>>);
static_assert(std::is_nothrow_default_constructible_v<QSpan<const int, 0>>);
static_assert(std::is_nothrow_default_constructible_v<QSpan<int>>);
- static_assert(std::is_nothrow_default_constructible_v<QSpan<const int, 0>>);
+ static_assert(std::is_nothrow_default_constructible_v<QSpan<const int>>);
QSpan<int, 0> si;
check_null_span(si);
- RETURN_IF_FAILED();
QSpan<const int, 0> sci;
check_null_span(sci);
- RETURN_IF_FAILED();
QSpan<int> sdi;
check_null_span(sdi);
- RETURN_IF_FAILED();
QSpan<const int> sdci;
check_null_span(sdci);
- RETURN_IF_FAILED();
static_assert(!std::is_default_constructible_v<QSpan<int, 1>>);
static_assert(!std::is_default_constructible_v<QSpan<const int, 42>>);
@@ -173,26 +173,22 @@ void tst_QSpan::onlyZeroExtentSpansHaveDefaultCtors() const
void tst_QSpan::zeroExtentSpansMaintainADataPointer() const
{
- int i;
+ int i = 0;
QSpan<int, 0> si{&i, 0};
QCOMPARE(si.data(), &i);
check_empty_span_incl_subspans(si);
- RETURN_IF_FAILED();
QSpan<const int, 0> sci{&i, 0};
QCOMPARE(sci.data(), &i);
check_empty_span_incl_subspans(sci);
- RETURN_IF_FAILED();
QSpan<int, 0> sdi{&i, 0};
QCOMPARE(sdi.data(), &i);
check_empty_span_incl_subspans(sdi);
- RETURN_IF_FAILED();
QSpan<const int, 0> sdci{&i, 0};
QCOMPARE(sdci.data(), &i);
check_empty_span_incl_subspans(sdci);
- RETURN_IF_FAILED();
}
template <typename T, std::size_t N>
@@ -230,18 +226,14 @@ void tst_QSpan::check_nonempty_span(QSpan<T, N> s, qsizetype expectedSize) const
// don't run into Mandates: Offset >= Extent
if constexpr (N > 0) { // incl. N == std::dynamic_extent
check_empty_span_incl_subspans(s.template subspan<1>());
- RETURN_IF_FAILED();
}
check_empty_span_incl_subspans(s.subspan(1));
- RETURN_IF_FAILED();
} else {
// don't run into Mandates: Offset >= Extent
if constexpr (N > 1) { // incl. N == std::dynamic_extent
check_nonempty_span(s.template subspan<1>(), expectedSize - 1);
- RETURN_IF_FAILED();
}
check_nonempty_span(s.subspan(1), expectedSize - 1);
- RETURN_IF_FAILED();
}
}
@@ -263,55 +255,46 @@ template <typename T, std::size_t N>
void tst_QSpan::check_empty_span_incl_subspans(QSpan<T, N> s) const
{
check_empty_span(s);
- RETURN_IF_FAILED();
{
const auto fi = s.template first<0>();
check_empty_span(fi);
- RETURN_IF_FAILED();
QCOMPARE_EQ(fi.data(), s.data());
}
{
const auto la = s.template last<0>();
check_empty_span(la);
- RETURN_IF_FAILED();
QCOMPARE_EQ(la.data(), s.data());
}
{
const auto ss = s.template subspan<0>();
check_empty_span(ss);
- RETURN_IF_FAILED();
QCOMPARE_EQ(ss.data(), s.data());
}
{
const auto ss = s.template subspan<0, 0>();
check_empty_span(ss);
- RETURN_IF_FAILED();
QCOMPARE_EQ(ss.data(), s.data());
}
{
const auto fi = s.first(0);
check_empty_span(fi);
- RETURN_IF_FAILED();
QCOMPARE_EQ(fi.data(), s.data());
}
{
const auto la = s.last(0);
check_empty_span(la);
- RETURN_IF_FAILED();
QCOMPARE_EQ(la.data(), s.data());
}
{
const auto ss = s.subspan(0);
check_empty_span(ss);
- RETURN_IF_FAILED();
QCOMPARE_EQ(ss.data(), s.data());
}
{
const auto ss = s.subspan(0, 0);
check_empty_span(ss);
- RETURN_IF_FAILED();
QCOMPARE_EQ(ss.data(), s.data());
}
}
@@ -334,6 +317,8 @@ void tst_QSpan::from_container_impl(C &&c) const
const auto c_data = QSpanPrivate::adl_data(c);
using V = std::remove_reference_t<QSpanPrivate::range_reference_t<C>>;
+ constexpr auto ExpectedBytesExtent
+ = ExpectedExtent == q20::dynamic_extent ? q20::dynamic_extent : ExpectedExtent * sizeof(V);
{
QSpan si = c; // CTAD
static_assert(std::is_same_v<decltype(si), QSpan<V, ExpectedExtent>>);
@@ -342,7 +327,20 @@ void tst_QSpan::from_container_impl(C &&c) const
QCOMPARE_EQ(si.data(), c_data);
check_nonempty_span(si, c_size);
- RETURN_IF_FAILED();
+
+ auto bi = as_bytes(si);
+ static_assert(std::is_same_v<decltype(bi), QSpan<const std::byte, ExpectedBytesExtent>>);
+ QCOMPARE_EQ(bi.size(), si.size_bytes());
+ QCOMPARE_EQ(as_const_void(bi.data()),
+ as_const_void(si.data()));
+
+ if constexpr (!std::is_const_v<V>) { // e.g. std::initializer_list<int>
+ auto wbi = as_writable_bytes(si);
+ static_assert(std::is_same_v<decltype(wbi), QSpan<std::byte, ExpectedBytesExtent>>);
+ QCOMPARE_EQ(wbi.size(), si.size_bytes());
+ QCOMPARE_EQ(as_const_void(wbi.data()),
+ as_const_void(si.data()));
+ }
QSpan<const int> sci = c;
@@ -350,7 +348,12 @@ void tst_QSpan::from_container_impl(C &&c) const
QCOMPARE_EQ(sci.data(), c_data);
check_nonempty_span(sci, c_size);
- RETURN_IF_FAILED();
+
+ auto bci = as_bytes(sci);
+ static_assert(std::is_same_v<decltype(bci), QSpan<const std::byte>>);
+ QCOMPARE_EQ(bci.size(), sci.size_bytes());
+ QCOMPARE_EQ(as_const_void(bci.data()),
+ as_const_void(sci.data()));
}
{
QSpan sci = std::as_const(c); // CTAD
@@ -360,7 +363,12 @@ void tst_QSpan::from_container_impl(C &&c) const
QCOMPARE_EQ(sci.data(), c_data);
check_nonempty_span(sci, c_size);
- RETURN_IF_FAILED();
+
+ auto bci = as_bytes(sci);
+ static_assert(std::is_same_v<decltype(bci), QSpan<const std::byte, ExpectedBytesExtent>>);
+ QCOMPARE_EQ(bci.size(), sci.size_bytes());
+ QCOMPARE_EQ(as_const_void(bci.data()),
+ as_const_void(sci.data()));
}
}
@@ -395,7 +403,6 @@ void tst_QSpan::fromStdInitializerList() const
QCOMPARE_EQ(sci.data(), il.begin());
check_nonempty_span(sci, 4);
- RETURN_IF_FAILED();
}
void tst_QSpan::fromZeroSizeStdArray() const
@@ -444,7 +451,5 @@ void tst_QSpan::fromInitList() const
l2({4, 5, 6});
}
-#undef RETURN_IF_FAILED
-
QTEST_APPLESS_MAIN(tst_QSpan);
#include "tst_qspan.moc"