diff options
Diffstat (limited to 'tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp')
-rw-r--r-- | tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp b/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp index 9cf622c2d7..7012153c20 100644 --- a/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp +++ b/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp @@ -203,6 +203,11 @@ private slots: void dontRemoveQPropertyBinding(); void compatResolveUrls(); + + void initFlags_data(); + void initFlags(); + + void constructFromPlainMetaObject(); private: QQmlEngine engine; }; @@ -2391,6 +2396,112 @@ void tst_qqmlproperty::compatResolveUrls() #endif } +void tst_qqmlproperty::initFlags_data() +{ + QTest::addColumn<bool>("passObject"); + QTest::addColumn<QString>("name"); + QTest::addColumn<QQmlPropertyPrivate::InitFlags>("flags"); + + const QString names[] = { + QStringLiteral("foo"), + QStringLiteral("self.foo"), + QStringLiteral("onFoo"), + QStringLiteral("self.onFoo"), + QStringLiteral("bar"), + QStringLiteral("self.bar"), + QStringLiteral("abar"), + QStringLiteral("self.abar"), + }; + + const QQmlPropertyPrivate::InitFlags flagSets[] = { + QQmlPropertyPrivate::InitFlag::None, + QQmlPropertyPrivate::InitFlag::AllowId, + QQmlPropertyPrivate::InitFlag::AllowSignal, + QQmlPropertyPrivate::InitFlag::AllowId | QQmlPropertyPrivate::InitFlag::AllowSignal, + }; + + for (int i = 0; i < 2; ++i) { + const bool passObject = (i != 0); + for (const QString &name : names) { + for (const QQmlPropertyPrivate::InitFlags flagSet : flagSets) { + const QString rowName = QStringLiteral("%1,%2,%3") + .arg(passObject).arg(name).arg(flagSet.toInt()); + QTest::addRow("%s", qPrintable(rowName)) << passObject << name << flagSet; + } + } + } +} + +void tst_qqmlproperty::initFlags() +{ + QFETCH(bool, passObject); + QFETCH(QString, name); + QFETCH(QQmlPropertyPrivate::InitFlags, flags); + + QQmlEngine engine; + QQmlComponent c(&engine); + c.setData(R"( + import QtQml + QtObject { + id: self + signal foo() + property int bar: 12 + property alias abar: self.bar + } + )", QUrl()); + QVERIFY(c.isReady()); + QScopedPointer<QObject> o(c.create()); + QVERIFY(!o.isNull()); + + QQmlRefPointer<QQmlContextData> context = QQmlContextData::get(qmlContext(o.data())); + + const QQmlProperty property = QQmlPropertyPrivate::create( + passObject ? o.data() : nullptr, name, context, flags); + + const bool usesId = name.startsWith(QStringLiteral("self.")); + const bool hasSignal = name.endsWith(QStringLiteral("foo")); + if (!passObject && !usesId) { + QVERIFY(!property.isValid()); + } else if (usesId && !(flags & QQmlPropertyPrivate::InitFlag::AllowId)) { + QVERIFY(!property.isValid()); + } else if (hasSignal && !(flags & QQmlPropertyPrivate::InitFlag::AllowSignal)) { + QVERIFY(!property.isValid()); + } else { + QVERIFY(property.isValid()); + if (name.endsWith(QStringLiteral("bar"))) { + QVERIFY(property.isProperty()); + QCOMPARE(property.name(), usesId ? name.mid(strlen("self.")) : name); + QCOMPARE(property.propertyMetaType(), QMetaType::fromType<int>()); + } else { + QVERIFY(property.isSignalProperty()); + QCOMPARE(property.name(), QStringLiteral("onFoo")); + QVERIFY(!property.propertyMetaType().isValid()); + } + } + +} + +void tst_qqmlproperty::constructFromPlainMetaObject() +{ + QScopedPointer<PropertyObject> obj(new PropertyObject); + + QQmlData *data = QQmlData::get(obj.data()); + QVERIFY(data == nullptr); + + QQmlProperty prop(obj.data(), "rectProperty"); + QVERIFY(prop.isValid()); + QVERIFY(prop.isProperty()); + QCOMPARE(prop.propertyMetaType(), QMetaType::fromType<QRect>()); + + QQmlProperty sig(obj.data(), "onOddlyNamedNotifySignal"); + QVERIFY(sig.isValid()); + QVERIFY(sig.isSignalProperty()); + QVERIFY(!sig.propertyMetaType().isValid()); + + data = QQmlData::get(obj.data()); + QVERIFY(data == nullptr); +} + QTEST_MAIN(tst_qqmlproperty) #include "tst_qqmlproperty.moc" |