1 /*
2 SPDX-FileCopyrightText: 2014 Montel Laurent <montel@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5 */
6
7 #include "ksplittercollapserbuttontest.h"
8 #include "ksplittercollapserbutton.h"
9 #include <QHBoxLayout>
10 #include <QSplitter>
11 #include <QTextEdit>
12 #include <qtest.h>
13 #include <qtestmouse.h>
14
Q_DECLARE_METATYPE(Qt::Orientation)15 Q_DECLARE_METATYPE(Qt::Orientation)
16
17 TestSplitter::TestSplitter(QWidget *parent)
18 : QWidget(parent)
19 {
20 QHBoxLayout *lay = new QHBoxLayout(this);
21
22 splitter = new QSplitter;
23 lay->addWidget(splitter);
24 splitter->setObjectName(QStringLiteral("splitter"));
25 edit1 = new QTextEdit;
26 edit1->setObjectName(QStringLiteral("edit1"));
27 splitter->addWidget(edit1);
28
29 edit2 = new QTextEdit;
30 edit2->setObjectName(QStringLiteral("edit2"));
31 splitter->addWidget(edit2);
32 }
33
KSplitterCollapserButtonTest(QObject * parent)34 KSplitterCollapserButtonTest::KSplitterCollapserButtonTest(QObject *parent)
35 : QObject(parent)
36 {
37 }
38
~KSplitterCollapserButtonTest()39 KSplitterCollapserButtonTest::~KSplitterCollapserButtonTest()
40 {
41 }
42
shouldHaveDefaultValue()43 void KSplitterCollapserButtonTest::shouldHaveDefaultValue()
44 {
45 TestSplitter testSplitter;
46
47 KSplitterCollapserButton *collapser = new KSplitterCollapserButton(testSplitter.edit2, testSplitter.splitter);
48
49 testSplitter.show();
50 QVERIFY(QTest::qWaitForWindowExposed(&testSplitter));
51 QVERIFY(testSplitter.isVisible());
52
53 QVERIFY(!collapser->isWidgetCollapsed());
54
55 QTextEdit *edit1 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit1"));
56 QVERIFY(edit1);
57 QTextEdit *edit2 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit2"));
58 QVERIFY(edit2);
59
60 QSplitter *splitter = testSplitter.findChild<QSplitter *>(QStringLiteral("splitter"));
61 QVERIFY(splitter);
62 }
63
shouldCollapseWhenClickOnButton()64 void KSplitterCollapserButtonTest::shouldCollapseWhenClickOnButton()
65 {
66 TestSplitter testSplitter;
67 KSplitterCollapserButton *splitterCollapser = new KSplitterCollapserButton(testSplitter.edit2, testSplitter.splitter);
68
69 testSplitter.show();
70 QVERIFY(QTest::qWaitForWindowExposed(&testSplitter));
71
72 QVERIFY(!splitterCollapser->isWidgetCollapsed());
73 QTest::mouseClick(splitterCollapser, Qt::LeftButton);
74 QVERIFY(splitterCollapser->isWidgetCollapsed());
75
76 QTest::mouseClick(splitterCollapser, Qt::LeftButton);
77 QVERIFY(!splitterCollapser->isWidgetCollapsed());
78 }
79
shouldRestoreCorrectPosition()80 void KSplitterCollapserButtonTest::shouldRestoreCorrectPosition()
81 {
82 TestSplitter testSplitter;
83
84 KSplitterCollapserButton *splitterCollapser = new KSplitterCollapserButton(testSplitter.edit2, testSplitter.splitter);
85
86 testSplitter.show();
87 QVERIFY(QTest::qWaitForWindowExposed(&testSplitter));
88 QVERIFY(testSplitter.isVisible());
89
90 QVERIFY(!splitterCollapser->isWidgetCollapsed());
91
92 QTextEdit *edit2 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit2"));
93
94 int size = edit2->width();
95
96 QTest::mouseClick(splitterCollapser, Qt::LeftButton);
97 QVERIFY(splitterCollapser->isWidgetCollapsed());
98 QCOMPARE(edit2->width(), 0);
99
100 QTest::mouseClick(splitterCollapser, Qt::LeftButton);
101 QVERIFY(!splitterCollapser->isWidgetCollapsed());
102 QCOMPARE(edit2->width(), size);
103 }
104
shouldRestoreCorrectPositionForFirstWidget()105 void KSplitterCollapserButtonTest::shouldRestoreCorrectPositionForFirstWidget()
106 {
107 TestSplitter testSplitter;
108
109 KSplitterCollapserButton *splitterCollapser = new KSplitterCollapserButton(testSplitter.edit1, testSplitter.splitter);
110
111 testSplitter.show();
112 QVERIFY(QTest::qWaitForWindowExposed(&testSplitter));
113 QVERIFY(testSplitter.isVisible());
114
115 QVERIFY(!splitterCollapser->isWidgetCollapsed());
116
117 QTextEdit *edit1 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit1"));
118
119 int size = edit1->width();
120
121 QTest::mouseClick(splitterCollapser, Qt::LeftButton);
122 QVERIFY(splitterCollapser->isWidgetCollapsed());
123 QCOMPARE(edit1->width(), 0);
124
125 QTest::mouseClick(splitterCollapser, Qt::LeftButton);
126 QVERIFY(!splitterCollapser->isWidgetCollapsed());
127 QCOMPARE(edit1->width(), size);
128 }
129
shouldTestVerticalSplitterFirstWidget()130 void KSplitterCollapserButtonTest::shouldTestVerticalSplitterFirstWidget()
131 {
132 TestSplitter testSplitter;
133 testSplitter.splitter->setOrientation(Qt::Vertical);
134 KSplitterCollapserButton *splitterCollapser = new KSplitterCollapserButton(testSplitter.edit1, testSplitter.splitter);
135
136 testSplitter.show();
137 QVERIFY(QTest::qWaitForWindowExposed(&testSplitter));
138 QVERIFY(testSplitter.isVisible());
139
140 QVERIFY(!splitterCollapser->isWidgetCollapsed());
141
142 QTextEdit *edit1 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit1"));
143
144 int size = edit1->height();
145
146 QTest::mouseClick(splitterCollapser, Qt::LeftButton);
147 QVERIFY(splitterCollapser->isWidgetCollapsed());
148 QCOMPARE(edit1->height(), 0);
149
150 QTest::mouseClick(splitterCollapser, Qt::LeftButton);
151 QVERIFY(!splitterCollapser->isWidgetCollapsed());
152 QCOMPARE(edit1->height(), size);
153 }
154
shouldTestVerticalSplitterSecondWidget()155 void KSplitterCollapserButtonTest::shouldTestVerticalSplitterSecondWidget()
156 {
157 TestSplitter testSplitter;
158 testSplitter.splitter->setOrientation(Qt::Vertical);
159 KSplitterCollapserButton *splitterCollapser = new KSplitterCollapserButton(testSplitter.edit2, testSplitter.splitter);
160
161 testSplitter.show();
162 QVERIFY(QTest::qWaitForWindowExposed(&testSplitter));
163 QVERIFY(testSplitter.isVisible());
164
165 QVERIFY(!splitterCollapser->isWidgetCollapsed());
166
167 QTextEdit *edit2 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit2"));
168
169 int size = edit2->height();
170
171 QTest::mouseClick(splitterCollapser, Qt::LeftButton);
172 QVERIFY(splitterCollapser->isWidgetCollapsed());
173 QCOMPARE(edit2->height(), 0);
174
175 QTest::mouseClick(splitterCollapser, Qt::LeftButton);
176 QVERIFY(!splitterCollapser->isWidgetCollapsed());
177 QCOMPARE(edit2->height(), size);
178 }
179
shouldBeVisible_data()180 void KSplitterCollapserButtonTest::shouldBeVisible_data()
181 {
182 QTest::addColumn<Qt::Orientation>("splitterOrientation");
183 QTest::addColumn<int>("widgetPosition");
184
185 QTest::newRow("Horizontal, first widget") << Qt::Horizontal << 0 /*first widget*/;
186 QTest::newRow("Horizontal, second widget") << Qt::Horizontal << 1 /*second widget*/;
187 QTest::newRow("Vertical, first widget") << Qt::Vertical << 0 /*first widget*/;
188 QTest::newRow("Vertical, first widget") << Qt::Vertical << 1 /*second widget*/;
189 }
190
shouldBeVisible()191 void KSplitterCollapserButtonTest::shouldBeVisible()
192 {
193 QFETCH(Qt::Orientation, splitterOrientation);
194 QFETCH(int, widgetPosition);
195
196 // GIVEN a splitter with two widgets and a collapser button (Horizontal splitter, and apply collapser on first widget)
197 TestSplitter testSplitter;
198 testSplitter.splitter->setOrientation(splitterOrientation);
199 QWidget *widget = (widgetPosition == 0) ? testSplitter.edit1 : testSplitter.edit2;
200 KSplitterCollapserButton *collapser = new KSplitterCollapserButton(widget, testSplitter.splitter);
201
202 // WHEN showing the splitter
203 testSplitter.show();
204 QVERIFY(QTest::qWaitForWindowExposed(&testSplitter));
205 QVERIFY(testSplitter.isVisible());
206
207 // THEN the button should be visible
208 QVERIFY(collapser->isVisible());
209 QVERIFY(collapser->x() > 0);
210 QVERIFY(collapser->y() > 0);
211 }
212
shouldBeVisibleWhenMovingHandle_data()213 void KSplitterCollapserButtonTest::shouldBeVisibleWhenMovingHandle_data()
214 {
215 QTest::addColumn<QList<int>>("splitterPosition");
216 QTest::addColumn<bool>("expectedVisibility");
217 QTest::addColumn<Qt::Orientation>("splitterOrientation");
218 QTest::addColumn<int>("widgetPosition");
219
220 QTest::newRow("(Horizontal first widget) middle") << (QList<int>() << 1 << 1) << true << Qt::Horizontal << 0;
221 QTest::newRow("(Horizontal first widget) 1/3") << (QList<int>() << 1 << 3) << true << Qt::Horizontal << 0;
222 QTest::newRow("(Horizontal first widget) editor collapsed") << (QList<int>() << 0 << 1) << false << Qt::Horizontal << 0;
223 QTest::newRow("(Horizontal first widget) second editor collapsed") << (QList<int>() << 1 << 0) << true << Qt::Horizontal << 0;
224
225 QTest::newRow("(Horizontal second widget) middle") << (QList<int>() << 1 << 1) << true << Qt::Horizontal << 1;
226 QTest::newRow("(Horizontal second widget) 1/3") << (QList<int>() << 1 << 3) << true << Qt::Horizontal << 1;
227 QTest::newRow("(Horizontal second widget) editor collapsed") << (QList<int>() << 1 << 0) << true << Qt::Horizontal << 1;
228 QTest::newRow("(Horizontal second widget) first editor collapsed") << (QList<int>() << 0 << 1) << true << Qt::Horizontal << 1;
229
230 QTest::newRow("(Vertical first widget) middle") << (QList<int>() << 1 << 1) << true << Qt::Vertical << 0;
231 QTest::newRow("(Vertical first widget) 1/3") << (QList<int>() << 1 << 3) << true << Qt::Vertical << 0;
232 QTest::newRow("(Vertical first widget) editor collapsed") << (QList<int>() << 0 << 1) << true << Qt::Vertical << 0;
233 QTest::newRow("(Vertical first widget) second editor collapsed") << (QList<int>() << 1 << 0) << true << Qt::Vertical << 0;
234
235 QTest::newRow("(Vertical second widget) middle") << (QList<int>() << 1 << 1) << true << Qt::Vertical << 1;
236 QTest::newRow("(Vertical second widget) 1/3") << (QList<int>() << 1 << 3) << true << Qt::Vertical << 1;
237 QTest::newRow("(Vertical second widget) editor collapsed") << (QList<int>() << 1 << 0) << true << Qt::Vertical << 1;
238 QTest::newRow("(Vertical second widget) first editor collapsed") << (QList<int>() << 0 << 1) << false << Qt::Vertical << 1;
239 }
240
shouldBeVisibleWhenMovingHandle()241 void KSplitterCollapserButtonTest::shouldBeVisibleWhenMovingHandle()
242 {
243 QFETCH(QList<int>, splitterPosition);
244 QFETCH(bool, expectedVisibility);
245 QFETCH(Qt::Orientation, splitterOrientation);
246 QFETCH(int, widgetPosition);
247
248 // GIVEN a splitter with two widgets and a collapser button (Horizontal splitter, and apply collapser on first widget)
249 TestSplitter testSplitter;
250 testSplitter.splitter->setOrientation(splitterOrientation);
251 QWidget *widget = (widgetPosition == 0) ? testSplitter.edit1 : testSplitter.edit2;
252
253 KSplitterCollapserButton *collapser = new KSplitterCollapserButton(widget, testSplitter.splitter);
254
255 // WHEN showing the splitter
256 testSplitter.show();
257 QVERIFY(QTest::qWaitForWindowExposed(&testSplitter));
258 QVERIFY(testSplitter.isVisible());
259
260 testSplitter.splitter->setSizes(splitterPosition);
261 // THEN the button should be visible
262 QVERIFY(collapser->isVisible());
263 if (widgetPosition == 0) {
264 QCOMPARE(collapser->x() > 0, expectedVisibility);
265 } else {
266 QCOMPARE(collapser->y() > 0, expectedVisibility);
267 }
268 }
269
270 QTEST_MAIN(KSplitterCollapserButtonTest)
271