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"