File indexing completed on 2024-03-24 15:40:22

0001 /*  This file is part of the KDE libraries
0002 
0003     SPDX-FileCopyrightText: 2012 David Faure <faure@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-or-later
0006 */
0007 
0008 #include <QSignalSpy>
0009 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
0010 #include <private/qtx11extras_p.h>
0011 #else
0012 #include <QX11Info>
0013 #endif
0014 
0015 #include <kxmessages.h>
0016 #include <qtest_widgets.h>
0017 
0018 class KXMessages_UnitTest : public QObject
0019 {
0020     Q_OBJECT
0021 public:
0022     enum BroadcastType {
0023         BroadcastMessageObject,
0024 #if KWINDOWSYSTEM_ENABLE_DEPRECATED_SINCE(5, 0)
0025         BroadcastStaticDisplay,
0026 #endif
0027         BroadcastStaticConnection,
0028     };
0029     enum ReceiverType {
0030         ReceiverTypeDefault,
0031         ReceiverTypeConnection,
0032     };
0033     KXMessages_UnitTest()
0034         : m_msgs()
0035     {
0036     }
0037 
0038 private Q_SLOTS:
0039     void testStart_data();
0040     void testStart();
0041 
0042 private:
0043     KXMessages m_msgs;
0044 };
0045 
0046 Q_DECLARE_METATYPE(KXMessages_UnitTest::BroadcastType)
0047 Q_DECLARE_METATYPE(KXMessages_UnitTest::ReceiverType)
0048 
0049 void KXMessages_UnitTest::testStart_data()
0050 {
0051     QTest::addColumn<KXMessages_UnitTest::BroadcastType>("broadcastType");
0052     QTest::addColumn<KXMessages_UnitTest::ReceiverType>("receiverType");
0053 
0054     QTest::newRow("object") << BroadcastMessageObject << ReceiverTypeDefault;
0055 #if KWINDOWSYSTEM_ENABLE_DEPRECATED_SINCE(5, 0)
0056     QTest::newRow("display") << BroadcastStaticDisplay << ReceiverTypeDefault;
0057 #endif
0058     QTest::newRow("connection") << BroadcastStaticConnection << ReceiverTypeDefault;
0059     QTest::newRow("object/xcb") << BroadcastMessageObject << ReceiverTypeConnection;
0060 #if KWINDOWSYSTEM_ENABLE_DEPRECATED_SINCE(5, 0)
0061     QTest::newRow("display/xcb") << BroadcastStaticDisplay << ReceiverTypeConnection;
0062 #endif
0063     QTest::newRow("connection/xcb") << BroadcastStaticConnection << ReceiverTypeConnection;
0064 }
0065 
0066 void KXMessages_UnitTest::testStart()
0067 {
0068     QFETCH(KXMessages_UnitTest::BroadcastType, broadcastType);
0069     QFETCH(KXMessages_UnitTest::ReceiverType, receiverType);
0070     const QByteArray type = "kxmessage_unittest";
0071     std::unique_ptr<KXMessages> receiver;
0072     switch (receiverType) {
0073     case KXMessages_UnitTest::ReceiverTypeDefault:
0074         receiver.reset(new KXMessages(type));
0075         break;
0076     case KXMessages_UnitTest::ReceiverTypeConnection:
0077         receiver.reset(new KXMessages(QX11Info::connection(), QX11Info::appRootWindow(), type));
0078         break;
0079     default:
0080         Q_UNREACHABLE();
0081         break;
0082     }
0083 
0084     // Check that all message sizes work, i.e. no bug when exactly 20 or 40 bytes,
0085     // despite the internal splitting.
0086     QString message;
0087     for (int i = 1; i < 50; ++i) {
0088         QSignalSpy spy(receiver.get(), &KXMessages::gotMessage);
0089         message += "a";
0090         switch (broadcastType) {
0091         case KXMessages_UnitTest::BroadcastMessageObject:
0092             m_msgs.broadcastMessage(type, message);
0093             break;
0094 #if KWINDOWSYSTEM_ENABLE_DEPRECATED_SINCE(5, 0)
0095         case KXMessages_UnitTest::BroadcastStaticDisplay:
0096             QVERIFY(KXMessages::broadcastMessageX(QX11Info::display(), type.constData(), message));
0097             break;
0098 #endif
0099         case KXMessages_UnitTest::BroadcastStaticConnection:
0100             QVERIFY(KXMessages::broadcastMessageX(QX11Info::connection(), type.constData(), message, QX11Info::appScreen()));
0101             break;
0102         }
0103 
0104         QVERIFY(spy.wait());
0105         QCOMPARE(spy.count(), 1);
0106         QCOMPARE(spy.at(0).at(0).toString(), message);
0107     }
0108 }
0109 
0110 QTEST_MAIN(KXMessages_UnitTest)
0111 
0112 #include "kxmessages_unittest.moc"