diff options
Diffstat (limited to 'tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp')
-rw-r--r-- | tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp | 197 |
1 files changed, 117 insertions, 80 deletions
diff --git a/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp b/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp index a2fb035557..c76500ea11 100644 --- a/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp +++ b/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp @@ -1,34 +1,17 @@ -/**************************************************************************** -** -** 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 <QtTest/QtTest> +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QTest> +#include <QWaitCondition> +#include <QMutex> +#include <QStandardPaths> #include <qtranslator.h> #include <qfile.h> +#include <qtemporarydir.h> + +#ifdef Q_OS_ANDROID +#include <QDirIterator> +#endif class tst_QTranslator : public QObject { @@ -37,12 +20,14 @@ class tst_QTranslator : public QObject public: tst_QTranslator(); protected: - bool eventFilter(QObject *obj, QEvent *event); + bool eventFilter(QObject *obj, QEvent *event) override; private slots: void initTestCase(); + void init(); void load_data(); void load(); + void loadLocale(); void threadLoad(); void testLanguageChange(); void plural(); @@ -64,38 +49,14 @@ tst_QTranslator::tst_QTranslator() void tst_QTranslator::initTestCase() { -#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED) - QString sourceDir(":/android_testdata/"); - QDirIterator it(sourceDir, QDirIterator::Subdirectories); - while (it.hasNext()) { - it.next(); - - QFileInfo sourceFileInfo = it.fileInfo(); - if (!sourceFileInfo.isDir()) { - QFileInfo destinationFileInfo(QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + QLatin1Char('/') + sourceFileInfo.filePath().mid(sourceDir.length())); - - if (!destinationFileInfo.exists()) { - QVERIFY(QDir().mkpath(destinationFileInfo.path())); - QVERIFY(QFile::copy(sourceFileInfo.filePath(), destinationFileInfo.filePath())); - } - } - } - - QDir::setCurrent(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)); -#endif - - // chdir into the directory containing our testdata, - // to make the code simpler (load testdata via relative paths) -#if 0 - // ### TODO: Use this for all platforms in 5.7 - dataDir = QEXTRACTTESTDATA(QStringLiteral("/")); + dataDir = QEXTRACTTESTDATA(QStringLiteral("/tst_qtranslator")); QVERIFY2(!dataDir.isNull(), qPrintable("Could not extract test data")); - QVERIFY2(QDir::setCurrent(dataDir->path()), qPrintable("Could not chdir to " + dataDir->path())); -#else - QString testdata_dir = QFileInfo(QFINDTESTDATA("hellotr_la.qm")).absolutePath(); - QVERIFY2(QDir::setCurrent(testdata_dir), qPrintable("Could not chdir to " + testdata_dir)); -#endif +} +void tst_QTranslator::init() +{ + QVERIFY2(QDir::setCurrent(dataDir->path()), + qPrintable("Could not chdir to " + dataDir->path())); } bool tst_QTranslator::eventFilter(QObject *, QEvent *event) @@ -134,7 +95,7 @@ void tst_QTranslator::load() { QFile file(filepath); - file.open(QFile::ReadOnly); + QVERIFY(file.open(QFile::ReadOnly)); QByteArray data = file.readAll(); QTranslator tor; QVERIFY(tor.load((const uchar *)data.constData(), data.length())); @@ -155,11 +116,78 @@ void tst_QTranslator::load() } } +void tst_QTranslator::loadLocale() +{ + QLocale locale; + auto localeName = locale.uiLanguages(QLocale::TagSeparator::Underscore).value(0); + if (localeName.isEmpty()) + QSKIP("This test requires at least one available UI language."); + + QByteArray ba; + { + QFile file(":/tst_qtranslator/hellotr_la.qm"); + QVERIFY2(file.open(QFile::ReadOnly), qPrintable(file.errorString())); + ba = file.readAll(); + QVERIFY(!ba.isEmpty()); + } + + QTemporaryDir dir; + QVERIFY(dir.isValid()); + + auto path = dir.path(); + QFile file(path + "/dummy"); + QVERIFY2(file.open(QFile::WriteOnly), qPrintable(file.errorString())); + QCOMPARE(file.write(ba), ba.size()); + file.close(); + + /* + Test the following order: + + /tmp/tmpDir/foo-en_US.qm + /tmp/tmpDir/foo-en_US + /tmp/tmpDir/foo-en.qm + /tmp/tmpDir/foo-en + /tmp/tmpDir/foo.qm + /tmp/tmpDir/foo- + /tmp/tmpDir/foo + */ + + QStringList files; + while (true) { + files.append(path + "/foo-" + localeName + ".qm"); + QVERIFY2(file.copy(files.last()), qPrintable(file.errorString())); + + files.append(path + "/foo-" + localeName); + QVERIFY2(file.copy(files.last()), qPrintable(file.errorString())); + + int rightmost = localeName.lastIndexOf(QLatin1Char('_')); + if (rightmost <= 0) + break; + localeName.truncate(rightmost); + } + + files.append(path + "/foo.qm"); + QVERIFY2(file.copy(files.last()), qPrintable(file.errorString())); + + files.append(path + "/foo-"); + QVERIFY2(file.copy(files.last()), qPrintable(file.errorString())); + + files.append(path + "/foo"); + QVERIFY2(file.rename(files.last()), qPrintable(file.errorString())); + + QTranslator tor; + for (const auto &filePath : files) { + QVERIFY(tor.load(locale, "foo", "-", path, ".qm")); + QCOMPARE(tor.filePath(), filePath); + QVERIFY2(file.remove(filePath), qPrintable(file.errorString())); + } +} + class TranslatorThread : public QThread { - void run() { + void run() override { QTranslator tor( 0 ); - tor.load("hellotr_la"); + (void)tor.load("hellotr_la"); if (tor.isEmpty()) qFatal("Could not load translation"); @@ -181,17 +209,17 @@ void tst_QTranslator::testLanguageChange() languageChangeEventCounter = 0; QTranslator *tor = new QTranslator; - tor->load("hellotr_la.qm"); + QVERIFY(tor->load("hellotr_la.qm")); qApp->sendPostedEvents(); qApp->sendPostedEvents(); QCOMPARE(languageChangeEventCounter, 0); - tor->load("doesn't exist, same as clearing"); + QVERIFY(!tor->load("doesn't exist, same as clearing")); qApp->sendPostedEvents(); qApp->sendPostedEvents(); QCOMPARE(languageChangeEventCounter, 0); - tor->load("hellotr_la.qm"); + QVERIFY(tor->load("hellotr_la.qm")); qApp->sendPostedEvents(); qApp->sendPostedEvents(); QCOMPARE(languageChangeEventCounter, 0); @@ -201,12 +229,12 @@ void tst_QTranslator::testLanguageChange() qApp->sendPostedEvents(); QCOMPARE(languageChangeEventCounter, 1); - tor->load("doesn't exist, same as clearing"); + QVERIFY(!tor->load("doesn't exist, same as clearing")); qApp->sendPostedEvents(); qApp->sendPostedEvents(); QCOMPARE(languageChangeEventCounter, 2); - tor->load("hellotr_la.qm"); + QVERIFY(tor->load("hellotr_la.qm")); qApp->sendPostedEvents(); qApp->sendPostedEvents(); QCOMPARE(languageChangeEventCounter, 3); @@ -216,7 +244,7 @@ void tst_QTranslator::testLanguageChange() qApp->sendPostedEvents(); QCOMPARE(languageChangeEventCounter, 4); - tor->load("doesn't exist, same as clearing"); + QVERIFY(!tor->load("doesn't exist, same as clearing")); qApp->sendPostedEvents(); qApp->sendPostedEvents(); QCOMPARE(languageChangeEventCounter, 4); @@ -226,7 +254,7 @@ void tst_QTranslator::testLanguageChange() qApp->sendPostedEvents(); QCOMPARE(languageChangeEventCounter, 4); - tor->load("hellotr_la.qm"); + QVERIFY(tor->load("hellotr_la.qm")); qApp->sendPostedEvents(); qApp->sendPostedEvents(); QCOMPARE(languageChangeEventCounter, 5); @@ -243,7 +271,7 @@ void tst_QTranslator::plural() { QTranslator tor( 0 ); - tor.load("hellotr_la"); + QVERIFY(tor.load("hellotr_la")); QVERIFY(!tor.isEmpty()); QCoreApplication::installTranslator(&tor); QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 0), QLatin1String("Hallo 0 Welten!")); @@ -254,7 +282,7 @@ void tst_QTranslator::plural() void tst_QTranslator::translate_qm_file_generated_with_msgfmt() { QTranslator translator; - translator.load("msgfmt_from_po"); + QVERIFY(translator.load("msgfmt_from_po")); qApp->installTranslator(&translator); QCOMPARE(QCoreApplication::translate("", "Intro"), QLatin1String("Einleitung")); @@ -275,7 +303,7 @@ void tst_QTranslator::loadDirectory() QVERIFY(QFileInfo("../" + current_base).isDir()); QTranslator tor; - tor.load(current_base, ".."); + QVERIFY(!tor.load(current_base, "..")); QVERIFY(tor.isEmpty()); } @@ -284,7 +312,7 @@ void tst_QTranslator::dependencies() { // load QTranslator tor; - tor.load("dependencies_la"); + QVERIFY(tor.load("dependencies_la")); QVERIFY(!tor.isEmpty()); QCOMPARE(tor.translate("QPushButton", "Hello world!"), QLatin1String("Hallo Welt!")); @@ -301,12 +329,21 @@ void tst_QTranslator::dependencies() { QTranslator tor( 0 ); QFile file("dependencies_la.qm"); - file.open(QFile::ReadOnly); + QVERIFY(file.open(QFile::ReadOnly)); QByteArray data = file.readAll(); - tor.load((const uchar *)data.constData(), data.length()); + QVERIFY(tor.load((const uchar *)data.constData(), data.length())); QVERIFY(!tor.isEmpty()); QCOMPARE(tor.translate("QPushButton", "Hello world!"), QLatin1String("Hallo Welt!")); } + + { + // Test resolution of paths relative to main file + const QString absoluteFile = QFileInfo("dependencies_la").absoluteFilePath(); + QDir::setCurrent(QDir::tempPath()); + QTranslator tor; + QVERIFY(tor.load(absoluteFile)); + QVERIFY(!tor.isEmpty()); + } } struct TranslateThread : public QThread @@ -316,7 +353,7 @@ struct TranslateThread : public QThread QMutex startupLock; QWaitCondition runningCondition; - void run() { + void run() override { bool startSignalled = false; while (terminate.loadRelaxed() == 0) { @@ -346,9 +383,9 @@ void tst_QTranslator::translationInThreadWhileInstallingTranslator() thread.runningCondition.wait(&thread.startupLock); - QTranslator *tor = new QTranslator; - tor->load("hellotr_la"); - QCoreApplication::installTranslator(tor); + QTranslator tor; + QVERIFY(tor.load("hellotr_la")); + QVERIFY(QCoreApplication::installTranslator(&tor)); ++thread.terminate; |