diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2014-02-26 10:26:51 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-02 14:48:49 +0100 |
commit | bf47d66216e649fe947956e02edd0a4b24ddb0fe (patch) | |
tree | 93bb25f64d77c4a0e66a08d6feb1a1e6fef7269c /tests/auto/qml | |
parent | 963875db263e4d1a04e03c4bb4fc20542bc8c21e (diff) |
[new compiler] Fix evaluateEnum for custom parsers
When storing the string for a script binding - next to to the AST node - then
for expression statements skip the (potentially synthetically inserted)
semicolon. Its omission is required for the use of QQmlCustomParser::evaluateEnum.
Change-Id: I3b556fd6a884f5c9c290d7d793eeab4dd135343e
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'tests/auto/qml')
-rw-r--r-- | tests/auto/qml/qqmllanguage/data/customParserEvaluateEnum.qml | 5 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/testtypes.cpp | 78 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/testtypes.h | 8 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp | 9 |
4 files changed, 100 insertions, 0 deletions
diff --git a/tests/auto/qml/qqmllanguage/data/customParserEvaluateEnum.qml b/tests/auto/qml/qqmllanguage/data/customParserEvaluateEnum.qml new file mode 100644 index 0000000000..7583f7041b --- /dev/null +++ b/tests/auto/qml/qqmllanguage/data/customParserEvaluateEnum.qml @@ -0,0 +1,5 @@ +import Test 1.0 +import QtQml 2.0 +MyCustomParserWithEnumType { + foo: MyEnum1Class.A_13; +} diff --git a/tests/auto/qml/qqmllanguage/testtypes.cpp b/tests/auto/qml/qqmllanguage/testtypes.cpp index 98a803a594..b18e6133cb 100644 --- a/tests/auto/qml/qqmllanguage/testtypes.cpp +++ b/tests/auto/qml/qqmllanguage/testtypes.cpp @@ -68,6 +68,7 @@ void registerTypes() qmlRegisterType<MySubclass>("Test",1,0,"MySubclass"); qmlRegisterCustomType<MyCustomParserType>("Test", 1, 0, "MyCustomParserType", new MyCustomParserTypeParser); + qmlRegisterCustomType<MyCustomParserType>("Test", 1, 0, "MyCustomParserWithEnumType", new EnumSupportingCustomParser); qmlRegisterTypeNotAvailable("Test",1,0,"UnavailableType", "UnavailableType is unavailable for testing"); @@ -177,3 +178,80 @@ void CustomBinding::componentComplete() QQmlPropertyPrivate::setBinding(property, binding); } } + + +QByteArray EnumSupportingCustomParser::compile(const QList<QQmlCustomParserProperty> &props) +{ + if (props.count() != 1) { + error(QStringLiteral("Custom parser invoked incorrectly for unit test")); + return QByteArray(); + } + QQmlCustomParserProperty prop = props.first(); + if (prop.name() != QStringLiteral("foo")) { + error(QStringLiteral("Custom parser invoked with the wrong property name")); + return QByteArray(); + } + + if (prop.assignedValues().count() != 1) { + error(QStringLiteral("Custom parser invoked with the wrong property values. Expected only one.")); + return QByteArray(); + } + + QVariant firstValue = prop.assignedValues().first(); + if (firstValue.userType() != qMetaTypeId<QQmlScript::Variant>()) { + error(QStringLiteral("Custom parser invoked with the wrong property value. Expected value instead of object or so")); + return QByteArray(); + } + QQmlScript::Variant value = qvariant_cast<QQmlScript::Variant>(firstValue); + if (!value.isScript()) { + error(QStringLiteral("Custom parser invoked with the wrong property value. Expected script that evaluates to enum")); + return QByteArray(); + } + QByteArray script = value.asScript().toUtf8(); + bool ok; + int v = evaluateEnum(script, &ok); + if (!ok) { + error(QStringLiteral("Custom parser invoked with the wrong property value. Script did not evaluate to enum")); + return QByteArray(); + } + if (v != MyEnum1Class::A_13) { + error(QStringLiteral("Custom parser invoked with the wrong property value. Enum value is not the expected value.")); + return QByteArray(); + } + + return QByteArray(); +} + +QByteArray EnumSupportingCustomParser::compile(const QV4::CompiledData::QmlUnit *qmlUnit, const QList<const QV4::CompiledData::Binding *> &bindings) +{ + Q_UNUSED(qmlUnit) + + if (bindings.count() != 1) { + error(bindings.first(), QStringLiteral("Custom parser invoked incorrectly for unit test")); + return QByteArray(); + } + + const QV4::CompiledData::Binding *binding = bindings.first(); + if (qmlUnit->header.stringAt(binding->propertyNameIndex) != QStringLiteral("foo")) { + error(binding, QStringLiteral("Custom parser invoked with the wrong property name")); + return QByteArray(); + } + + if (binding->type != QV4::CompiledData::Binding::Type_Script) { + error(binding, QStringLiteral("Custom parser invoked with the wrong property value. Expected script that evaluates to enum")); + return QByteArray(); + } + QByteArray script = qmlUnit->header.stringAt(binding->stringIndex).toUtf8(); + bool ok; + int v = evaluateEnum(script, &ok); + if (!ok) { + error(binding, QStringLiteral("Custom parser invoked with the wrong property value. Script did not evaluate to enum")); + return QByteArray(); + } + if (v != MyEnum1Class::A_13) { + error(binding, QStringLiteral("Custom parser invoked with the wrong property value. Enum value is not the expected value.")); + return QByteArray(); + } + + return QByteArray(); +} diff --git a/tests/auto/qml/qqmllanguage/testtypes.h b/tests/auto/qml/qqmllanguage/testtypes.h index 0416258075..27ad340256 100644 --- a/tests/auto/qml/qqmllanguage/testtypes.h +++ b/tests/auto/qml/qqmllanguage/testtypes.h @@ -723,6 +723,14 @@ public: void setCustomData(QObject *, const QByteArray &) {} }; +class EnumSupportingCustomParser : public QQmlCustomParser +{ +public: + QByteArray compile(const QList<QQmlCustomParserProperty> &props); + QByteArray compile(const QV4::CompiledData::QmlUnit *qmlUnit, const QList<const QV4::CompiledData::Binding *> &bindings); + void setCustomData(QObject *, const QByteArray &) {} +}; + class MyParserStatus : public QObject, public QQmlParserStatus { Q_INTERFACES(QQmlParserStatus) diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp index 34270bf1de..826bd124b7 100644 --- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp +++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp @@ -215,6 +215,7 @@ private slots: void compositeSingletonRegistered(); void customParserBindingScopes(); + void customParserEvaluateEnum(); private: QQmlEngine engine; @@ -3547,6 +3548,14 @@ void tst_qqmllanguage::customParserBindingScopes() QCOMPARE(child->property("testProperty").toInt(), 42); } +void tst_qqmllanguage::customParserEvaluateEnum() +{ + QQmlComponent component(&engine, testFile("customParserEvaluateEnum.qml")); + VERIFY_ERRORS(0); + QScopedPointer<QObject> o(component.create()); + QVERIFY(!o.isNull()); +} + QTEST_MAIN(tst_qqmllanguage) #include "tst_qqmllanguage.moc" |