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)