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