File indexing completed on 2024-05-19 16:37:09

0001 /*
0002     SPDX-FileCopyrightText: 2016 Eike Hein <hein@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "dialogstatetest.h"
0008 #include <KWindowInfo>
0009 #include <KX11Extras>
0010 
0011 #include <QSignalSpy>
0012 
0013 void DialogStateTest::initTestCase()
0014 {
0015     m_dialog = new PlasmaQuick::Dialog;
0016     m_dialog->setLocation(Plasma::Types::TopEdge);
0017     m_dialog->setGeometry(0, 0, 50, 50);
0018 
0019     qRegisterMetaType<WId>("WId");
0020 }
0021 
0022 void DialogStateTest::cleanupTestCase()
0023 {
0024     delete m_dialog;
0025 }
0026 
0027 void DialogStateTest::windowState()
0028 {
0029     if (QGuiApplication::platformName() == "wayland") {
0030         QEXPECT_FAIL("windowState", "KX11Extras::windowAdded doesn't work on wayland", Continue);
0031         return;
0032     }
0033 
0034     for (int i = 0; i <= 100; ++i) {
0035         m_dialog->show();
0036 
0037         QSignalSpy windowAddedSpy(KX11Extras::self(), &KX11Extras::windowAdded);
0038         QVERIFY(windowAddedSpy.isValid());
0039         QVERIFY(windowAddedSpy.wait());
0040 
0041         bool windowAdded = false;
0042 
0043         while (windowAddedSpy.count()) {
0044             const QVariantList &arguments = windowAddedSpy.takeFirst();
0045 
0046             if (arguments.at(0).value<WId>() == m_dialog->winId()) {
0047                 windowAdded = true;
0048                 break;
0049             }
0050             if (windowAddedSpy.isEmpty()) {
0051                 QVERIFY(windowAddedSpy.wait());
0052             }
0053         }
0054 
0055         QVERIFY(windowAdded);
0056 
0057         QVERIFY(verifyState(m_dialog));
0058 
0059         m_dialog->hide();
0060 
0061         QSignalSpy windowRemovedSpy(KX11Extras::self(), &KX11Extras::windowRemoved);
0062         QVERIFY(windowRemovedSpy.isValid());
0063         QVERIFY(windowRemovedSpy.wait());
0064 
0065         bool windowRemoved = false;
0066 
0067         while (windowRemovedSpy.count()) {
0068             const QVariantList &arguments = windowRemovedSpy.takeFirst();
0069 
0070             if (arguments.at(0).value<WId>() == m_dialog->winId()) {
0071                 windowRemoved = true;
0072                 break;
0073             }
0074         }
0075 
0076         QVERIFY(windowRemoved);
0077     }
0078 }
0079 
0080 bool DialogStateTest::verifyState(PlasmaQuick::Dialog *dialog) const
0081 {
0082     KWindowInfo info(dialog->winId(), NET::WMState);
0083 
0084     if (!(info.state() & NET::SkipTaskbar)) {
0085         return false;
0086     }
0087 
0088     if (!info.hasState(NET::SkipPager)) {
0089         return false;
0090     }
0091 
0092     return true;
0093 }
0094 
0095 QTEST_MAIN(DialogStateTest)
0096 
0097 #include "moc_dialogstatetest.cpp"