You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
6.7 KiB
153 lines
6.7 KiB
#include "../src/gui_language.h" |
|
#include "../src/networksettingspage.h" |
|
#include "../transport/node_config.h" |
|
#include "../transport/config_updater.h" |
|
#include "../../../lib/debug_config.h" |
|
|
|
#include <QtTest> |
|
#include <QComboBox> |
|
#include <QDialogButtonBox> |
|
#include <QPushButton> |
|
#include <QFile> |
|
#include <QTemporaryDir> |
|
#include <QTranslator> |
|
#include <QXmlStreamReader> |
|
#include <QRegularExpression> |
|
|
|
class GuiLanguageTest : public QObject { |
|
Q_OBJECT |
|
|
|
private slots: |
|
void initTestCase() { debug_config_init(); } |
|
|
|
void systemPreference() { |
|
QCOMPARE(resolveGuiLanguage("system", {"ru-RU", "en-US"}), QString("ru")); |
|
QCOMPARE(resolveGuiLanguage("system", {"en-GB", "ru-RU"}), QString("en")); |
|
QCOMPARE(resolveGuiLanguage("system", {"de-DE", "ru_RU"}), QString("ru")); |
|
QCOMPARE(resolveGuiLanguage("system", {"fr-FR"}), QString("en")); |
|
QCOMPARE(resolveGuiLanguage("system", {}), QString("en")); |
|
QCOMPARE(resolveGuiLanguage("ru", {"en-US"}), QString("ru")); |
|
QCOMPARE(resolveGuiLanguage("en", {"ru-RU"}), QString("en")); |
|
} |
|
|
|
void preferencePersistence() { |
|
QTemporaryDir directory; |
|
QVERIFY(directory.isValid()); |
|
const QString path = directory.filePath("vibechat.cfg"); |
|
NodeConfig config(path); |
|
QVERIFY(config.create("Language test", 1333)); |
|
QCOMPARE(config.language(), QString("system")); |
|
for (const QString& language : {QString("ru"), QString("en"), QString("system")}) { |
|
QVERIFY(config_update_option(path, "gui", "language", language)); |
|
QVERIFY(config.load()); |
|
QVERIFY2(!config.hasErrors(), qPrintable(config.errors().join('\n'))); |
|
QCOMPARE(config.language(), language); |
|
QVERIFY(config.save()); |
|
NodeConfig reloaded(path); |
|
QVERIFY(reloaded.load()); |
|
QCOMPARE(reloaded.language(), language); |
|
QVERIFY(reloaded.saveFull()); |
|
QVERIFY(reloaded.load()); |
|
QCOMPARE(reloaded.language(), language); |
|
} |
|
QVERIFY(config_update_option(path, "gui", "language", "invalid")); |
|
QVERIFY(config.load()); |
|
QCOMPARE(config.language(), QString("system")); |
|
QVERIFY(config_update_option(path, "gui", "language", "ru")); |
|
QVERIFY(config.load()); |
|
QFile file(path); |
|
QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Truncate)); |
|
const QByteArray minimalConfig("[gui]\ndb_path=chat_data\n"); |
|
QCOMPARE(file.write(minimalConfig), qint64(minimalConfig.size())); |
|
file.close(); |
|
QVERIFY(config.load()); |
|
QCOMPARE(config.language(), QString("system")); |
|
} |
|
|
|
void embeddedCatalogs() { |
|
for (const QString& language : {QString("en"), QString("ru")}) { |
|
QTranslator translator; |
|
QVERIFY(translator.load(":/translations/chatgui_" + language + ".qm")); |
|
QVERIFY(qApp->installTranslator(&translator)); |
|
QCOMPARE(QCoreApplication::translate("ChatGui", "Settings"), language == "ru" ? QString("Настройки") : QString("Settings")); |
|
QFile file(QStringLiteral(GUI_TS_DIR) + "/chatgui_" + language + ".ts"); |
|
QVERIFY(file.open(QIODevice::ReadOnly)); |
|
QXmlStreamReader xml(&file); |
|
QString source; |
|
int count = 0; |
|
const QRegularExpression placeholders("%(?:L?[1-9][0-9]?|n)"); |
|
auto parameters = [&](const QString& text) { |
|
QStringList list; |
|
auto matches = placeholders.globalMatch(text); |
|
while (matches.hasNext()) list.append(matches.next().captured()); |
|
list.sort(); |
|
return list; |
|
}; |
|
while (!xml.atEnd()) { |
|
xml.readNext(); |
|
if (!xml.isStartElement()) continue; |
|
if (xml.name() == QLatin1String("source")) source = xml.readElementText(); |
|
if (xml.name() != QLatin1String("translation")) continue; |
|
QVERIFY(!xml.attributes().hasAttribute("type")); |
|
const QString translation = xml.readElementText(); |
|
QVERIFY2(!translation.isEmpty(), qPrintable(source)); |
|
QCOMPARE(parameters(translation), parameters(source)); |
|
QCOMPARE(QCoreApplication::translate("ChatGui", source.toUtf8().constData()), translation); |
|
if (language == "en") QCOMPARE(translation, source); |
|
count++; |
|
} |
|
QVERIFY2(!xml.hasError(), qPrintable(xml.errorString())); |
|
QVERIFY(count > 0); |
|
qApp->removeTranslator(&translator); |
|
} |
|
} |
|
|
|
void standardButtons() { |
|
QTranslator translator; |
|
QVERIFY(translator.load(":/translations/qtbase_ru.qm")); |
|
QVERIFY(qApp->installTranslator(&translator)); |
|
QDialogButtonBox buttons(QDialogButtonBox::Cancel | QDialogButtonBox::Save); |
|
QCOMPARE(buttons.button(QDialogButtonBox::Cancel)->text().remove('&'), QString("Отмена")); |
|
QCOMPARE(buttons.button(QDialogButtonBox::Save)->text().remove('&'), QString("Сохранить")); |
|
qApp->removeTranslator(&translator); |
|
} |
|
|
|
void translatedNetworkValues_data() { |
|
QTest::addColumn<QString>("language"); |
|
QTest::newRow("English") << QString("en"); |
|
QTest::newRow("Russian") << QString("ru"); |
|
} |
|
|
|
void translatedNetworkValues() { |
|
QFETCH(QString, language); |
|
QTranslator translator; |
|
QVERIFY(translator.load(":/translations/chatgui_" + language + ".qm")); |
|
QVERIFY(qApp->installTranslator(&translator)); |
|
QTemporaryDir directory; |
|
QVERIFY(directory.isValid()); |
|
const QString path = directory.filePath("vibechat.cfg"); |
|
QVERIFY(config_rewrite_servers(path, {{"test", "0.0.0.0:1333", "tcp", "private", ""}})); |
|
NetworkSettingsPage page; |
|
page.loadFromConfig(path); |
|
QComboBox* type = nullptr; |
|
for (auto* combo : page.findChildren<QComboBox*>()) { |
|
if (combo->findData(QString("public")) >= 0) type = combo; |
|
} |
|
QVERIFY(type); |
|
QCOMPARE(type->currentData().toString(), QString("private")); |
|
QCOMPARE(type->currentText(), language == "ru" ? QString("Частный") : QString("Private")); |
|
type->setCurrentIndex(type->findData(QString("local"))); |
|
page.saveToConfig(path); |
|
QFile file(path); |
|
QVERIFY(file.open(QIODevice::ReadOnly)); |
|
const QByteArray content = file.readAll(); |
|
QVERIFY(content.contains("type=local\n")); |
|
QVERIFY(content.contains("addr=0.0.0.0:1333\n")); |
|
QVERIFY(content.contains("transport=tcp\n")); |
|
QVERIFY(!content.contains("netif=")); |
|
qApp->removeTranslator(&translator); |
|
} |
|
}; |
|
|
|
QTEST_MAIN(GuiLanguageTest) |
|
#include "test_gui_language.moc"
|
|
|