1 /*
2     This file is part of the KDE frameworks
3     SPDX-FileCopyrightText: 2016 Ragnar Thomsen <rthomsen6@gmail.com>
4 
5     SPDX-License-Identifier: LGPL-2.1-or-later
6 */
7 
8 #include "kcollapsiblegroupbox_test.h"
9 
10 #include <KCollapsibleGroupBox>
11 
12 #include <QCheckBox>
13 #include <QDialog>
14 #include <QLabel>
15 #include <QLineEdit>
16 #include <QTest>
17 #include <QVBoxLayout>
18 
QTEST_MAIN(KCollapsibleGroupBoxTest)19 QTEST_MAIN(KCollapsibleGroupBoxTest)
20 
21 void KCollapsibleGroupBoxTest::testDestructorCrash()
22 {
23     // The unittest does not crash the first time,
24     // so we run it twice.
25     int i = 0;
26     while (i != 2) {
27         QDialog *dlg = new QDialog(nullptr);
28 
29         QVBoxLayout *mainvlayout = new QVBoxLayout(dlg);
30         KCollapsibleGroupBox *collapsible = new KCollapsibleGroupBox(dlg);
31         collapsible->setTitle(QStringLiteral("A test KCollapsibleGroupBox"));
32 
33         QVBoxLayout *collapsiblevlayout = new QVBoxLayout(collapsible);
34 
35         QLabel *lbl = new QLabel(QStringLiteral("A test label."), collapsible);
36         collapsiblevlayout->addWidget(lbl);
37 
38         collapsible->expand();
39 
40         mainvlayout->addWidget(collapsible);
41 
42         connect(dlg, &QDialog::finished, dlg, &QObject::deleteLater);
43 
44         dlg->open();
45 
46         QVERIFY(collapsible);
47 
48         // If waiting for less than ~500ms the test crashes every time.
49         // Not waiting or waiting for more than ~500ms is ok.
50         // Using qSleep(400) does NOT provoke the crash.
51         QTest::qWait(400);
52 
53         dlg->accept();
54 
55         i++;
56     }
57 }
58 
testOverrideFocus()59 void KCollapsibleGroupBoxTest::testOverrideFocus()
60 {
61     KCollapsibleGroupBox collapsible;
62     QVBoxLayout layout(&collapsible);
63 
64     QCheckBox checkBox;
65     QCOMPARE(checkBox.focusPolicy(), Qt::StrongFocus);
66 
67     layout.addWidget(&checkBox);
68     // The ChildAdded event is processed asynchronously.
69     qApp->processEvents();
70     // Make sure focus policy has been overridden.
71     collapsible.show();
72     QVERIFY(checkBox.isVisible());
73     QCOMPARE(checkBox.focusPolicy(), Qt::NoFocus);
74 
75     // Make sure focus policy is restored on expand event.
76     collapsible.expand();
77     QVERIFY(checkBox.isVisible());
78     QCOMPARE(checkBox.focusPolicy(), Qt::StrongFocus);
79 
80     // Make sure focus policy is overridden again on next collapse.
81     collapsible.collapse();
82     QVERIFY(checkBox.isVisible());
83     QCOMPARE(checkBox.focusPolicy(), Qt::NoFocus);
84 }
85 
childShouldGetFocus()86 void KCollapsibleGroupBoxTest::childShouldGetFocus()
87 {
88     KCollapsibleGroupBox collapsible;
89     auto spinBox = new QLineEdit(&collapsible);
90     // The ChildAdded event is processed asynchronously.
91     // This also "simulates" user who manually expands.
92     qApp->processEvents();
93     collapsible.expand();
94     QCOMPARE(spinBox->focusPolicy(), Qt::StrongFocus);
95 }
96