diff options
Diffstat (limited to 'tests/auto/qml/qqmlmetatype')
-rw-r--r-- | tests/auto/qml/qqmlmetatype/CMakeLists.txt | 6 | ||||
-rw-r--r-- | tests/auto/qml/qqmlmetatype/data/Components/App.qml | 2 | ||||
-rw-r--r-- | tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp | 114 |
3 files changed, 120 insertions, 2 deletions
diff --git a/tests/auto/qml/qqmlmetatype/CMakeLists.txt b/tests/auto/qml/qqmlmetatype/CMakeLists.txt index 7a5b47b571..2ab974ca91 100644 --- a/tests/auto/qml/qqmlmetatype/CMakeLists.txt +++ b/tests/auto/qml/qqmlmetatype/CMakeLists.txt @@ -7,6 +7,12 @@ ## 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} diff --git a/tests/auto/qml/qqmlmetatype/data/Components/App.qml b/tests/auto/qml/qqmlmetatype/data/Components/App.qml index 57b2b4520a..693cffea40 100644 --- a/tests/auto/qml/qqmlmetatype/data/Components/App.qml +++ b/tests/auto/qml/qqmlmetatype/data/Components/App.qml @@ -1,5 +1,5 @@ // Copyright (C) 2019 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only import QtQml 2.0 diff --git a/tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp b/tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp index c1bac33d87..04c2a5bfdb 100644 --- a/tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp +++ b/tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <qstandardpaths.h> #include <qtest.h> @@ -51,6 +51,9 @@ private slots: void enumsInRecursiveImport(); void revertValueTypeAnimation(); + + void clearPropertyCaches(); + void builtins(); }; class TestType : public QObject @@ -724,6 +727,115 @@ void tst_qqmlmetatype::revertValueTypeAnimation() 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" |