diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2019-07-22 09:02:58 +0200 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2019-07-23 16:37:41 +0200 |
commit | c0e0c755a1c927299607f0af83fadb4a0af6ce20 (patch) | |
tree | a0792012516207c2244d5a3e3bf92b86404c9a86 /tests | |
parent | da14688140550879e376e71cf273b16494e6c3c4 (diff) |
Support top level generator functions
Extends grammar to support generator functions in QML components and
adjusts codegen accordingly
The corresponding test case must be blacklisted in tst_qmlmin, as qmlmin
cannot handle yield statements
Fixes: QTBUG-77096
Change-Id: I47d45dd56289cdf073b41932a585259d3052de04
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/qml/qmlmin/tst_qmlmin.cpp | 2 | ||||
-rw-r--r-- | tests/auto/qml/qqmlecmascript/data/generatorFunction.qml | 22 | ||||
-rw-r--r-- | tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp | 23 |
3 files changed, 47 insertions, 0 deletions
diff --git a/tests/auto/qml/qmlmin/tst_qmlmin.cpp b/tests/auto/qml/qmlmin/tst_qmlmin.cpp index 696ec66246..cae833cd60 100644 --- a/tests/auto/qml/qmlmin/tst_qmlmin.cpp +++ b/tests/auto/qml/qmlmin/tst_qmlmin.cpp @@ -130,6 +130,8 @@ void tst_qmlmin::initTestCase() invalidFiles << "tests/auto/qml/qjsengine/script/com/trolltech/syntaxerror/__init__.js"; invalidFiles << "tests/auto/qml/debugger/qqmlpreview/data/broken.qml"; invalidFiles << "tests/auto/qml/qqmllanguage/data/fuzzed.2.qml"; + // generatorFunction.qml is not invalid per se, but the minifier cannot handle yield statements + invalidFiles << "tests/auto/qml/qqmlecmascript/data/generatorFunction.qml"; #endif } diff --git a/tests/auto/qml/qqmlecmascript/data/generatorFunction.qml b/tests/auto/qml/qqmlecmascript/data/generatorFunction.qml new file mode 100644 index 0000000000..66bb642f34 --- /dev/null +++ b/tests/auto/qml/qqmlecmascript/data/generatorFunction.qml @@ -0,0 +1,22 @@ +import QtQml 2.12 + +QtObject { + id: root + property bool test1: false; + property bool test2: false; + property bool test3: false; + property bool done: false; + function *gen() { + yield 1 + yield 2 + yield 3 + } + + Component.onCompleted: { + let it = root.gen(); + root.test1 = (it.next().value == 1); + root.test2 = (it.next().value == 2); + root.test3 = (it.next().value == 3); + root.done = it.next().done; + } +} diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp index 00105c4225..b44fe9766c 100644 --- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp +++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp @@ -233,6 +233,7 @@ private slots: void functionAssignment_afterBinding(); void eval(); void function(); + void topLevelGeneratorFunction(); void qtbug_10696(); void qtbug_11606(); void qtbug_11600(); @@ -6348,6 +6349,28 @@ void tst_qqmlecmascript::function() delete o; } +// QTBUG-77096 +void tst_qqmlecmascript::topLevelGeneratorFunction() +{ + QQmlEngine engine; + QQmlComponent component(&engine, testFileUrl("generatorFunction.qml")); + + QScopedPointer<QObject> o {component.create()}; + QVERIFY(o != nullptr); + + // check that generator works correctly in QML + QCOMPARE(o->property("test1").toBool(), true); + QCOMPARE(o->property("test2").toBool(), true); + QCOMPARE(o->property("test3").toBool(), true); + QCOMPARE(o->property("done").toBool(), true); + + // check that generator is accessible from C++ + QVariant returnedValue; + QMetaObject::invokeMethod(o.get(), "gen", Q_RETURN_ARG(QVariant, returnedValue)); + auto it = returnedValue.value<QJSValue>(); + QCOMPARE(it.property("next").callWithInstance(it).property("value").toInt(), 1); +} + // Test the "Qt.include" method void tst_qqmlecmascript::include() { |