File indexing completed on 2025-05-04 05:18:46
0001 /* 0002 Copyright (c) 2014 Montel Laurent <montel@kde.org> 0003 This library is free software; you can redistribute it and/or 0004 modify it under the terms of the GNU Lesser General Public 0005 License as published by the Free Software Foundation; either 0006 version 2.1 of the License, or (at your option) version 3, or any 0007 later version accepted by the membership of KDE e.V. (or its 0008 successor approved by the membership of KDE e.V.), which shall 0009 act as a proxy defined in Section 6 of version 3 of the license. 0010 0011 This library is distributed in the hope that it will be useful, 0012 but WITHOUT ANY WARRANTY; without even the implied warranty of 0013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0014 Lesser General Public License for more details. 0015 0016 You should have received a copy of the GNU Lesser General Public 0017 License along with this program. If not, see <http://www.gnu.org/licenses/>. 0018 0019 */ 0020 0021 #include "ksplittercollapserbuttontest.h" 0022 #include "ksplittercollapserbutton.h" 0023 #include <QHBoxLayout> 0024 #include <QSplitter> 0025 #include <QTextEdit> 0026 #include <qtest.h> 0027 #include <qtestmouse.h> 0028 0029 Q_DECLARE_METATYPE(Qt::Orientation) 0030 0031 TestSplitter::TestSplitter(QWidget *parent) 0032 : QWidget(parent) 0033 { 0034 QHBoxLayout *lay = new QHBoxLayout; 0035 setLayout(lay); 0036 splitter = new QSplitter; 0037 lay->addWidget(splitter); 0038 splitter->setObjectName(QStringLiteral("splitter")); 0039 edit1 = new QTextEdit; 0040 edit1->setObjectName(QStringLiteral("edit1")); 0041 splitter->addWidget(edit1); 0042 0043 edit2 = new QTextEdit; 0044 edit2->setObjectName(QStringLiteral("edit2")); 0045 splitter->addWidget(edit2); 0046 } 0047 0048 KSplitterCollapserButtonTest::KSplitterCollapserButtonTest(QObject *parent) 0049 : QObject(parent) 0050 { 0051 0052 } 0053 0054 KSplitterCollapserButtonTest::~KSplitterCollapserButtonTest() 0055 { 0056 0057 } 0058 0059 void KSplitterCollapserButtonTest::shouldHaveDefaultValue() 0060 { 0061 TestSplitter testSplitter; 0062 0063 KSplitterCollapserButton *collapser = new KSplitterCollapserButton(testSplitter.edit2, testSplitter.splitter); 0064 0065 testSplitter.show(); 0066 QVERIFY(QTest::qWaitForWindowExposed(&testSplitter)); 0067 QVERIFY(testSplitter.isVisible()); 0068 0069 QVERIFY(!collapser->isWidgetCollapsed()); 0070 0071 QTextEdit *edit1 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit1")); 0072 QVERIFY(edit1); 0073 QTextEdit *edit2 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit2")); 0074 QVERIFY(edit2); 0075 0076 QSplitter *splitter = testSplitter.findChild<QSplitter *>(QStringLiteral("splitter")); 0077 QVERIFY(splitter); 0078 } 0079 0080 void KSplitterCollapserButtonTest::shouldCollapseWhenClickOnButton() 0081 { 0082 TestSplitter testSplitter; 0083 KSplitterCollapserButton *splitterCollapser = new KSplitterCollapserButton(testSplitter.edit2, testSplitter.splitter); 0084 0085 testSplitter.show(); 0086 QVERIFY(QTest::qWaitForWindowExposed(&testSplitter)); 0087 0088 QVERIFY(!splitterCollapser->isWidgetCollapsed()); 0089 QTest::mouseClick(splitterCollapser, Qt::LeftButton); 0090 QVERIFY(splitterCollapser->isWidgetCollapsed()); 0091 0092 QTest::mouseClick(splitterCollapser, Qt::LeftButton); 0093 QVERIFY(!splitterCollapser->isWidgetCollapsed()); 0094 } 0095 0096 void KSplitterCollapserButtonTest::shouldRestoreCorrectPosition() 0097 { 0098 TestSplitter testSplitter; 0099 0100 KSplitterCollapserButton *splitterCollapser = new KSplitterCollapserButton(testSplitter.edit2, testSplitter.splitter); 0101 0102 testSplitter.show(); 0103 QVERIFY(QTest::qWaitForWindowExposed(&testSplitter)); 0104 QVERIFY(testSplitter.isVisible()); 0105 0106 QVERIFY(!splitterCollapser->isWidgetCollapsed()); 0107 0108 QTextEdit *edit2 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit2")); 0109 0110 int size = edit2->width(); 0111 0112 QTest::mouseClick(splitterCollapser, Qt::LeftButton); 0113 QVERIFY(splitterCollapser->isWidgetCollapsed()); 0114 QCOMPARE(edit2->width(), 0); 0115 0116 QTest::mouseClick(splitterCollapser, Qt::LeftButton); 0117 QVERIFY(!splitterCollapser->isWidgetCollapsed()); 0118 QCOMPARE(edit2->width(), size); 0119 0120 } 0121 0122 void KSplitterCollapserButtonTest::shouldRestoreCorrectPositionForFirstWidget() 0123 { 0124 TestSplitter testSplitter; 0125 0126 KSplitterCollapserButton *splitterCollapser = new KSplitterCollapserButton(testSplitter.edit1, testSplitter.splitter); 0127 0128 testSplitter.show(); 0129 QVERIFY(QTest::qWaitForWindowExposed(&testSplitter)); 0130 QVERIFY(testSplitter.isVisible()); 0131 0132 QVERIFY(!splitterCollapser->isWidgetCollapsed()); 0133 0134 QTextEdit *edit1 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit1")); 0135 0136 int size = edit1->width(); 0137 0138 QTest::mouseClick(splitterCollapser, Qt::LeftButton); 0139 QVERIFY(splitterCollapser->isWidgetCollapsed()); 0140 QCOMPARE(edit1->width(), 0); 0141 0142 QTest::mouseClick(splitterCollapser, Qt::LeftButton); 0143 QVERIFY(!splitterCollapser->isWidgetCollapsed()); 0144 QCOMPARE(edit1->width(), size); 0145 } 0146 0147 void KSplitterCollapserButtonTest::shouldTestVerticalSplitterFirstWidget() 0148 { 0149 TestSplitter testSplitter; 0150 testSplitter.splitter->setOrientation(Qt::Vertical); 0151 KSplitterCollapserButton *splitterCollapser = new KSplitterCollapserButton(testSplitter.edit1, testSplitter.splitter); 0152 0153 testSplitter.show(); 0154 QVERIFY(QTest::qWaitForWindowExposed(&testSplitter)); 0155 QVERIFY(testSplitter.isVisible()); 0156 0157 QVERIFY(!splitterCollapser->isWidgetCollapsed()); 0158 0159 QTextEdit *edit1 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit1")); 0160 0161 int size = edit1->height(); 0162 0163 QTest::mouseClick(splitterCollapser, Qt::LeftButton); 0164 QVERIFY(splitterCollapser->isWidgetCollapsed()); 0165 QCOMPARE(edit1->height(), 0); 0166 0167 QTest::mouseClick(splitterCollapser, Qt::LeftButton); 0168 QVERIFY(!splitterCollapser->isWidgetCollapsed()); 0169 QCOMPARE(edit1->height(), size); 0170 0171 } 0172 0173 void KSplitterCollapserButtonTest::shouldTestVerticalSplitterSecondWidget() 0174 { 0175 TestSplitter testSplitter; 0176 testSplitter.splitter->setOrientation(Qt::Vertical); 0177 KSplitterCollapserButton *splitterCollapser = new KSplitterCollapserButton(testSplitter.edit2, testSplitter.splitter); 0178 0179 testSplitter.show(); 0180 QVERIFY(QTest::qWaitForWindowExposed(&testSplitter)); 0181 QVERIFY(testSplitter.isVisible()); 0182 0183 QVERIFY(!splitterCollapser->isWidgetCollapsed()); 0184 0185 QTextEdit *edit2 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit2")); 0186 0187 int size = edit2->height(); 0188 0189 QTest::mouseClick(splitterCollapser, Qt::LeftButton); 0190 QVERIFY(splitterCollapser->isWidgetCollapsed()); 0191 QCOMPARE(edit2->height(), 0); 0192 0193 QTest::mouseClick(splitterCollapser, Qt::LeftButton); 0194 QVERIFY(!splitterCollapser->isWidgetCollapsed()); 0195 QCOMPARE(edit2->height(), size); 0196 0197 } 0198 0199 void KSplitterCollapserButtonTest::shouldBeVisible_data() 0200 { 0201 QTest::addColumn<Qt::Orientation>("splitterOrientation"); 0202 QTest::addColumn<int>("widgetPosition"); 0203 0204 QTest::newRow("Horizontal, first widget") << Qt::Horizontal << 0 /*first widget*/; 0205 QTest::newRow("Horizontal, second widget") << Qt::Horizontal << 1 /*second widget*/; 0206 QTest::newRow("Vertical, first widget") << Qt::Vertical << 0 /*first widget*/; 0207 QTest::newRow("Vertical, first widget") << Qt::Vertical << 1 /*second widget*/; 0208 } 0209 0210 void KSplitterCollapserButtonTest::shouldBeVisible() 0211 { 0212 QFETCH(Qt::Orientation, splitterOrientation); 0213 QFETCH(int, widgetPosition); 0214 0215 // GIVEN a splitter with two widgets and a collapser button (Horizontal splitter, and apply collapser on first widget) 0216 TestSplitter testSplitter; 0217 testSplitter.splitter->setOrientation(splitterOrientation); 0218 QWidget *widget = (widgetPosition == 0) ? testSplitter.edit1 : testSplitter.edit2; 0219 KSplitterCollapserButton *collapser = new KSplitterCollapserButton(widget, testSplitter.splitter); 0220 0221 // WHEN showing the splitter 0222 testSplitter.show(); 0223 QVERIFY(QTest::qWaitForWindowExposed(&testSplitter)); 0224 QVERIFY(testSplitter.isVisible()); 0225 0226 // THEN the button should be visible 0227 QVERIFY(collapser->isVisible()); 0228 QVERIFY(collapser->x() > 0); 0229 QVERIFY(collapser->y() > 0); 0230 } 0231 0232 void KSplitterCollapserButtonTest::shouldBeVisibleWhenMovingHandle_data() 0233 { 0234 QTest::addColumn<QList<int> >("splitterPosition"); 0235 QTest::addColumn<bool>("expectedVisibility"); 0236 QTest::addColumn<Qt::Orientation>("splitterOrientation"); 0237 QTest::addColumn<int>("widgetPosition"); 0238 0239 0240 QTest::newRow("(Horizontal first widget) middle") << (QList<int>() << 1 << 1) << true << Qt::Horizontal << 0; 0241 QTest::newRow("(Horizontal first widget) 1/3") << (QList<int>() << 1 << 3) << true << Qt::Horizontal << 0; 0242 QTest::newRow("(Horizontal first widget) editor collapsed") << (QList<int>() << 0 << 1) << false << Qt::Horizontal << 0; 0243 QTest::newRow("(Horizontal first widget) second editor collapsed") << (QList<int>() << 1 << 0) << true << Qt::Horizontal << 0; 0244 0245 QTest::newRow("(Horizontal second widget) middle") << (QList<int>() << 1 << 1) << true << Qt::Horizontal << 1; 0246 QTest::newRow("(Horizontal second widget) 1/3") << (QList<int>() << 1 << 3) << true << Qt::Horizontal << 1; 0247 QTest::newRow("(Horizontal second widget) editor collapsed") << (QList<int>() << 1 << 0) << true << Qt::Horizontal << 1; 0248 QTest::newRow("(Horizontal second widget) first editor collapsed") << (QList<int>() << 0 << 1) << true << Qt::Horizontal << 1; 0249 0250 QTest::newRow("(Vertical first widget) middle") << (QList<int>() << 1 << 1) << true << Qt::Vertical << 0; 0251 QTest::newRow("(Vertical first widget) 1/3") << (QList<int>() << 1 << 3) << true << Qt::Vertical << 0; 0252 QTest::newRow("(Vertical first widget) editor collapsed") << (QList<int>() << 0 << 1) << true << Qt::Vertical << 0; 0253 QTest::newRow("(Vertical first widget) second editor collapsed") << (QList<int>() << 1 << 0) << true << Qt::Vertical << 0; 0254 0255 QTest::newRow("(Vertical second widget) middle") << (QList<int>() << 1 << 1) << true << Qt::Vertical << 1; 0256 QTest::newRow("(Vertical second widget) 1/3") << (QList<int>() << 1 << 3) << true << Qt::Vertical << 1; 0257 QTest::newRow("(Vertical second widget) editor collapsed") << (QList<int>() << 1 << 0) << true << Qt::Vertical << 1; 0258 QTest::newRow("(Vertical second widget) first editor collapsed") << (QList<int>() << 0 << 1) << false << Qt::Vertical << 1; 0259 0260 } 0261 0262 void KSplitterCollapserButtonTest::shouldBeVisibleWhenMovingHandle() 0263 { 0264 QFETCH(QList<int>, splitterPosition); 0265 QFETCH(bool, expectedVisibility); 0266 QFETCH(Qt::Orientation, splitterOrientation); 0267 QFETCH(int, widgetPosition); 0268 0269 // GIVEN a splitter with two widgets and a collapser button (Horizontal splitter, and apply collapser on first widget) 0270 TestSplitter testSplitter; 0271 testSplitter.splitter->setOrientation(splitterOrientation); 0272 QWidget *widget = (widgetPosition == 0) ? testSplitter.edit1 : testSplitter.edit2; 0273 0274 KSplitterCollapserButton *collapser = new KSplitterCollapserButton(widget, testSplitter.splitter); 0275 0276 // WHEN showing the splitter 0277 testSplitter.show(); 0278 QVERIFY(QTest::qWaitForWindowExposed(&testSplitter)); 0279 QVERIFY(testSplitter.isVisible()); 0280 0281 testSplitter.splitter->setSizes(splitterPosition); 0282 // THEN the button should be visible 0283 QVERIFY(collapser->isVisible()); 0284 if (widgetPosition == 0) { 0285 QCOMPARE(collapser->x() > 0, expectedVisibility); 0286 } else { 0287 QCOMPARE(collapser->y() > 0, expectedVisibility); 0288 } 0289 } 0290 0291 QTEST_MAIN(KSplitterCollapserButtonTest)