v31.1-roots.1 · Commit 8: [PATCH 08/17] chore(roots): integrate v31 identity and maintenance tooling
src/qt/test/wallettests.cpp
Before: src/qt/test/wallettests.cpp · After: src/qt/test/wallettests.cpp
File metadata
index 41b00b2313b920956b7434f1174ac9dadb1d87c9..a09c3798a73e8e6e25fb369e2c4ca4d6fb9b9fc8 100644
Download original patch · Release notes
Diff rows 1–85 of 85. Line numbers refer to the original before/after files.
+ Added− RemovedUnmarked lines are context.
Scroll the code area horizontally to read long lines. The two line-number columns refer to before and after.
src/qt/test/wallettests.cpp
CHANGED
|
@@ -22,6 +22,11 @@
|
|
|
22
22
|
#include <qt/qvalidatedlineedit.h>
|
|
23
23
|
#include <qt/receivecoinsdialog.h>
|
|
24
24
|
#include <qt/receiverequestdialog.h>
|
|
25
|
+
#include <qt/qrimagewidget.h>
|
|
26
|
+
#include <QFileDialog>
|
|
27
|
+
#include <QFileInfo>
|
|
28
|
+
#include <QTemporaryDir>
|
|
29
|
+
#include <QTimer>
|
|
25
30
|
#include <qt/recentrequeststablemodel.h>
|
|
26
31
|
#include <qt/sendcoinsdialog.h>
|
|
27
32
|
#include <qt/sendcoinsentry.h>
|
|
@@ -126,6 +131,23 @@ bool CaptureWalletWidget(QWidget& widget, const QString& name)
|
|
|
126
131
|
return widget.size() == size && QDir().mkpath(directory) && widget.grab().save(directory + '/' + name + ".png");
|
|
127
132
|
}
|
|
128
133
|
|
|
134
|
+
//! Receive/save dialogs keep their production size; evidence records the
|
|
135
|
+
//! complete screen at the caller's resolution instead of forcing a layout.
|
|
136
|
+
bool CaptureReceiveWidget(QWidget& widget, const QString& name)
|
|
137
|
+
{
|
|
138
|
+
const QString directory{qEnvironmentVariable("ROOTS_WALLET_CAPTURE_DIR")};
|
|
139
|
+
if (directory.isEmpty()) return true;
|
|
140
|
+
const auto dimensions{qEnvironmentVariable("ROOTS_WALLET_CAPTURE_SIZE", "1280x800").split('x')};
|
|
141
|
+
if (dimensions.size() != 2) return false;
|
|
142
|
+
const QSize size{dimensions[0].toInt(), dimensions[1].toInt()};
|
|
143
|
+
widget.show();
|
|
144
|
+
qApp->processEvents();
|
|
145
|
+
widget.move(std::max(0, (size.width() - widget.width()) / 2), std::max(0, (size.height() - widget.height()) / 2));
|
|
146
|
+
QTest::qWait(50);
|
|
147
|
+
const auto screenshot{widget.screen()->grabWindow(0)};
|
|
148
|
+
return screenshot.size() == size && QDir().mkpath(directory) && screenshot.save(directory + '/' + name + ".png");
|
|
149
|
+
}
|
|
150
|
+
|
|
129
151
|
//! Press "Yes" or "Cancel" buttons in modal send confirmation dialog.
|
|
130
152
|
void ConfirmSend(QString* text = nullptr, QMessageBox::StandardButton confirm_type = QMessageBox::Yes)
|
|
131
153
|
{
|
|
@@ -699,6 +721,51 @@ void TestGUI(interfaces::Node& node, const std::shared_ptr<CWallet>& wallet)
|
|
|
699
721
|
QCOMPARE(uri.count("message=TEST_MESSAGE_1"), 2);
|
|
700
722
|
QCOMPARE(receiveRequestDialog->QObject::findChild<QLabel*>("message_tag")->text(), QString("Message:"));
|
|
701
723
|
QCOMPARE(receiveRequestDialog->QObject::findChild<QLabel*>("message_content")->text(), QString("TEST_MESSAGE_1"));
|
|
724
|
+
#ifdef USE_QRCODE
|
|
725
|
+
auto* qr = receiveRequestDialog->findChild<QRImageWidget*>("qr_code");
|
|
726
|
+
auto* save = receiveRequestDialog->findChild<QPushButton*>("btnSaveAs");
|
|
727
|
+
QVERIFY(qr && save && save->isEnabled());
|
|
728
|
+
const QImage exported{qr->exportImage()};
|
|
729
|
+
QVERIFY(!exported.isNull());
|
|
730
|
+
// Exercise the actual receive dialog and save action with an
|
|
731
|
+
// isolated filename, never a real wallet address or directory.
|
|
732
|
+
QVERIFY(CaptureReceiveWidget(receiveCoinsDialog, "receive"));
|
|
733
|
+
QVERIFY(CaptureReceiveWidget(*receiveRequestDialog, "receive-request"));
|
|
734
|
+
QTemporaryDir export_dir;
|
|
735
|
+
QVERIFY(export_dir.isValid());
|
|
736
|
+
const QString capture_dir{qEnvironmentVariable("ROOTS_WALLET_CAPTURE_DIR")};
|
|
737
|
+
const QString filename{capture_dir.isEmpty() ? export_dir.filePath("qr.png") : capture_dir + "/qr-export.png"};
|
|
738
|
+
const bool native_dialogs_disabled{qApp->testAttribute(Qt::AA_DontUseNativeDialogs)};
|
|
739
|
+
qApp->setAttribute(Qt::AA_DontUseNativeDialogs);
|
|
740
|
+
bool saved{false};
|
|
741
|
+
QTimer::singleShot(0, [&] {
|
|
742
|
+
for (auto* top : QApplication::topLevelWidgets()) {
|
|
743
|
+
if (auto* dialog = qobject_cast<QFileDialog*>(top)) {
|
|
744
|
+
// QFileDialog's filesystem model loads asynchronously.
|
|
745
|
+
// Pin the writable test directory before selecting the
|
|
746
|
+
// name; minimal has no screenshot event-pumping delay.
|
|
747
|
+
dialog->setDirectory(QFileInfo{filename}.absolutePath());
|
|
748
|
+
dialog->selectFile(QFileInfo{filename}.fileName());
|
|
749
|
+
auto* filename_edit = dialog->findChild<QLineEdit*>("fileNameEdit");
|
|
750
|
+
if (filename_edit) filename_edit->setText(QFileInfo{filename}.fileName());
|
|
751
|
+
const bool selected{QTest::qWaitFor([&] { return dialog->selectedFiles() == QStringList{filename}; }, 1000)};
|
|
752
|
+
saved = selected && CaptureReceiveWidget(*dialog, "qr-save-dialog");
|
|
753
|
+
QMetaObject::invokeMethod(dialog, saved ? "accept" : "reject");
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
});
|
|
757
|
+
save->click();
|
|
758
|
+
qApp->setAttribute(Qt::AA_DontUseNativeDialogs, native_dialogs_disabled);
|
|
759
|
+
QVERIFY(saved);
|
|
760
|
+
QCOMPARE(QImage{filename}, exported);
|
|
761
|
+
// Font changes refresh the production QR image in-place.
|
|
762
|
+
QFont larger_font{walletModel.getOptionsModel()->getFontForMoney()};
|
|
763
|
+
larger_font.setPointSizeF(larger_font.pointSizeF() * 1.5);
|
|
764
|
+
const auto original_choice{walletModel.getOptionsModel()->data(walletModel.getOptionsModel()->index(OptionsModel::FontForMoney))};
|
|
765
|
+
QVERIFY(walletModel.getOptionsModel()->setData(walletModel.getOptionsModel()->index(OptionsModel::FontForMoney), QVariant::fromValue(OptionsModel::FontChoice{larger_font})));
|
|
766
|
+
QVERIFY(qr->exportImage().height() > exported.height());
|
|
767
|
+
QVERIFY(walletModel.getOptionsModel()->setData(walletModel.getOptionsModel()->index(OptionsModel::FontForMoney), original_choice));
|
|
768
|
+
#endif
|
|
702
769
|
}
|
|
703
770
|
}
|
|
704
771
|
|