blob: 0ba29d6b6a35947c0ea88383c1a26fdb0de70031 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <qtest.h>
#include <QtQml/qqmlengine.h>
#include <QtQml/qqmlfile.h>
#include <QtQml/qqmlcomponent.h>
#include <QtQml/qqmlexpression.h>
#include <QtQml/qqmlscriptstring.h>
#include "../../shared/util.h"
class tst_qqmlexpression : public QQmlDataTest
{
Q_OBJECT
public:
tst_qqmlexpression() {}
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.type(), QVariant::String);
QCOMPARE(result.toString(), QStringLiteral("success"));
}
QTEST_MAIN(tst_qqmlexpression)
#include "tst_qqmlexpression.moc"