Reproduce member selection jumping back while its context menu is open
This commit is contained in:
1 parent
f29554f92b
commit
913e4dfbd4
1 file changed
+37
@@ -136,6 +136,43 @@ class MemberDetailTest : public QObject {
|
||||
return invoked && clicked;
|
||||
}
|
||||
private slots:
|
||||
void contextKeepsClickedMemberSelected_data() {
|
||||
QTest::addColumn<bool>("previousGroup");
|
||||
QTest::newRow("previous-member") << false;
|
||||
QTest::newRow("previous-subgroup") << true;
|
||||
}
|
||||
void contextKeepsClickedMemberSelected() {
|
||||
QFETCH(bool, previousGroup);
|
||||
AccountList panel; panel.resize(420, 600); panel.show();
|
||||
auto first = row(7), target = row(8), extra = row(9);
|
||||
if (previousGroup) {
|
||||
memset(first.data() + 164, 42, 32); memcpy(first.data() + 196, "Devices", 8);
|
||||
}
|
||||
const auto snapshot = first + target + extra; fill(panel, "123", snapshot);
|
||||
auto* view = panel.findChild<QListView*>(); QVERIFY(view);
|
||||
QTest::mouseClick(view->viewport(), Qt::LeftButton, Qt::NoModifier,
|
||||
view->visualRect(view->model()->index(0, 0)).topLeft() + QPoint(100, 16));
|
||||
const QPoint point = view->visualRect(view->model()->index(1, 0)).topLeft() + QPoint(100, 16);
|
||||
// Правый press меняет Qt selection, но не обязан посылать clicked для обновления карточки.
|
||||
QTest::mousePress(view->viewport(), Qt::RightButton, Qt::NoModifier, point);
|
||||
bool inspected = false;
|
||||
QTimer::singleShot(0, &panel, [&] {
|
||||
auto* menu = qobject_cast<QMenu*>(QApplication::activePopupWidget());
|
||||
if (!menu) { QTest::qFail("member context menu missing", __FILE__, __LINE__); return; }
|
||||
const auto close = qScopeGuard([menu] { menu->close(); });
|
||||
// Полный снимок во вложенном event loop меню должен восстановить именно выбранный правой кнопкой узел.
|
||||
panel.onMemberList("123", 3, reinterpret_cast<const uint8_t*>(snapshot.constData()), snapshot.size());
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_CONNECTION, "context selection after snapshot: previous_group=%d node=%llu header=%s",
|
||||
previousGroup, view->currentIndex().data(MemberListModel::NodeIdRole).toULongLong(), qPrintable(header(panel)));
|
||||
QCOMPARE(view->currentIndex().data(MemberListModel::NodeIdRole).toULongLong(), quint64(8));
|
||||
QVERIFY(header(panel).contains("peer8")); inspected = true;
|
||||
});
|
||||
QVERIFY(QMetaObject::invokeMethod(view, "customContextMenuRequested", Qt::DirectConnection, Q_ARG(QPoint, point)));
|
||||
QTest::mouseRelease(view->viewport(), Qt::RightButton, Qt::NoModifier, point);
|
||||
QVERIFY(inspected);
|
||||
QCOMPARE(view->currentIndex().data(MemberListModel::NodeIdRole).toULongLong(), quint64(8));
|
||||
}
|
||||
|
||||
void init() {
|
||||
requests.clear(); memberRequests.clear(); connectRequests.clear(); muteRequests.clear(); ownedPosts = 0; rejectOwned = false; ready = true;
|
||||
devgroupRequests.clear();
|
||||
|
||||
Reference in new issue
Block a user