File indexing completed on 2024-04-14 15:39:47

0001 /*  This file is part of the KDE libraries
0002     SPDX-FileCopyrightText: 2019 Konrad Materka <materka@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include <QMenu>
0008 #include <QSignalSpy>
0009 #include <QTest>
0010 
0011 #include "../src/platformtheme/kdeplatformsystemtrayicon.h"
0012 
0013 class KDEPlatformSystemTrayIcon_UnitTest : public QObject
0014 {
0015     Q_OBJECT
0016 private Q_SLOTS:
0017     // test for BUG 365105
0018     void testMenuRecreate();
0019     void testAddActionAfterMenuRecreate();
0020 };
0021 
0022 void KDEPlatformSystemTrayIcon_UnitTest::testMenuRecreate()
0023 {
0024     QMenu *trayIconMenu = new QMenu();
0025     trayIconMenu->addAction(QStringLiteral("testAction"));
0026 
0027     KDEPlatformSystemTrayIcon *kpsti = new KDEPlatformSystemTrayIcon();
0028 
0029     // simulates first QSystemTrayIcon::show()
0030     kpsti->init();
0031     SystemTrayMenu *ourMenu = qobject_cast<SystemTrayMenu *>(kpsti->createMenu());
0032     trayIconMenu->setPlatformMenu(ourMenu);
0033     kpsti->updateMenu(trayIconMenu->platformMenu());
0034 
0035     QMenu *firstMenu = ourMenu->menu();
0036     QSignalSpy menuDestroyedSpy(firstMenu, &QObject::destroyed);
0037     QCOMPARE(firstMenu->actions().size(), 1);
0038     QCOMPARE(firstMenu->actions().first()->text(), "testAction");
0039 
0040     // simulates QSystemTrayIcon::hide()
0041     kpsti->cleanup();
0042 
0043     // simulates second QSystemTrayIcon::show()
0044     kpsti->init();
0045     kpsti->updateMenu(trayIconMenu->platformMenu());
0046 
0047     QMenu *recreatedMenu = ourMenu->menu();
0048     QVERIFY(firstMenu != recreatedMenu);
0049     QCOMPARE(recreatedMenu->actions().size(), 1);
0050     QCOMPARE(recreatedMenu->actions().first()->text(), "testAction");
0051     QCOMPARE(menuDestroyedSpy.count(), 1);
0052 }
0053 
0054 void KDEPlatformSystemTrayIcon_UnitTest::testAddActionAfterMenuRecreate()
0055 {
0056     QMenu *trayIconMenu = new QMenu();
0057     trayIconMenu->addAction(QStringLiteral("testAction1"));
0058 
0059     KDEPlatformSystemTrayIcon *kpsti = new KDEPlatformSystemTrayIcon();
0060 
0061     // simulates first QSystemTrayIcon::show()
0062     kpsti->init();
0063     SystemTrayMenu *ourMenu = qobject_cast<SystemTrayMenu *>(kpsti->createMenu());
0064     trayIconMenu->setPlatformMenu(ourMenu);
0065     kpsti->updateMenu(trayIconMenu->platformMenu());
0066 
0067     QMenu *firstMenu = ourMenu->menu();
0068     QSignalSpy menuDestroyedSpy(firstMenu, &QObject::destroyed);
0069     QCOMPARE(firstMenu->actions().size(), 1);
0070     QCOMPARE(firstMenu->actions().first()->text(), "testAction1");
0071 
0072     // simulates QSystemTrayIcon::hide()
0073     kpsti->cleanup();
0074 
0075     // add action, internal menu is destroyed
0076     trayIconMenu->addAction(QStringLiteral("testAction2"));
0077 
0078     // simulates second QSystemTrayIcon::show()
0079     kpsti->init();
0080     kpsti->updateMenu(trayIconMenu->platformMenu());
0081 
0082     QMenu *recreatedMenu = ourMenu->menu();
0083     QVERIFY(firstMenu != recreatedMenu);
0084     QCOMPARE(recreatedMenu->actions().size(), 2);
0085     QCOMPARE(recreatedMenu->actions().first()->text(), "testAction1");
0086     QCOMPARE(recreatedMenu->actions().last()->text(), "testAction2");
0087     QCOMPARE(menuDestroyedSpy.count(), 1);
0088 }
0089 
0090 QTEST_MAIN(KDEPlatformSystemTrayIcon_UnitTest)
0091 
0092 #include "kdeplatformsystemtrayicon_unittest.moc"