1 /*
2     SPDX-FileCopyrightText: 2020 David Hurka <david.hurka@mailbox.org>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #include <QtTest>
8 
9 #include "../part/toggleactionmenu.h"
10 #include <QToolBar>
11 
12 class ToggleActionMenuTest : public QObject
13 {
14     Q_OBJECT
15 
16 private Q_SLOTS:
17     void testSetDefaultAction();
18     void testDeleteToolBarButton();
19 };
20 
testSetDefaultAction()21 void ToggleActionMenuTest::testSetDefaultAction()
22 {
23     QToolBar dummyToolBar;
24     ToggleActionMenu menu(QStringLiteral("Menu"), this);
25     QAction *actionA = new QAction(QStringLiteral("A"), this);
26     QAction *actionB = new QAction(QStringLiteral("B"), this);
27 
28     // Do not set a default action, the menu should behave as plain KActionMenu.
29     QCOMPARE(menu.defaultAction(), &menu);
30     QToolButton *menuButton = qobject_cast<QToolButton *>(menu.createWidget(&dummyToolBar));
31     QVERIFY(menuButton);
32     QCOMPARE(menuButton->defaultAction(), &menu);
33 
34     // Should still behave as plain KActionMenu when actions are added.
35     menu.addAction(actionA);
36     QCOMPARE(menu.defaultAction(), &menu);
37     QCOMPARE(menuButton->defaultAction(), &menu);
38 
39     // Set an action from the menu as default action, should work.
40     menu.setDefaultAction(actionA);
41     QCOMPARE(menu.defaultAction(), actionA);
42     QCOMPARE(menuButton->defaultAction(), actionA);
43 
44     // Set a foreign action as default action, should reset the default action.
45     menu.setDefaultAction(actionB);
46     QCOMPARE(menu.defaultAction(), &menu);
47     QCOMPARE(menuButton->defaultAction(), &menu);
48 
49     // Set an action of the menu as default action, should work.
50     menu.setDefaultAction(actionA);
51     QCOMPARE(menu.defaultAction(), actionA);
52     QCOMPARE(menuButton->defaultAction(), actionA);
53 
54     // Remove default action from menu, should reset the default action.
55     menu.removeAction(actionA);
56     QCOMPARE(menu.defaultAction(), &menu);
57     QCOMPARE(menuButton->defaultAction(), &menu);
58 }
59 
testDeleteToolBarButton()60 void ToggleActionMenuTest::testDeleteToolBarButton()
61 {
62     QToolBar dummyToolBar;
63     ToggleActionMenu menu(QStringLiteral("Menu"), this);
64     QAction *actionA = new QAction(QStringLiteral("A"), this);
65     QAction *actionB = new QAction(QStringLiteral("B"), this);
66 
67     // Setup: set a default action and create two toolbar buttons.
68     menu.addAction(actionA);
69     menu.addAction(actionB);
70     menu.setDefaultAction(actionA);
71     QToolButton *menuButtonA = qobject_cast<QToolButton *>(menu.createWidget(&dummyToolBar));
72     QVERIFY(menuButtonA);
73     QCOMPARE(menuButtonA->defaultAction(), actionA);
74     QToolButton *menuButtonB = qobject_cast<QToolButton *>(menu.createWidget(&dummyToolBar));
75     QVERIFY(menuButtonB);
76 
77     // Delete button B, and set a new default action. Button A shall be updated without segfaulting on the deleted button B.
78     delete menuButtonB;
79     menu.setDefaultAction(actionB);
80     QCOMPARE(menuButtonA->defaultAction(), actionB);
81 }
82 
83 QTEST_MAIN(ToggleActionMenuTest)
84 
85 #include "toggleactionmenutest.moc"
86