aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
authorAndrei Golubev <andrei.golubev@qt.io>2021-02-08 15:42:59 +0100
committerAndrei Golubev <andrei.golubev@qt.io>2021-02-12 12:00:09 +0100
commitf3281ca869420df83d618c255aa7d62e63a102d5 (patch)
tree4c990b4253313c3826dfb840cf427e8efa15b341 /tests/auto
parent9c282fe2e90eec05e160241069c219c7f09f4078 (diff)
Support runtime functions evaluation by index through QQmlEngine
Add execution function that can evaluate runtime functions available in the compilation unit. Private API for now as it's unclear what would be a comprehensive solution to support all existing use cases Task-number: QTBUG-84368 Task-number: QTBUG-91039 Change-Id: Icf755b53484587d7983eaae4821c1aa0111d5c05 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'tests/auto')
-rw-r--r--tests/auto/qml/qqmlengine/data/runtimeFunctions.qml6
-rw-r--r--tests/auto/qml/qqmlengine/tst_qqmlengine.cpp35
2 files changed, 41 insertions, 0 deletions
diff --git a/tests/auto/qml/qqmlengine/data/runtimeFunctions.qml b/tests/auto/qml/qqmlengine/data/runtimeFunctions.qml
new file mode 100644
index 0000000000..c14c13b540
--- /dev/null
+++ b/tests/auto/qml/qqmlengine/data/runtimeFunctions.qml
@@ -0,0 +1,6 @@
+import QtQml 2.15
+QtObject {
+ function getConstantValue() { return 42; }
+ function squareValue(x) { return x * x; }
+ function concatenate(str1, str2) { return str1 + str2; }
+}
diff --git a/tests/auto/qml/qqmlengine/tst_qqmlengine.cpp b/tests/auto/qml/qqmlengine/tst_qqmlengine.cpp
index 1abec1fa56..4e4292bac7 100644
--- a/tests/auto/qml/qqmlengine/tst_qqmlengine.cpp
+++ b/tests/auto/qml/qqmlengine/tst_qqmlengine.cpp
@@ -85,6 +85,7 @@ private slots:
void cachedGetterLookup_qtbug_75335();
void createComponentOnSingletonDestruction();
void uiLanguage();
+ void executeRuntimeFunction();
public slots:
QObject *createAQObjectForOwnershipTest ()
@@ -1234,6 +1235,40 @@ void tst_qqmlengine::uiLanguage()
}
}
+void tst_qqmlengine::executeRuntimeFunction()
+{
+ QQmlEngine engine;
+ QQmlEnginePrivate *priv = QQmlEnginePrivate::get(std::addressof(engine));
+
+ const QUrl url = testFileUrl("runtimeFunctions.qml");
+ QQmlComponent component(&engine, url);
+ QScopedPointer<QObject> dummy(component.create());
+
+ // getConstantValue():
+ const int constant = qjsvalue_cast<int>(priv->executeRuntimeFunction(url, 0, dummy.get()));
+ QCOMPARE(constant, 42);
+
+ // squareValue():
+ int x = 5;
+ void *a0[] = { nullptr, const_cast<void *>(reinterpret_cast<const void *>(std::addressof(x))) };
+ int t0[] = { 1, QMetaTypeId2<int>::qt_metatype_id() };
+ const int squared =
+ qjsvalue_cast<int>(priv->executeRuntimeFunction(url, 1, dummy.get(), a0, t0));
+ QCOMPARE(squared, x * x);
+
+ // concatenate():
+ QString str1 = QStringLiteral("Hello"); // uses "raw data" storage
+ QString str2 = QLatin1String(", Qml"); // uses own QString storage
+ void *a1[] = { nullptr,
+ const_cast<void *>(reinterpret_cast<const void *>(std::addressof(str1))),
+ const_cast<void *>(reinterpret_cast<const void *>(std::addressof(str2))) };
+ int t1[] = { 2, QMetaTypeId2<QString>::qt_metatype_id(),
+ QMetaTypeId2<QString>::qt_metatype_id() };
+ QString concatenated =
+ qjsvalue_cast<QString>(priv->executeRuntimeFunction(url, 2, dummy.get(), a1, t1));
+ QCOMPARE(concatenated, str1 + str2);
+}
+
QTEST_MAIN(tst_qqmlengine)
#include "tst_qqmlengine.moc"