diff options
Diffstat (limited to 'tests/auto/qml/qqmlapplicationengine')
15 files changed, 225 insertions, 8 deletions
diff --git a/tests/auto/qml/qqmlapplicationengine/CMakeLists.txt b/tests/auto/qml/qqmlapplicationengine/CMakeLists.txt index 0570b9a95c..3b02ed09ef 100644 --- a/tests/auto/qml/qqmlapplicationengine/CMakeLists.txt +++ b/tests/auto/qml/qqmlapplicationengine/CMakeLists.txt @@ -7,6 +7,12 @@ ## tst_qqmlapplicationengine Test: ##################################################################### +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_qqmlapplicationengine LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() + # Collect test data file(GLOB_RECURSE test_data_glob RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} @@ -57,5 +63,12 @@ qt_internal_extend_target(tst_qqmlapplicationengine CONDITION NOT ANDROID AND NO DEFINES QT_QMLTEST_DATADIR="${CMAKE_CURRENT_SOURCE_DIR}/data" ) + add_subdirectory(testapp) add_subdirectory(androidassets) +add_dependencies(tst_qqmlapplicationengine testapp) + +add_subdirectory(loadFromModuleTranslationsQmlType) +add_subdirectory(loadFromModuleTranslationsCppType) +add_dependencies(tst_qqmlapplicationengine i18nLoadFromModuleQmlType) +add_dependencies(tst_qqmlapplicationengine i18nLoadFromModuleCppType) diff --git a/tests/auto/qml/qqmlapplicationengine/androidassets/CMakeLists.txt b/tests/auto/qml/qqmlapplicationengine/androidassets/CMakeLists.txt index c5d42ed9c4..eca18010ee 100644 --- a/tests/auto/qml/qqmlapplicationengine/androidassets/CMakeLists.txt +++ b/tests/auto/qml/qqmlapplicationengine/androidassets/CMakeLists.txt @@ -1,6 +1,12 @@ # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_androidassets LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() + qt_internal_add_test(tst_androidassets SOURCES tst_androidassets.cpp diff --git a/tests/auto/qml/qqmlapplicationengine/androidassets/tst_androidassets.cpp b/tests/auto/qml/qqmlapplicationengine/androidassets/tst_androidassets.cpp index 7a6774c268..ed55afc693 100644 --- a/tests/auto/qml/qqmlapplicationengine/androidassets/tst_androidassets.cpp +++ b/tests/auto/qml/qqmlapplicationengine/androidassets/tst_androidassets.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2022 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtQml/qqmlapplicationengine.h> #include <QtTest/qsignalspy.h> diff --git a/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsCppType/CMakeLists.txt b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsCppType/CMakeLists.txt new file mode 100644 index 0000000000..5c308b1f7e --- /dev/null +++ b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsCppType/CMakeLists.txt @@ -0,0 +1,30 @@ +# Copyright (C) 2024 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_standard_project_setup(REQUIRES 6.5 I18N_TRANSLATED_LANGUAGES es) + +qt_internal_add_executable(i18nLoadFromModuleCppType + OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/" + SOURCES + main.cpp + LIBRARIES + Qt::Gui + Qt::Qml +) + +qt_add_qml_module(i18nLoadFromModuleCppType + URI TranslatedCpp + QML_FILES Main.qml +) + +qt_internal_extend_target(i18nLoadFromModuleCppType + ENABLE_AUTOGEN_TOOLS + uic +) + +qt_add_resources(i18nLoadFromModuleCppType "loadFromModuleCppTypeQmFile" + PREFIX + /qt/qml/TranslatedCpp/ + FILES + i18n/qml_es.qm +) diff --git a/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsCppType/Main.qml b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsCppType/Main.qml new file mode 100644 index 0000000000..f1d2010837 --- /dev/null +++ b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsCppType/Main.qml @@ -0,0 +1,5 @@ +import QtQml + +QtObject { + Component.onCompleted: Qt.exit(0) +} diff --git a/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsCppType/i18n/qml_es.qm b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsCppType/i18n/qml_es.qm Binary files differnew file mode 100644 index 0000000000..e35ee63f89 --- /dev/null +++ b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsCppType/i18n/qml_es.qm diff --git a/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsCppType/i18n/qml_es.ts b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsCppType/i18n/qml_es.ts new file mode 100644 index 0000000000..f8d478f056 --- /dev/null +++ b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsCppType/i18n/qml_es.ts @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="es_ES"> +<context> + <name>QObject</name> + <message> + <location filename="../main.cpp" line="17"/> + <source>Hello</source> + <translation>Hola</translation> + </message> +</context> +</TS> diff --git a/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsCppType/main.cpp b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsCppType/main.cpp new file mode 100644 index 0000000000..326a1397dc --- /dev/null +++ b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsCppType/main.cpp @@ -0,0 +1,26 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QGuiApplication> +#include <QQmlApplicationEngine> + +int main(int argc, char *argv[]) +{ + QLocale::setDefault(QLocale(QLocale::Language(qEnvironmentVariableIntValue("qtlang")))); + QGuiApplication app(argc, argv); + QQmlApplicationEngine engine; + + QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed, + &app, []() { QCoreApplication::exit(-1); }, + Qt::QueuedConnection); + engine.loadFromModule("TranslatedCpp", "Main"); + app.exec(); + + QString expected = qgetenv("LOADFROMMODULE_TEST_EXPECTED_OUTPUT"); + QString actual = QObject::tr("Hello"); + + if (actual == expected) + return 0; + + return actual[0].toLatin1(); +} diff --git a/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsQmlType/CMakeLists.txt b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsQmlType/CMakeLists.txt new file mode 100644 index 0000000000..66183bc9c8 --- /dev/null +++ b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsQmlType/CMakeLists.txt @@ -0,0 +1,30 @@ +# Copyright (C) 2024 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_standard_project_setup(REQUIRES 6.5 I18N_TRANSLATED_LANGUAGES fr) + +qt_internal_add_executable(i18nLoadFromModuleQmlType + OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/" + SOURCES + main.cpp + LIBRARIES + Qt::Gui + Qt::Qml +) + +qt_add_qml_module(i18nLoadFromModuleQmlType + URI TranslatedQml + QML_FILES Main.qml +) + +qt_internal_extend_target(i18nLoadFromModuleQmlType + ENABLE_AUTOGEN_TOOLS + uic +) + +qt_add_resources(i18nLoadFromModuleQmlType "loadFromModuleQmlTypeQmFile" + PREFIX + /qt/qml/TranslatedQml/ + FILES + i18n/qml_fr.qm +) diff --git a/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsQmlType/Main.qml b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsQmlType/Main.qml new file mode 100644 index 0000000000..9f8e1984e9 --- /dev/null +++ b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsQmlType/Main.qml @@ -0,0 +1,13 @@ +import QtQml + +QtObject { + property string expected: "placeholder" + property string actual: qsTr("Hello") + + function f() { + if (expected === actual) + Qt.exit(0) + else + Qt.exit(actual.charCodeAt(0)) + } +} diff --git a/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsQmlType/i18n/qml_fr.qm b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsQmlType/i18n/qml_fr.qm Binary files differnew file mode 100644 index 0000000000..a53cf121a2 --- /dev/null +++ b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsQmlType/i18n/qml_fr.qm diff --git a/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsQmlType/i18n/qml_fr.ts b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsQmlType/i18n/qml_fr.ts new file mode 100644 index 0000000000..87b46be9ca --- /dev/null +++ b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsQmlType/i18n/qml_fr.ts @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="fr_FR"> +<context> + <name>Main</name> + <message> + <location filename="../Main.qml" line="5"/> + <source>Hello</source> + <translation>Salut</translation> + </message> +</context> +</TS> diff --git a/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsQmlType/main.cpp b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsQmlType/main.cpp new file mode 100644 index 0000000000..6f28ec8148 --- /dev/null +++ b/tests/auto/qml/qqmlapplicationengine/loadFromModuleTranslationsQmlType/main.cpp @@ -0,0 +1,23 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QGuiApplication> +#include <QQmlApplicationEngine> + +int main(int argc, char *argv[]) +{ + QLocale::setDefault(QLocale(QLocale::Language(qEnvironmentVariableIntValue("qtlang")))); + QGuiApplication app(argc, argv); + QQmlApplicationEngine engine; + + QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed, + &app, []() { QCoreApplication::exit(-1); }, + Qt::QueuedConnection); + engine.loadFromModule("TranslatedQml", "Main"); + + QString expected = qgetenv("LOADFROMMODULE_TEST_EXPECTED_OUTPUT"); + auto *root = engine.rootObjects().first(); + root->setProperty("expected", expected); + root->metaObject()->invokeMethod(root, "f"); + return app.exec(); +} diff --git a/tests/auto/qml/qqmlapplicationengine/testapp/main.cpp b/tests/auto/qml/qqmlapplicationengine/testapp/main.cpp index 468c8428ba..6ccd256cca 100644 --- a/tests/auto/qml/qqmlapplicationengine/testapp/main.cpp +++ b/tests/auto/qml/qqmlapplicationengine/testapp/main.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2016 Research In Motion. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QCoreApplication> #include <QQmlApplicationEngine> diff --git a/tests/auto/qml/qqmlapplicationengine/tst_qqmlapplicationengine.cpp b/tests/auto/qml/qqmlapplicationengine/tst_qqmlapplicationengine.cpp index 5774b68c32..3bf83d81e1 100644 --- a/tests/auto/qml/qqmlapplicationengine/tst_qqmlapplicationengine.cpp +++ b/tests/auto/qml/qqmlapplicationengine/tst_qqmlapplicationengine.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2016 Research In Motion. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QQmlApplicationEngine> #include <QScopedPointer> @@ -28,6 +28,8 @@ private slots: void removeObjectsWhenDestroyed(); void loadTranslation_data(); void loadTranslation(); + void loadFromModuleTranslation_data(); + void loadFromModuleTranslation(); void translationChange(); void setInitialProperties(); void failureToLoadTriggersWarningSignal(); @@ -144,7 +146,7 @@ void tst_qqmlapplicationengine::application() #if QT_CONFIG(process) QDir::setCurrent(buildDir); - QProcess *testProcess = new QProcess(this); + std::unique_ptr<QProcess> testProcess = std::make_unique<QProcess>(this); #ifdef Q_OS_QNX QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); env.insert("QT_FORCE_STDERR_LOGGING", "1"); // QTBUG-76546 @@ -164,7 +166,7 @@ void tst_qqmlapplicationengine::application() QVERIFY2(QString(testStdErr).endsWith(QString(expectedStdErr)), QByteArray("\nExpected ending:\n") + expectedStdErr + QByteArray("\nActual output:\n") + testStdErr); - delete testProcess; + testProcess.reset(); QDir::setCurrent(srcDir); #else // process QSKIP("No process support"); @@ -191,7 +193,7 @@ void tst_qqmlapplicationengine::applicationProperties() QCoreApplication::setOrganizationName(firstOrganization); QCoreApplication::setOrganizationDomain(firstDomain); - QQmlApplicationEngine *test = new QQmlApplicationEngine(testFileUrl("applicationTest.qml")); + std::unique_ptr<QQmlApplicationEngine> test = std::make_unique<QQmlApplicationEngine>(testFileUrl("applicationTest.qml")); QObject* root = test->rootObjects().at(0); QVERIFY(root); QCOMPARE(root->property("originalName").toString(), firstName); @@ -223,8 +225,6 @@ void tst_qqmlapplicationengine::applicationProperties() QCOMPARE(versionChanged.size(), 1); QCOMPARE(organizationChanged.size(), 1); QCOMPARE(domainChanged.size(), 1); - - delete test; } void tst_qqmlapplicationengine::removeObjectsWhenDestroyed() @@ -268,6 +268,53 @@ void tst_qqmlapplicationengine::loadTranslation() QCOMPARE(rootObject->property("translation").toString(), translation); } +void tst_qqmlapplicationengine::loadFromModuleTranslation_data() +{ + QTest::addColumn<QString>("executable"); + QTest::addColumn<QLocale::Language>("LANG"); + QTest::addColumn<QString>("output"); + + QString qmlTypeExecutable = "loadFromModuleTranslationsQmlType/i18nLoadFromModuleQmlType"; + QString cppTypeExecutable = "loadFromModuleTranslationsCppType/i18nLoadFromModuleCppType"; + + QTest::newRow("Qml: en -> en") << qmlTypeExecutable << QLocale::English << "Hello"; + QTest::newRow("Qml: en -> fr") << qmlTypeExecutable << QLocale::French << "Salut"; + QTest::newRow("Cpp: en -> en") << cppTypeExecutable << QLocale::English << "Hello"; + QTest::newRow("Cpp: en -> es") << cppTypeExecutable << QLocale::Spanish << "Hola"; +} + +void tst_qqmlapplicationengine::loadFromModuleTranslation() +{ +#if defined(Q_OS_ANDROID) + QSKIP("Test doesn't currently run on Android"); + return; +#endif + +#if QT_CONFIG(process) + QFETCH(QString, executable); + QFETCH(QLocale::Language, LANG); + QFETCH(QString, output); + + QDir::setCurrent(buildDir); + QProcess app; + auto env = QProcessEnvironment::systemEnvironment(); + env.insert("qtlang", QString::number(int(LANG))); + env.insert("LOADFROMMODULE_TEST_EXPECTED_OUTPUT", output); + app.setProcessEnvironment(env); + app.start(executable); + QVERIFY(app.waitForStarted()); + QVERIFY(app.waitForFinished()); + + auto status = app.exitStatus(); + auto code = app.exitCode(); + QVERIFY2(code == 0, + QStringLiteral("status: %1, exitCode: %2").arg(status).arg(code).toStdString().c_str()); + app.kill(); +#else + QSKIP("No process support"); +#endif +} + void tst_qqmlapplicationengine::translationChange() { if (QLocale().language() == QLocale::SwissGerman) { |