176 lines
7.9 KiB
C++
176 lines
7.9 KiB
C++
#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 <QCheckBox>
|
|
#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 localNetworkPermissions() {
|
|
QTemporaryDir directory;
|
|
QVERIFY(directory.isValid());
|
|
const QString path = directory.filePath("local.cfg");
|
|
QVERIFY(config_rewrite_servers(path, {}));
|
|
NetworkSettingsPage page; page.loadFromConfig(path);
|
|
auto* receive = page.findChild<QCheckBox*>("localInvitesEnabled");
|
|
auto* broadcasts = page.findChild<QCheckBox*>("localBroadcastsEnabled");
|
|
QVERIFY(receive && broadcasts);
|
|
QVERIFY(page.localInvitesEnabled() && page.localBroadcastsEnabled());
|
|
receive->setChecked(false); broadcasts->setChecked(false);
|
|
QVERIFY(page.saveToConfig(path));
|
|
NetworkSettingsPage restored; restored.loadFromConfig(path);
|
|
QVERIFY(!restored.localInvitesEnabled() && !restored.localBroadcastsEnabled());
|
|
receive->setChecked(true); QVERIFY(page.saveToConfig(path));
|
|
restored.loadFromConfig(path);
|
|
QVERIFY(restored.localInvitesEnabled() && !restored.localBroadcastsEnabled());
|
|
QVERIFY(config_update_option(path, "chatserver", "local_broadcasts_enabled", "yes"));
|
|
restored.loadFromConfig(path); QVERIFY(restored.localBroadcastsEnabled());
|
|
}
|
|
|
|
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"
|