diff options
Diffstat (limited to 'tests/auto/corelib/tools')
-rw-r--r-- | tests/auto/corelib/tools/CMakeLists.txt | 2 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp | 111 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qcryptographichash/tst_qcryptographichash.cpp | 28 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp | 62 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qsize/CMakeLists.txt | 2 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qsize/tst_qsize.cpp | 37 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qsizef/CMakeLists.txt | 2 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qsizef/tst_qsizef.cpp | 96 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qspan/CMakeLists.txt | 4 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qspan/tst_qspan.cpp | 67 |
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" |