aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/qml/qqmltranslation
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-03-06 16:19:42 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-11 18:31:21 +0100
commit914b72418b7e766026f2679254fcee93fc920866 (patch)
tree202634bd203c830ddc7eeb7dab1d071ca506b8a3 /tests/auto/qml/qqmltranslation
parentaf7ba8a6194b83fe7380b8d4ae027e2f04e21f17 (diff)
Add support for resolving translation bindings at compile time
Simple calls to qsTr and qsTrId are detected at type compile time and reduced to a special Translation and TranslationById binding type, which avoids allocating a QML binding at type instantiation type just to perform a translation. Change-Id: I61e4f2db2a8092b5e6870e174b832d9c20cd62b5 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'tests/auto/qml/qqmltranslation')
-rw-r--r--tests/auto/qml/qqmltranslation/data/translation.qml10
-rw-r--r--tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp65
2 files changed, 68 insertions, 7 deletions
diff --git a/tests/auto/qml/qqmltranslation/data/translation.qml b/tests/auto/qml/qqmltranslation/data/translation.qml
index 8435bedb28..b96471c9dd 100644
--- a/tests/auto/qml/qqmltranslation/data/translation.qml
+++ b/tests/auto/qml/qqmltranslation/data/translation.qml
@@ -1,13 +1,15 @@
import QtQuick 2.0
QtObject {
+ objectName: "test"
+
property string basic: qsTr("hello")
property string basic2: qsTranslate("CustomContext", "goodbye")
- property string basic3: if (1) qsTr("hello")
+ property string basic3: if (objectName.length > 0) qsTr("hello")
property string disambiguation: qsTr("hi", "informal 'hello'")
property string disambiguation2: qsTranslate("CustomContext", "see ya", "informal 'goodbye'")
- property string disambiguation3: if (1) qsTr("hi", "informal 'hello'")
+ property string disambiguation3: if (objectName.length > 0) qsTr("hi", "informal 'hello'")
property string _noop: QT_TR_NOOP("hello")
property string _noop2: QT_TRANSLATE_NOOP("CustomContext", "goodbye")
@@ -15,7 +17,7 @@ QtObject {
property string noop2: qsTranslate("CustomContext", _noop2)
property string singular: qsTr("%n duck(s)", "", 1)
- property string singular2: if (1) qsTr("%n duck(s)", "", 1)
+ property string singular2: if (objectName.length > 0) qsTr("%n duck(s)", "", 1)
property string plural: qsTr("%n duck(s)", "", 2)
- property string plural2: if (1) qsTr("%n duck(s)", "", 2)
+ property string plural2: if (objectName.length > 0) qsTr("%n duck(s)", "", 2)
}
diff --git a/tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp b/tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp
index 01e1cf85fb..d8e3d99e84 100644
--- a/tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp
+++ b/tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp
@@ -43,6 +43,9 @@
#include <QQmlEngine>
#include <QQmlComponent>
#include <QTranslator>
+#include <QQmlContext>
+#include <private/qqmlcompiler_p.h>
+#include <private/qqmlengine_p.h>
#include "../../shared/util.h"
class tst_qqmltranslation : public QQmlDataTest
@@ -61,16 +64,18 @@ void tst_qqmltranslation::translation_data()
{
QTest::addColumn<QString>("translation");
QTest::addColumn<QUrl>("testFile");
+ QTest::addColumn<bool>("verifyCompiledData");
- QTest::newRow("qml") << QStringLiteral("qml_fr") << testFileUrl("translation.qml");
- QTest::newRow("qrc") << QStringLiteral(":/qml_fr.qm") << QUrl("qrc:/translation.qml");
- QTest::newRow("js") << QStringLiteral("qml_fr") << testFileUrl("jstranslation.qml");
+ QTest::newRow("qml") << QStringLiteral("qml_fr") << testFileUrl("translation.qml") << true;
+ QTest::newRow("qrc") << QStringLiteral(":/qml_fr.qm") << QUrl("qrc:/translation.qml") << true;
+ QTest::newRow("js") << QStringLiteral("qml_fr") << testFileUrl("jstranslation.qml") << false;
}
void tst_qqmltranslation::translation()
{
QFETCH(QString, translation);
QFETCH(QUrl, testFile);
+ QFETCH(bool, verifyCompiledData);
QTranslator translator;
translator.load(translation, dataDirectory());
@@ -81,6 +86,38 @@ void tst_qqmltranslation::translation()
QObject *object = component.create();
QVERIFY(object != 0);
+ if (verifyCompiledData) {
+ QQmlContext *context = qmlContext(object);
+ QQmlEnginePrivate *engine = QQmlEnginePrivate::get(context->engine());
+ QQmlTypeData *typeData = engine->typeLoader.getType(context->baseUrl());
+ QQmlCompiledData *cdata = typeData->compiledData();
+ QVERIFY(cdata);
+
+ QSet<QString> compiledTranslations;
+ compiledTranslations << QStringLiteral("basic")
+ << QStringLiteral("disambiguation")
+ << QStringLiteral("singular") << QStringLiteral("plural");
+
+ const QV4::CompiledData::QmlUnit *unit = cdata->qmlUnit;
+ const QV4::CompiledData::Object *rootObject = unit->objectAt(unit->indexOfRootObject);
+ const QV4::CompiledData::Binding *binding = rootObject->bindingTable();
+ for (quint32 i = 0; i < rootObject->nBindings; ++i, ++binding) {
+ const QString propertyName = unit->header.stringAt(binding->propertyNameIndex);
+
+ const bool expectCompiledTranslation = compiledTranslations.contains(propertyName);
+
+ if (expectCompiledTranslation) {
+ if (binding->type != QV4::CompiledData::Binding::Type_Translation)
+ qDebug() << "binding for property" << propertyName << "is not a compiled translation";
+ QCOMPARE(binding->type, quint32(QV4::CompiledData::Binding::Type_Translation));
+ } else {
+ if (binding->type == QV4::CompiledData::Binding::Type_Translation)
+ qDebug() << "binding for property" << propertyName << "is not supposed to be a compiled translation";
+ QVERIFY(binding->type != QV4::CompiledData::Binding::Type_Translation);
+ }
+ }
+ }
+
QCOMPARE(object->property("basic").toString(), QLatin1String("bonjour"));
QCOMPARE(object->property("basic2").toString(), QLatin1String("au revoir"));
QCOMPARE(object->property("basic3").toString(), QLatin1String("bonjour"));
@@ -109,6 +146,28 @@ void tst_qqmltranslation::idTranslation()
QObject *object = component.create();
QVERIFY(object != 0);
+ {
+ QQmlContext *context = qmlContext(object);
+ QQmlEnginePrivate *engine = QQmlEnginePrivate::get(context->engine());
+ QQmlTypeData *typeData = engine->typeLoader.getType(context->baseUrl());
+ QQmlCompiledData *cdata = typeData->compiledData();
+ QVERIFY(cdata);
+
+ const QV4::CompiledData::QmlUnit *unit = cdata->qmlUnit;
+ const QV4::CompiledData::Object *rootObject = unit->objectAt(unit->indexOfRootObject);
+ const QV4::CompiledData::Binding *binding = rootObject->bindingTable();
+ for (quint32 i = 0; i < rootObject->nBindings; ++i, ++binding) {
+ const QString propertyName = unit->header.stringAt(binding->propertyNameIndex);
+ if (propertyName == "idTranslation") {
+ if (binding->type != QV4::CompiledData::Binding::Type_TranslationById)
+ qDebug() << "binding for property" << propertyName << "is not a compiled translation";
+ QCOMPARE(binding->type, quint32(QV4::CompiledData::Binding::Type_TranslationById));
+ } else {
+ QVERIFY(binding->type != QV4::CompiledData::Binding::Type_Translation);
+ }
+ }
+ }
+
QCOMPARE(object->property("idTranslation").toString(), QLatin1String("bonjour tout le monde"));
QCOMPARE(object->property("idTranslation2").toString(), QLatin1String("bonjour tout le monde"));
QCOMPARE(object->property("idTranslation3").toString(), QLatin1String("bonjour tout le monde"));