v31.1-roots.1 · Commit 9: [PATCH 09/17] fix(roots): restore audited portability and runtime behavior
src/qt/test/optiontests.cpp
Before: src/qt/test/optiontests.cpp · After: src/qt/test/optiontests.cpp
File metadata
index 3edf37ded46371c8eb2ae536f433b72ceeb14c77..fe22819c32a006bc7e204ae2cc556019b366cfc3 100644
Download original patch · Release notes
Diff rows 1–86 of 86. Line numbers refer to the original before/after files.
+ Added− RemovedUnmarked lines are context.
Scroll the code area horizontally to read long lines. Before is on the left; after is on the right. Unified view fits narrow screens more easily.
src/qt/test/optiontests.cpp
CHANGED
|
@@ -7,12 +7,20 @@
|
|
| 7 |
#include <common/args.h>
|
| 8 |
#include <init.h>
|
| 9 |
#include <qt/bitcoin.h>
|
|
|
|
| 10 |
#include <qt/guiutil.h>
|
|
|
|
| 11 |
#include <qt/test/optiontests.h>
|
| 12 |
#include <test/util/setup_common.h>
|
| 13 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
#include <QSettings>
|
|
|
|
| 15 |
#include <QTest>
|
|
|
|
| 16 |
|
| 17 |
#include <univalue.h>
|
| 18 |
|
|
@@ -146,3 +154,66 @@ void OptionTests::extractFilter()
|
|
| 146 |
filter = QString("Image (*.png *.jpg)");
|
| 147 |
QCOMPARE(GUIUtil::ExtractFirstSuffixFromFilter(filter), "png");
|
| 148 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
#include <common/args.h>
|
| 8 |
#include <init.h>
|
| 9 |
#include <qt/bitcoin.h>
|
| 10 |
+
#include <qt/bitcoinunits.h>
|
| 11 |
#include <qt/guiutil.h>
|
| 12 |
+
#include <qt/optionsmodel.h>
|
| 13 |
#include <qt/test/optiontests.h>
|
| 14 |
#include <test/util/setup_common.h>
|
| 15 |
|
| 16 |
+
#include <QByteArray>
|
| 17 |
+
#include <QCoreApplication>
|
| 18 |
+
#include <QDebug>
|
| 19 |
+
#include <QProcess>
|
| 20 |
#include <QSettings>
|
| 21 |
+
#include <QTemporaryDir>
|
| 22 |
#include <QTest>
|
| 23 |
+
#include <QVariant>
|
| 24 |
|
| 25 |
#include <univalue.h>
|
| 26 |
|
|
|
|
| 154 |
filter = QString("Image (*.png *.jpg)");
|
| 155 |
QCOMPARE(GUIUtil::ExtractFirstSuffixFromFilter(filter), "png");
|
| 156 |
}
|
| 157 |
+
|
| 158 |
+
int RunDisplayUnitSettingsTest(interfaces::Node& node, const QString& settings_dir, const QString& action, BitcoinUnit unit)
|
| 159 |
+
{
|
| 160 |
+
// Each invocation starts with a fresh Qt metatype registry and settings
|
| 161 |
+
// cache. Redirect both scopes before the production model accesses settings.
|
| 162 |
+
QSettings::setDefaultFormat(QSettings::IniFormat);
|
| 163 |
+
QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, settings_dir);
|
| 164 |
+
QSettings::setPath(QSettings::IniFormat, QSettings::SystemScope, settings_dir + "/system");
|
| 165 |
+
QCoreApplication::setApplicationName("display-unit-persistence-test");
|
| 166 |
+
|
| 167 |
+
if (action == "read") {
|
| 168 |
+
// Production initializes translations before constructing OptionsModel.
|
| 169 |
+
// Reading language parses and caches the same settings section that
|
| 170 |
+
// contains DisplayBitcoinUnit, so registration must already be ready.
|
| 171 |
+
QSettings early_settings;
|
| 172 |
+
if (early_settings.value("language").toString() != "en") return 1;
|
| 173 |
+
}
|
| 174 |
+
|
| 175 |
+
OptionsModel options{node};
|
| 176 |
+
QSettings settings;
|
| 177 |
+
const QVariant saved_unit{settings.value("DisplayBitcoinUnit")};
|
| 178 |
+
bilingual_str error;
|
| 179 |
+
if (!options.Init(error)) {
|
| 180 |
+
qWarning() << QString::fromStdString(error.original);
|
| 181 |
+
return 1;
|
| 182 |
+
}
|
| 183 |
+
if (action == "write") {
|
| 184 |
+
options.setDisplayUnit(QVariant::fromValue(unit));
|
| 185 |
+
settings.setValue("language", "en");
|
| 186 |
+
settings.sync();
|
| 187 |
+
return settings.status() == QSettings::NoError ? 0 : 1;
|
| 188 |
+
}
|
| 189 |
+
if (action == "read") {
|
| 190 |
+
// Check the stored type too: falling back to BTC must not pass the BTC
|
| 191 |
+
// case when an unregistered enum could not be restored from disk.
|
| 192 |
+
const bool restored{settings.status() == QSettings::NoError && saved_unit.canConvert<BitcoinUnit>() &&
|
| 193 |
+
saved_unit.value<BitcoinUnit>() == unit && options.getDisplayUnit() == unit};
|
| 194 |
+
return restored ? 0 : 1;
|
| 195 |
+
}
|
| 196 |
+
return 2;
|
| 197 |
+
}
|
| 198 |
+
|
| 199 |
+
void OptionTests::displayUnitPersistence()
|
| 200 |
+
{
|
| 201 |
+
QTemporaryDir settings_dir;
|
| 202 |
+
QVERIFY(settings_dir.isValid());
|
| 203 |
+
for (const BitcoinUnit unit : BitcoinUnits::availableUnits()) {
|
| 204 |
+
for (const QString& action : {QString{"write"}, QString{"read"}}) {
|
| 205 |
+
QProcess process;
|
| 206 |
+
process.start(QCoreApplication::applicationFilePath(),
|
| 207 |
+
{"--test-display-unit-settings", settings_dir.path(), action, QString::number(static_cast<int>(unit))});
|
| 208 |
+
QVERIFY(process.waitForStarted());
|
| 209 |
+
if (!process.waitForFinished(10000)) {
|
| 210 |
+
process.kill();
|
| 211 |
+
process.waitForFinished();
|
| 212 |
+
QFAIL("Display-unit settings child timed out");
|
| 213 |
+
}
|
| 214 |
+
QCOMPARE(process.exitStatus(), QProcess::NormalExit);
|
| 215 |
+
const QByteArray diagnostic{process.readAllStandardOutput() + process.readAllStandardError()};
|
| 216 |
+
QVERIFY2(process.exitCode() == 0, diagnostic.constData());
|
| 217 |
+
}
|
| 218 |
+
}
|
| 219 |
+
}
|