1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include <qtest.h>
#include <QtQml/qqmlengine.h>
#include <QtQml/qqmlfile.h>
#include <QtQml/qqmlcomponent.h>
#include <QtQml/qqmlexpression.h>
#include <QtQml/qqmlscriptstring.h>
#include <QtQuickTestUtils/private/qmlutils_p.h>
class tst_qqmlexpression : public QQmlDataTest
{
Q_OBJECT
public:
tst_qqmlexpression() : QQmlDataTest(QT_QMLTEST_DATADIR) {}
private slots:
void scriptString();
void syntaxError();
void exception();
void expressionFromDataComponent();
};
class TestObject : public QObject
{
Q_OBJECT
Q_PROPERTY(QQmlScriptString scriptString READ scriptString WRITE setScriptString)
Q_PROPERTY(QQmlScriptString scriptStringError READ scriptStringError WRITE setScriptStringError)
public:
TestObject(QObject *parent = nullptr) : QObject(parent) {}
QQmlScriptString scriptString() const { return m_scriptString; }
void setScriptString(QQmlScriptString scriptString) { m_scriptString = scriptString; }
QQmlScriptString scriptStringError() const { return m_scriptStringError; }
void setScriptStringError(QQmlScriptString scriptString) { m_scriptStringError = scriptString; }
private:
QQmlScriptString m_scriptString;
QQmlScriptString m_scriptStringError;
};
QML_DECLARE_TYPE(TestObject)
void tst_qqmlexpression::scriptString()
{
qmlRegisterType<TestObject>("Test", 1, 0, "TestObject");
QQmlEngine engine;
QQmlComponent c(&engine, testFileUrl("scriptString.qml"));
TestObject *testObj = qobject_cast<TestObject*>(c.create());
QVERIFY(testObj != nullptr);
QQmlScriptString script = testObj->scriptString();
QVERIFY(!script.isEmpty());
QQmlExpression expression(script);
QVariant value = expression.evaluate();
QCOMPARE(value.toInt(), 15);
QQmlScriptString scriptError = testObj->scriptStringError();
QVERIFY(!scriptError.isEmpty());
//verify that the expression has the correct error location information
QQmlExpression expressionError(scriptError);
QVariant valueError = expressionError.evaluate();
QVERIFY(!valueError.isValid());
QVERIFY(expressionError.hasError());
QQmlError error = expressionError.error();
QCOMPARE(error.url(), c.url());
QCOMPARE(error.line(), 8);
}
// QTBUG-21310 - crash test
void tst_qqmlexpression::syntaxError()
{
QQmlEngine engine;
QQmlExpression expression(engine.rootContext(), nullptr, "asd asd");
bool isUndefined = false;
QVariant v = expression.evaluate(&isUndefined);
QCOMPARE(v, QVariant());
QVERIFY(expression.hasError());
QCOMPARE(expression.error().description(), "SyntaxError: Expected token `;'");
QVERIFY(isUndefined);
}
void tst_qqmlexpression::exception()
{
QQmlEngine engine;
QQmlExpression expression(engine.rootContext(), nullptr, "abc=123");
QVariant v = expression.evaluate();
QCOMPARE(v, QVariant());
QVERIFY(expression.hasError());
}
void tst_qqmlexpression::expressionFromDataComponent()
{
qmlRegisterType<TestObject>("Test", 1, 0, "TestObject");
QQmlEngine engine;
QQmlComponent c(&engine);
const QString fn(QLatin1String("expressionFromDataComponent.qml"));
QUrl url = testFileUrl(fn);
QString path = testFile(fn);
{
QFile f(path);
QVERIFY(f.open(QIODevice::ReadOnly));
c.setData(f.readAll(), url);
}
QScopedPointer<TestObject> object;
object.reset(qobject_cast<TestObject*>(c.create()));
Q_ASSERT(!object.isNull());
QQmlExpression expression(object->scriptString());
QVariant result = expression.evaluate();
QCOMPARE(result.typeId(), QMetaType::QString);
QCOMPARE(result.toString(), QStringLiteral("success"));
}
QTEST_MAIN(tst_qqmlexpression)
#include "tst_qqmlexpression.moc"
|