aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/qml/qqmlmetatype
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/qml/qqmlmetatype')
-rw-r--r--tests/auto/qml/qqmlmetatype/CMakeLists.txt22
-rw-r--r--tests/auto/qml/qqmlmetatype/data/Components/App.qml29
-rw-r--r--tests/auto/qml/qqmlmetatype/data/animationOnValueType.qml26
-rw-r--r--tests/auto/qml/qqmlmetatype/data/interceptorApi.qml13
-rw-r--r--tests/auto/qml/qqmlmetatype/data/revisionedGroupedPropertiesUnversioned.qml5
-rw-r--r--tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp298
6 files changed, 302 insertions, 91 deletions
diff --git a/tests/auto/qml/qqmlmetatype/CMakeLists.txt b/tests/auto/qml/qqmlmetatype/CMakeLists.txt
index 55eebaa651..2ab974ca91 100644
--- a/tests/auto/qml/qqmlmetatype/CMakeLists.txt
+++ b/tests/auto/qml/qqmlmetatype/CMakeLists.txt
@@ -1,9 +1,18 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
# Generated from qqmlmetatype.pro.
#####################################################################
## tst_qqmlmetatype Test:
#####################################################################
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qqmlmetatype LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
# Collect test data
file(GLOB_RECURSE test_data_glob
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
@@ -12,15 +21,13 @@ list(APPEND test_data ${test_data_glob})
qt_internal_add_test(tst_qqmlmetatype
SOURCES
- ../../shared/util.cpp ../../shared/util.h
tst_qqmlmetatype.cpp
- INCLUDE_DIRECTORIES
- ../../shared
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::CorePrivate
Qt::Gui
Qt::GuiPrivate
Qt::QmlPrivate
+ Qt::QuickTestUtilsPrivate
TESTDATA ${test_data}
)
@@ -48,16 +55,19 @@ qt_internal_add_resource(tst_qqmlmetatype "qmake_qmldirresource"
${qmake_qmldirresource_resource_files}
)
+if(QT_BUILD_STANDALONE_TESTS)
+ qt_import_qml_plugins(tst_qqmlmetatype)
+endif()
## Scopes:
#####################################################################
qt_internal_extend_target(tst_qqmlmetatype CONDITION ANDROID OR IOS
DEFINES
- QT_QMLTEST_DATADIR=\\\":/data\\\"
+ QT_QMLTEST_DATADIR=":/data"
)
qt_internal_extend_target(tst_qqmlmetatype CONDITION NOT ANDROID AND NOT IOS
DEFINES
- QT_QMLTEST_DATADIR=\\\"${CMAKE_CURRENT_SOURCE_DIR}/data\\\"
+ QT_QMLTEST_DATADIR="${CMAKE_CURRENT_SOURCE_DIR}/data"
)
diff --git a/tests/auto/qml/qqmlmetatype/data/Components/App.qml b/tests/auto/qml/qqmlmetatype/data/Components/App.qml
index 3792ca665e..693cffea40 100644
--- a/tests/auto/qml/qqmlmetatype/data/Components/App.qml
+++ b/tests/auto/qml/qqmlmetatype/data/Components/App.qml
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQml 2.0
diff --git a/tests/auto/qml/qqmlmetatype/data/animationOnValueType.qml b/tests/auto/qml/qqmlmetatype/data/animationOnValueType.qml
new file mode 100644
index 0000000000..196715dd74
--- /dev/null
+++ b/tests/auto/qml/qqmlmetatype/data/animationOnValueType.qml
@@ -0,0 +1,26 @@
+import QtQuick
+
+Text {
+ property bool large: false
+ property bool check: false
+ font.pointSize: large ? 24 : 12
+ font.letterSpacing: check ? 24 : 12
+
+ Behavior on font.pointSize {
+ SmoothedAnimation { duration: 100; }
+ }
+
+ Behavior on font.letterSpacing {
+ SmoothedAnimation { duration: 100; }
+ }
+
+ Component.onCompleted: {
+ large = true;
+ large = false;
+ check = true;
+ }
+
+ property real pointSize: font.pointSize
+ property real letterSpacing: font.letterSpacing
+}
+
diff --git a/tests/auto/qml/qqmlmetatype/data/interceptorApi.qml b/tests/auto/qml/qqmlmetatype/data/interceptorApi.qml
new file mode 100644
index 0000000000..229dd2e6a9
--- /dev/null
+++ b/tests/auto/qml/qqmlmetatype/data/interceptorApi.qml
@@ -0,0 +1,13 @@
+import QtQml
+import test
+
+QtObject {
+ id: root
+ default property list<QtObject> children
+ Interceptor on objectName { id: interceptor }
+ property string s: "foo"
+ objectName: s
+
+ property Interceptor i: interceptor
+ Component.onCompleted: () => root.objectName = "bar"
+}
diff --git a/tests/auto/qml/qqmlmetatype/data/revisionedGroupedPropertiesUnversioned.qml b/tests/auto/qml/qqmlmetatype/data/revisionedGroupedPropertiesUnversioned.qml
new file mode 100644
index 0000000000..cef3ab84e6
--- /dev/null
+++ b/tests/auto/qml/qqmlmetatype/data/revisionedGroupedPropertiesUnversioned.qml
@@ -0,0 +1,5 @@
+import GroupedTest
+
+MyRevisioned {
+ grouped.prop2: 5
+}
diff --git a/tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp b/tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp
index 02399fdcdf..04c2a5bfdb 100644
--- a/tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp
+++ b/tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <qstandardpaths.h>
#include <qtest.h>
@@ -36,13 +11,16 @@
#include <private/qqmlmetatype_p.h>
#include <private/qqmlpropertyvalueinterceptor_p.h>
#include <private/qqmlengine_p.h>
-#include "../../shared/util.h"
+#include <private/qqmlanybinding_p.h>
+#include <QtQuickTestUtils/private/qmlutils_p.h>
+
+using namespace Qt::StringLiterals;
class tst_qqmlmetatype : public QQmlDataTest
{
Q_OBJECT
public:
- tst_qqmlmetatype() {}
+ tst_qqmlmetatype() : QQmlDataTest(QT_QMLTEST_DATADIR) {}
private slots:
void initTestCase() override;
@@ -57,6 +35,8 @@ private slots:
void compositeType();
void externalEnums();
+ void interceptorAPI();
+
void isList();
void defaultObject();
@@ -69,6 +49,11 @@ private slots:
void enumsInRecursiveImport_data();
void enumsInRecursiveImport();
+
+ void revertValueTypeAnimation();
+
+ void clearPropertyCaches();
+ void builtins();
};
class TestType : public QObject
@@ -116,8 +101,8 @@ QObject *testTypeProvider(QQmlEngine *engine, QJSEngine *scriptEngine)
class ParserStatusTestType : public QObject, public QQmlParserStatus
{
Q_OBJECT
- void classBegin(){}
- void componentComplete(){}
+ void classBegin() override {}
+ void componentComplete() override {}
Q_CLASSINFO("DefaultProperty", "foo") // Missing default property
Q_INTERFACES(QQmlParserStatus)
};
@@ -128,7 +113,7 @@ class ValueSourceTestType : public QObject, public QQmlPropertyValueSource
Q_OBJECT
Q_INTERFACES(QQmlPropertyValueSource)
public:
- virtual void setTarget(const QQmlProperty &) {}
+ void setTarget(const QQmlProperty &) override {}
};
QML_DECLARE_TYPE(ValueSourceTestType);
@@ -137,8 +122,8 @@ class ValueInterceptorTestType : public QObject, public QQmlPropertyValueInterce
Q_OBJECT
Q_INTERFACES(QQmlPropertyValueInterceptor)
public:
- virtual void setTarget(const QQmlProperty &) {}
- virtual void write(const QVariant &) {}
+ void setTarget(const QQmlProperty &) override {}
+ void write(const QVariant &) override {}
};
QML_DECLARE_TYPE(ValueInterceptorTestType);
@@ -157,14 +142,14 @@ void tst_qqmlmetatype::initTestCase()
void tst_qqmlmetatype::qmlParserStatusCast()
{
- QVERIFY(!QQmlMetaType::qmlType(QMetaType::Int).isValid());
- QVERIFY(QQmlMetaType::qmlType(qMetaTypeId<TestType *>()).isValid());
- QCOMPARE(QQmlMetaType::qmlType(qMetaTypeId<TestType *>()).parserStatusCast(), -1);
- QVERIFY(QQmlMetaType::qmlType(qMetaTypeId<ValueSourceTestType *>()).isValid());
- QCOMPARE(QQmlMetaType::qmlType(qMetaTypeId<ValueSourceTestType *>()).parserStatusCast(), -1);
+ QVERIFY(!QQmlMetaType::qmlType(QMetaType::fromType<int>()).isValid());
+ QVERIFY(QQmlMetaType::qmlType(QMetaType::fromType<TestType *>()).isValid());
+ QCOMPARE(QQmlMetaType::qmlType(QMetaType::fromType<TestType *>()).parserStatusCast(), -1);
+ QVERIFY(QQmlMetaType::qmlType(QMetaType::fromType<ValueSourceTestType *>()).isValid());
+ QCOMPARE(QQmlMetaType::qmlType(QMetaType::fromType<ValueSourceTestType *>()).parserStatusCast(), -1);
- QVERIFY(QQmlMetaType::qmlType(qMetaTypeId<ParserStatusTestType *>()).isValid());
- int cast = QQmlMetaType::qmlType(qMetaTypeId<ParserStatusTestType *>()).parserStatusCast();
+ QVERIFY(QQmlMetaType::qmlType(QMetaType::fromType<ParserStatusTestType *>()).isValid());
+ int cast = QQmlMetaType::qmlType(QMetaType::fromType<ParserStatusTestType *>()).parserStatusCast();
QVERIFY(cast != -1);
QVERIFY(cast != 0);
@@ -177,14 +162,14 @@ void tst_qqmlmetatype::qmlParserStatusCast()
void tst_qqmlmetatype::qmlPropertyValueSourceCast()
{
- QVERIFY(!QQmlMetaType::qmlType(QMetaType::Int).isValid());
- QVERIFY(QQmlMetaType::qmlType(qMetaTypeId<TestType *>()).isValid());
- QCOMPARE(QQmlMetaType::qmlType(qMetaTypeId<TestType *>()).propertyValueSourceCast(), -1);
- QVERIFY(QQmlMetaType::qmlType(qMetaTypeId<ParserStatusTestType *>()).isValid());
- QCOMPARE(QQmlMetaType::qmlType(qMetaTypeId<ParserStatusTestType *>()).propertyValueSourceCast(), -1);
+ QVERIFY(!QQmlMetaType::qmlType(QMetaType::fromType<int>()).isValid());
+ QVERIFY(QQmlMetaType::qmlType(QMetaType::fromType<TestType *>()).isValid());
+ QCOMPARE(QQmlMetaType::qmlType(QMetaType::fromType<TestType *>()).propertyValueSourceCast(), -1);
+ QVERIFY(QQmlMetaType::qmlType(QMetaType::fromType<ParserStatusTestType *>()).isValid());
+ QCOMPARE(QQmlMetaType::qmlType(QMetaType::fromType<ParserStatusTestType *>()).propertyValueSourceCast(), -1);
- QVERIFY(QQmlMetaType::qmlType(qMetaTypeId<ValueSourceTestType *>()).isValid());
- int cast = QQmlMetaType::qmlType(qMetaTypeId<ValueSourceTestType *>()).propertyValueSourceCast();
+ QVERIFY(QQmlMetaType::qmlType(QMetaType::fromType<ValueSourceTestType *>()).isValid());
+ int cast = QQmlMetaType::qmlType(QMetaType::fromType<ValueSourceTestType *>()).propertyValueSourceCast();
QVERIFY(cast != -1);
QVERIFY(cast != 0);
@@ -197,14 +182,14 @@ void tst_qqmlmetatype::qmlPropertyValueSourceCast()
void tst_qqmlmetatype::qmlPropertyValueInterceptorCast()
{
- QVERIFY(!QQmlMetaType::qmlType(QMetaType::Int).isValid());
- QVERIFY(QQmlMetaType::qmlType(qMetaTypeId<TestType *>()).isValid());
- QCOMPARE(QQmlMetaType::qmlType(qMetaTypeId<TestType *>()).propertyValueInterceptorCast(), -1);
- QVERIFY(QQmlMetaType::qmlType(qMetaTypeId<ParserStatusTestType *>()).isValid());
- QCOMPARE(QQmlMetaType::qmlType(qMetaTypeId<ParserStatusTestType *>()).propertyValueInterceptorCast(), -1);
+ QVERIFY(!QQmlMetaType::qmlType(QMetaType::fromType<int>()).isValid());
+ QVERIFY(QQmlMetaType::qmlType(QMetaType::fromType<TestType *>()).isValid());
+ QCOMPARE(QQmlMetaType::qmlType(QMetaType::fromType<TestType *>()).propertyValueInterceptorCast(), -1);
+ QVERIFY(QQmlMetaType::qmlType(QMetaType::fromType<ParserStatusTestType *>()).isValid());
+ QCOMPARE(QQmlMetaType::qmlType(QMetaType::fromType<ParserStatusTestType *>()).propertyValueInterceptorCast(), -1);
- QVERIFY(QQmlMetaType::qmlType(qMetaTypeId<ValueInterceptorTestType *>()).isValid());
- int cast = QQmlMetaType::qmlType(qMetaTypeId<ValueInterceptorTestType *>()).propertyValueInterceptorCast();
+ QVERIFY(QQmlMetaType::qmlType(QMetaType::fromType<ValueInterceptorTestType *>()).isValid());
+ int cast = QQmlMetaType::qmlType(QMetaType::fromType<ValueInterceptorTestType *>()).propertyValueInterceptorCast();
QVERIFY(cast != -1);
QVERIFY(cast != 0);
@@ -257,9 +242,9 @@ void tst_qqmlmetatype::prettyTypeName()
void tst_qqmlmetatype::isList()
{
- QCOMPARE(QQmlMetaType::isList(QMetaType::UnknownType), false);
- QCOMPARE(QQmlMetaType::isList(QMetaType::Int), false);
- QCOMPARE(QQmlMetaType::isList(qMetaTypeId<QQmlListProperty<TestType> >()), true);
+ QCOMPARE(QQmlMetaType::isList(QMetaType {}), false);
+ QCOMPARE(QQmlMetaType::isList(QMetaType::fromType<int>()), false);
+ QCOMPARE(QQmlMetaType::isList(QMetaType::fromType<QQmlListProperty<TestType> >()), true);
}
void tst_qqmlmetatype::defaultObject()
@@ -337,6 +322,60 @@ void tst_qqmlmetatype::externalEnums()
}
+class ForwardAndLogInterceptor : public QObject, public QQmlPropertyValueInterceptor {
+ Q_OBJECT
+ Q_INTERFACES(QQmlPropertyValueInterceptor)
+public:
+
+ // QQmlPropertyValueInterceptor interface
+ void setTarget(const QQmlProperty &property) override
+ {
+ m_property = property;
+ }
+ void write(const QVariant &value) override
+ {
+ interceptedWrite = true;
+ QQmlPropertyPrivate::write(m_property, value, QQmlPropertyData::BypassInterceptor);
+ }
+ bool bindable(QUntypedBindable *bindable, QUntypedBindable target) override
+ {
+ interceptedBindable = true;
+ *bindable = target;
+ return true;
+ }
+
+ QQmlProperty m_property;
+ bool interceptedBindable = false;
+ bool interceptedWrite = false;
+};
+
+void tst_qqmlmetatype::interceptorAPI()
+{
+ qmlRegisterType<ForwardAndLogInterceptor>("test", 1, 0, "Interceptor");
+ QQmlEngine engine;
+ QQmlComponent component(&engine, testFileUrl("interceptorApi.qml"));
+ QScopedPointer<QObject> obj(component.create());
+ QVERIFY2(obj, qPrintable(component.errorString()));
+
+ auto interceptor = obj->property("i").value<ForwardAndLogInterceptor *>();
+ QVERIFY(interceptor->interceptedBindable);
+ QVERIFY(interceptor->interceptedWrite);
+
+ QQmlProperty objectName(obj.get(), "objectName");
+ QProperty<QString> hello(u"Hello, World!"_s);
+ QQmlAnyBinding binding;
+ binding = Qt::makePropertyBinding(hello);
+ interceptor->interceptedBindable = false;
+ binding.installOn(objectName, QQmlAnyBinding::RespectInterceptors);
+ QVERIFY(interceptor->interceptedBindable);
+ binding = QQmlAnyBinding::takeFrom(objectName);
+ objectName.write("bar");
+ interceptor->interceptedBindable = false;
+ binding.installOn(objectName, QQmlAnyBinding::IgnoreInterceptors);
+ QVERIFY(!interceptor->interceptedBindable);
+ QCOMPARE(objectName.read().toString(), hello.value());
+}
+
class Controller1 : public QObject
{
Q_OBJECT
@@ -573,6 +612,7 @@ class Grouped : public QObject
{
Q_OBJECT
Q_PROPERTY(int prop READ prop WRITE setProp NOTIFY propChanged REVISION 1)
+ Q_PROPERTY(int prop2 READ prop WRITE setProp NOTIFY prop2Changed REVISION 2)
public:
int prop() const { return m_prop; }
void setProp(int prop)
@@ -580,11 +620,13 @@ public:
if (prop != m_prop) {
m_prop = prop;
emit propChanged(prop);
+ emit prop2Changed(prop);
}
}
signals:
Q_REVISION(1) void propChanged(int prop);
+ Q_REVISION(2) void prop2Changed(int prop);
private:
int m_prop = 0;
@@ -602,13 +644,24 @@ private:
QScopedPointer<Grouped> m_grouped;
};
+class MyRevisioned : public MyItem
+{
+ Q_OBJECT
+ Q_PROPERTY(int revisioned READ revisioned CONSTANT REVISION 1)
+public:
+ int revisioned() const { return 12; }
+};
+
void tst_qqmlmetatype::revisionedGroupedProperties()
{
qmlClearTypeRegistrations();
qmlRegisterType<MyItem>("GroupedTest", 1, 0, "MyItem");
qmlRegisterType<MyItem, 1>("GroupedTest", 1, 1, "MyItem");
+ qmlRegisterType<MyRevisioned>("GroupedTest", 1, 0, "MyRevisioned");
+ qmlRegisterType<MyRevisioned, 1>("GroupedTest", 1, 1, "MyRevisioned");
qmlRegisterUncreatableType<Grouped>("GroupedTest", 1, 0, "Grouped", "Grouped");
qmlRegisterUncreatableType<Grouped, 1>("GroupedTest", 1, 1, "Grouped", "Grouped");
+ qmlRegisterUncreatableType<Grouped, 2>("GroupedTest", 1, 2, "Grouped", "Grouped");
{
QQmlEngine engine;
@@ -623,6 +676,15 @@ void tst_qqmlmetatype::revisionedGroupedProperties()
QQmlComponent invalid(&engine, testFileUrl("revisionedGroupedPropertiesInvalid.qml"));
QVERIFY(invalid.isError());
}
+
+ {
+ QQmlEngine engine;
+ QQmlComponent unversioned(
+ &engine, testFileUrl("revisionedGroupedPropertiesUnversioned.qml"));
+ QVERIFY2(unversioned.isReady(), qPrintable(unversioned.errorString()));
+ QScopedPointer<QObject> obj(unversioned.create());
+ QVERIFY(!obj.isNull());
+ }
}
void tst_qqmlmetatype::enumsInRecursiveImport_data()
@@ -654,6 +716,126 @@ void tst_qqmlmetatype::enumsInRecursiveImport()
QTRY_COMPARE(obj->property("color").toString(), QString("green"));
}
+void tst_qqmlmetatype::revertValueTypeAnimation()
+{
+ QQmlEngine engine;
+ QQmlComponent c(&engine, testFileUrl("animationOnValueType.qml"));
+ QVERIFY2(c.isReady(), qPrintable(c.errorString()));
+
+ QScopedPointer<QObject> o(c.create());
+ QTRY_COMPARE(o->property("letterSpacing").toDouble(), 24.0);
+ QCOMPARE(o->property("pointSize").toDouble(), 12.0);
+}
+
+void tst_qqmlmetatype::clearPropertyCaches()
+{
+ qmlClearTypeRegistrations();
+ qmlRegisterType<TestType>("ClearPropertyCaches", 1, 0, "A");
+ QQmlPropertyCache::ConstPtr oldCache = QQmlMetaType::propertyCache(&TestType::staticMetaObject);
+ QVERIFY(oldCache);
+ qmlClearTypeRegistrations();
+ qmlRegisterType<TestType>("ClearPropertyCaches", 1, 0, "B");
+ QQmlPropertyCache::ConstPtr newCache = QQmlMetaType::propertyCache(&TestType::staticMetaObject);
+ QVERIFY(oldCache.data() != newCache.data());
+}
+
+template<typename T>
+void checkBuiltinBaseType()
+{
+ const QQmlType type = QQmlMetaType::qmlType(QMetaType::fromType<T>());
+ QVERIFY(type.isValid());
+ QCOMPARE(type.typeId(), QMetaType::fromType<T>());
+ QCOMPARE(type.qListTypeId(), QMetaType::fromType<QList<T>>());
+}
+
+template<typename T>
+void checkBuiltinListType()
+{
+ const QQmlType listType = QQmlMetaType::qmlListType(QMetaType::fromType<QList<T>>());
+ QVERIFY(listType.isValid());
+ QVERIFY(listType.isSequentialContainer());
+ QCOMPARE(listType.typeId(), QMetaType::fromType<T>());
+ QCOMPARE(listType.qListTypeId(), QMetaType::fromType<QList<T>>());
+ QCOMPARE(listType.listMetaSequence().valueMetaType(), QMetaType::fromType<T>());
+}
+
+template<typename... T>
+void checkBuiltinTypes()
+{
+ (checkBuiltinBaseType<T>(), ...);
+ (checkBuiltinListType<T>(), ...);
+}
+
+template<typename T>
+void checkNamedBuiltin(const QString &name)
+{
+ const QQmlType expected = QQmlMetaType::qmlType(QMetaType::fromType<T>());
+ const QQmlType actual = QQmlMetaType::qmlType("QML/" + name, QTypeRevision::fromVersion(1, 0));
+ if (actual != expected) {
+ qWarning() << Q_FUNC_INFO << "looking for" << name;
+ qWarning() << "found" << actual.module() << actual.elementName() << actual.version()
+ << actual.typeId();
+ qWarning() << "expected" << expected.module() << expected.elementName()
+ << expected.version() << expected.typeId();
+ QFAIL("mismatch");
+ }
+}
+
+template<typename T>
+void checkObjectBuiltin(const QString &name)
+{
+ const QQmlType objectType = QQmlMetaType::qmlType(QMetaType::fromType<T *>());
+ QVERIFY(objectType.isValid());
+ QCOMPARE(objectType.typeId(), QMetaType::fromType<T *>());
+ QCOMPARE(objectType.qListTypeId(), QMetaType::fromType<QQmlListProperty<T>>());
+
+ const QQmlType listType = QQmlMetaType::qmlListType(QMetaType::fromType<QQmlListProperty<T>>());
+ QVERIFY(listType.isValid());
+ QCOMPARE(listType.typeId(), QMetaType::fromType<T *>());
+ QCOMPARE(listType.qListTypeId(), QMetaType::fromType<QQmlListProperty<T>>());
+
+ checkNamedBuiltin<T *>(name);
+}
+
+void tst_qqmlmetatype::builtins()
+{
+ qmlClearTypeRegistrations();
+ QQmlEngine engine; // registers the builtins
+
+ checkBuiltinTypes<
+ QVariant, QJSValue, qint8, quint8, short, ushort, int, uint, qlonglong, qulonglong, float,
+ double, QChar, QString, bool, QDateTime, QDate, QTime, QUrl, QByteArray>();
+
+ checkNamedBuiltin<QVariant>("var");
+ checkNamedBuiltin<QVariant>("variant");
+ checkNamedBuiltin<int>("int");
+ checkNamedBuiltin<double>("double");
+ checkNamedBuiltin<double>("real");
+ checkNamedBuiltin<QString>("string");
+ checkNamedBuiltin<bool>("bool");
+ checkNamedBuiltin<QDateTime>("date");
+ checkNamedBuiltin<QUrl>("url");
+
+#if QT_CONFIG(regularexpression)
+ checkBuiltinBaseType<QRegularExpression>();
+ checkBuiltinListType<QRegularExpression>();
+ checkNamedBuiltin<QRegularExpression>("regexp");
+#endif
+
+ // Can't retrieve this one by metatype
+ const QQmlType voidType = QQmlMetaType::qmlType("QML/void", QTypeRevision::fromVersion(1, 0));
+ QVERIFY(voidType.isValid());
+ QCOMPARE(voidType.typeId(), QMetaType());
+ QCOMPARE(voidType.qListTypeId(), QMetaType());
+
+ // No separate list types
+ checkBuiltinBaseType<std::nullptr_t>();
+ checkBuiltinBaseType<QVariantMap>();
+
+ checkObjectBuiltin<QObject>("QtObject");
+ checkObjectBuiltin<QQmlComponent>("Component");
+}
+
QTEST_MAIN(tst_qqmlmetatype)
#include "tst_qqmlmetatype.moc"