diff options
Diffstat (limited to 'tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp')
-rw-r--r-- | tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index d413bc726a..9fe7115d63 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -312,6 +312,10 @@ private slots: void moveOperations(); void equalsWithoutMetaObject(); + void constructFromIncompatibleMetaType_data(); + void constructFromIncompatibleMetaType(); + void copyNonDefaultConstructible(); + private: void dataStream_data(QDataStream::Version version); void loadQVariantFromDataStream(QDataStream::Version version); @@ -4734,6 +4738,11 @@ void tst_QVariant::metaEnums() METAENUMS_TEST(MetaEnumTest_Enum5_value); METAENUMS_TEST(MetaEnumTest_Enum6_value); METAENUMS_TEST(MetaEnumTest_Enum8_value); + +#undef METAENUMS_TEST + + testVariantMeta(Qt::RichText, &ok, "RichText"); + testVariantMeta(Qt::Alignment(Qt::AlignBottom), &ok, "AlignBottom"); } void tst_QVariant::nullConvert() @@ -5132,5 +5141,75 @@ void tst_QVariant::equalsWithoutMetaObject() QVERIFY(qobjectVariant != noMetaObjectVariant); } +struct NonDefaultConstructible +{ + NonDefaultConstructible(int i) :i(i) {} + int i; + friend bool operator==(NonDefaultConstructible l, NonDefaultConstructible r) + { return l.i == r.i; } +}; + +template <> char *QTest::toString<NonDefaultConstructible>(const NonDefaultConstructible &ndc) +{ + return qstrdup('{' + QByteArray::number(ndc.i) + '}'); +} + +struct Indestructible +{ + Indestructible() {} + Indestructible(const Indestructible &) {} + Indestructible &operator=(const Indestructible &) { return *this; } +private: + ~Indestructible() {} +}; + +void tst_QVariant::constructFromIncompatibleMetaType_data() +{ + QTest::addColumn<QMetaType>("type"); + auto addRow = [](QMetaType meta) { + QTest::newRow(meta.name()) << meta; + }; + addRow(QMetaType::fromType<void>()); + addRow(QMetaType::fromType<NonDefaultConstructible>()); + addRow(QMetaType::fromType<QObject>()); + addRow(QMetaType::fromType<Indestructible>()); +} + +void tst_QVariant::constructFromIncompatibleMetaType() +{ + QFETCH(QMetaType, type); + // in that case, we run into a different condition (size == 0), and do not warn + if (QTest::currentDataTag() != QLatin1String("void")) + QTest::ignoreMessage( + QtWarningMsg, + "QVariant: Provided metatype does not support destruction, copy and default construction"); + QVariant var(type, nullptr); + QVERIFY(!var.isValid()); + QVERIFY(!var.metaType().isValid()); + + QVariant regular(1.0); + QVERIFY(!var.canView(type)); + QVERIFY(!var.canConvert(type)); + QVERIFY(!QVariant(regular).convert(type)); +} + +void tst_QVariant::copyNonDefaultConstructible() +{ + NonDefaultConstructible ndc(42); + QVariant var(QMetaType::fromType<NonDefaultConstructible>(), &ndc); + QVERIFY(var.isDetached()); + QCOMPARE(var.metaType(), QMetaType::fromType<NonDefaultConstructible>()); + QVERIFY(var.constData() != &ndc); + + // qvariant_cast<T> and QVariant::value<T> don't compile + QCOMPARE(*static_cast<const NonDefaultConstructible *>(var.constData()), ndc); + + QVariant var2 = var; + var2.detach(); // force another copy + QVERIFY(var2.isDetached()); + QVERIFY(var2.constData() != var.constData()); + QCOMPARE(var2, var); +} + QTEST_MAIN(tst_QVariant) #include "tst_qvariant.moc" |