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