From 1390891709236a2889d8afaeb00e1571767f480b Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Thu, 7 Jan 2021 16:03:03 +0100 Subject: QJSManagedValue: Allow retrieving and instantiating JS metatypes ... a.k.a InternalClass. This is a faster way of creating multiple similar objects, compared to a sequence of setProperty() calls. Change-Id: Iecc8c581e50b9062895dae9500ffe2482d88028e Reviewed-by: Fabian Kosmale --- .../qml/qjsmanagedvalue/tst_qjsmanagedvalue.cpp | 37 ++++++++++++++++++++++ .../auto/qml/qjsmanagedvalue/tst_qjsmanagedvalue.h | 1 + 2 files changed, 38 insertions(+) (limited to 'tests/auto/qml') diff --git a/tests/auto/qml/qjsmanagedvalue/tst_qjsmanagedvalue.cpp b/tests/auto/qml/qjsmanagedvalue/tst_qjsmanagedvalue.cpp index d245a034bb..75d3ccc12d 100644 --- a/tests/auto/qml/qjsmanagedvalue/tst_qjsmanagedvalue.cpp +++ b/tests/auto/qml/qjsmanagedvalue/tst_qjsmanagedvalue.cpp @@ -1785,4 +1785,41 @@ void tst_QJSManagedValue::stringByIndex() QVERIFY(str.property(506).isUndefined()); } +void tst_QJSManagedValue::jsMetaTypes() +{ + QJSEngine engine; + QJSManagedValue obj(engine.newObject(), &engine); + + QJSManagedValue emptyMetaType = obj.jsMetaType(); + QVERIFY(emptyMetaType.jsMetaMembers().isEmpty()); + + QJSManagedValue emptyObj = emptyMetaType.jsMetaInstantiate(); + QVERIFY(emptyObj.isObject()); + + obj.setProperty("a", 1); + obj.setProperty("b", "foo"); + obj.setProperty("llala", true); + obj.setProperty("ccc", QJSValue(std::move(emptyObj))); + + const QStringList expectedMembers = { "a", "b", "llala", "ccc" }; + + QJSManagedValue populatedMetaType = obj.jsMetaType(); + QCOMPARE(populatedMetaType.jsMetaMembers(), expectedMembers); + + QJSManagedValue populatedObj = populatedMetaType.jsMetaInstantiate( + {"bar", 11, QJSValue(QJSValue::NullValue), 17, "ignored"}); + QVERIFY(populatedObj.isObject()); + QCOMPARE(populatedObj.property("a").toString(), QStringLiteral("bar")); + QCOMPARE(populatedObj.property("b").toInt(), 11); + QVERIFY(populatedObj.property("llala").isNull()); + QCOMPARE(populatedObj.property("ccc").toInt(), 17); + + QJSManagedValue halfPopulated = populatedMetaType.jsMetaInstantiate({"one", 111}); + QVERIFY(halfPopulated.isObject()); + QCOMPARE(halfPopulated.property("a").toString(), QStringLiteral("one")); + QCOMPARE(halfPopulated.property("b").toInt(), 111); + QVERIFY(halfPopulated.property("llala").isUndefined()); + QVERIFY(halfPopulated.property("ccc").isUndefined()); +} + QTEST_MAIN(tst_QJSManagedValue) diff --git a/tests/auto/qml/qjsmanagedvalue/tst_qjsmanagedvalue.h b/tests/auto/qml/qjsmanagedvalue/tst_qjsmanagedvalue.h index 041aae56aa..ea0d49589d 100644 --- a/tests/auto/qml/qjsmanagedvalue/tst_qjsmanagedvalue.h +++ b/tests/auto/qml/qjsmanagedvalue/tst_qjsmanagedvalue.h @@ -108,6 +108,7 @@ private Q_SLOTS: void stringAndUrl(); void jsFunctionInVariant(); void stringByIndex(); + void jsMetaTypes(); private: void newEngine() { engine.reset(new QJSEngine()); } -- cgit v1.2.3