summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib
diff options
context:
space:
mode:
authorFabian Kosmale <fabian.kosmale@qt.io>2019-12-11 10:54:57 +0100
committerFabian Kosmale <fabian.kosmale@qt.io>2020-01-03 10:59:37 +0100
commit8669b8e60fc6a46baaeeea264a1ed3008dd52ea2 (patch)
tree9dc6e778f8dee54e455e6981bb580ef1a6476a3a /tests/auto/corelib
parent1e89c132e1280276e1d3a82ec3464afec8c14c3a (diff)
QVariant: Prefer direct conversion to QVariant{List,Map,Hash}
If a type has both a converter to QVariantList and to QSequentialIterableImpl registered, we would have chosen the QSequentialIterableImpl version. In the case of types like QJSValue, this is more costly. With this change we therefore uses the direct conversion if it has been registered. The same applies to QAssociativeIterableImpl and QVariantHash/QVariantMap. Change-Id: I9c0b5068efe4bfbc5e0598a200e6db59201e9974 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io> Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
Diffstat (limited to 'tests/auto/corelib')
-rw-r--r--tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
index e719871128..45eb61f6e4 100644
--- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
+++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
@@ -282,6 +282,8 @@ private slots:
void fromStdVariant();
void qt4UuidDataStream();
+ void preferDirectConversionOverInterfaces();
+
private:
void dataStream_data(QDataStream::Version version);
void loadQVariantFromDataStream(QDataStream::Version version);
@@ -5140,5 +5142,47 @@ void tst_QVariant::qt4UuidDataStream()
QCOMPARE(result.value<QUuid>(), source);
}
+void tst_QVariant::preferDirectConversionOverInterfaces()
+{
+ using namespace QtMetaTypePrivate;
+ bool calledCorrectConverter = false;
+ QMetaType::registerConverter<MyType, QSequentialIterableImpl>([](const MyType &) {
+ return QSequentialIterableImpl {};
+ });
+ QMetaType::registerConverter<MyType, QVariantList>([&calledCorrectConverter](const MyType &) {
+ calledCorrectConverter = true;
+ return QVariantList {};
+ });
+ QMetaType::registerConverter<MyType, QAssociativeIterableImpl>([](const MyType &) {
+ return QAssociativeIterableImpl {};
+ });
+ QMetaType::registerConverter<MyType, QVariantHash>([&calledCorrectConverter](const MyType &) {
+ calledCorrectConverter = true;
+ return QVariantHash {};
+ });
+ QMetaType::registerConverter<MyType, QVariantMap>([&calledCorrectConverter](const MyType &) {
+ calledCorrectConverter = true;
+ return QVariantMap {};
+ });
+ auto holder = QVariant::fromValue(MyType {});
+
+ QVERIFY(holder.canConvert<QSequentialIterableImpl>());
+ QVERIFY(holder.canConvert<QVariantList>());
+ QVERIFY(holder.canConvert<QAssociativeIterableImpl>());
+ QVERIFY(holder.canConvert<QVariantHash>());
+ QVERIFY(holder.canConvert<QVariantMap>());
+
+ holder.value<QVariantList>();
+ QVERIFY(calledCorrectConverter);
+ calledCorrectConverter = false;
+
+ holder.value<QVariantHash>();
+ QVERIFY(calledCorrectConverter);
+ calledCorrectConverter = false;
+
+ holder.value<QVariantMap>();
+ QVERIFY(calledCorrectConverter);
+}
+
QTEST_MAIN(tst_QVariant)
#include "tst_qvariant.moc"