File indexing completed on 2024-04-28 15:31:53

0001 /*
0002     SPDX-FileCopyrightText: 2014 Montel Laurent <montel@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "ksplittercollapserbuttontest.h"
0008 #include "ksplittercollapserbutton.h"
0009 #include <QHBoxLayout>
0010 #include <QSplitter>
0011 #include <QTextEdit>
0012 #include <qtest.h>
0013 #include <qtestmouse.h>
0014 
0015 Q_DECLARE_METATYPE(Qt::Orientation)
0016 
0017 TestSplitter::TestSplitter(QWidget *parent)
0018     : QWidget(parent)
0019 {
0020     QHBoxLayout *lay = new QHBoxLayout(this);
0021 
0022     splitter = new QSplitter;
0023     lay->addWidget(splitter);
0024     splitter->setObjectName(QStringLiteral("splitter"));
0025     edit1 = new QTextEdit;
0026     edit1->setObjectName(QStringLiteral("edit1"));
0027     splitter->addWidget(edit1);
0028 
0029     edit2 = new QTextEdit;
0030     edit2->setObjectName(QStringLiteral("edit2"));
0031     splitter->addWidget(edit2);
0032 }
0033 
0034 KSplitterCollapserButtonTest::KSplitterCollapserButtonTest(QObject *parent)
0035     : QObject(parent)
0036 {
0037 }
0038 
0039 KSplitterCollapserButtonTest::~KSplitterCollapserButtonTest()
0040 {
0041 }
0042 
0043 void KSplitterCollapserButtonTest::shouldHaveDefaultValue()
0044 {
0045     TestSplitter testSplitter;
0046 
0047     KSplitterCollapserButton *collapser = new KSplitterCollapserButton(testSplitter.edit2, testSplitter.splitter);
0048 
0049     testSplitter.show();
0050     QVERIFY(QTest::qWaitForWindowExposed(&testSplitter));
0051     QVERIFY(testSplitter.isVisible());
0052 
0053     QVERIFY(!collapser->isWidgetCollapsed());
0054 
0055     QTextEdit *edit1 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit1"));
0056     QVERIFY(edit1);
0057     QTextEdit *edit2 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit2"));
0058     QVERIFY(edit2);
0059 
0060     QSplitter *splitter = testSplitter.findChild<QSplitter *>(QStringLiteral("splitter"));
0061     QVERIFY(splitter);
0062 }
0063 
0064 void KSplitterCollapserButtonTest::shouldCollapseWhenClickOnButton()
0065 {
0066     TestSplitter testSplitter;
0067     KSplitterCollapserButton *splitterCollapser = new KSplitterCollapserButton(testSplitter.edit2, testSplitter.splitter);
0068 
0069     testSplitter.show();
0070     QVERIFY(QTest::qWaitForWindowExposed(&testSplitter));
0071 
0072     QVERIFY(!splitterCollapser->isWidgetCollapsed());
0073     QTest::mouseClick(splitterCollapser, Qt::LeftButton);
0074     QVERIFY(splitterCollapser->isWidgetCollapsed());
0075 
0076     QTest::mouseClick(splitterCollapser, Qt::LeftButton);
0077     QVERIFY(!splitterCollapser->isWidgetCollapsed());
0078 }
0079 
0080 void KSplitterCollapserButtonTest::shouldRestoreCorrectPosition()
0081 {
0082     TestSplitter testSplitter;
0083 
0084     KSplitterCollapserButton *splitterCollapser = new KSplitterCollapserButton(testSplitter.edit2, testSplitter.splitter);
0085 
0086     testSplitter.show();
0087     QVERIFY(QTest::qWaitForWindowExposed(&testSplitter));
0088     QVERIFY(testSplitter.isVisible());
0089 
0090     QVERIFY(!splitterCollapser->isWidgetCollapsed());
0091 
0092     QTextEdit *edit2 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit2"));
0093 
0094     int size = edit2->width();
0095 
0096     QTest::mouseClick(splitterCollapser, Qt::LeftButton);
0097     QVERIFY(splitterCollapser->isWidgetCollapsed());
0098     QCOMPARE(edit2->width(), 0);
0099 
0100     QTest::mouseClick(splitterCollapser, Qt::LeftButton);
0101     QVERIFY(!splitterCollapser->isWidgetCollapsed());
0102     QCOMPARE(edit2->width(), size);
0103 }
0104 
0105 void KSplitterCollapserButtonTest::shouldRestoreCorrectPositionForFirstWidget()
0106 {
0107     TestSplitter testSplitter;
0108 
0109     KSplitterCollapserButton *splitterCollapser = new KSplitterCollapserButton(testSplitter.edit1, testSplitter.splitter);
0110 
0111     testSplitter.show();
0112     QVERIFY(QTest::qWaitForWindowExposed(&testSplitter));
0113     QVERIFY(testSplitter.isVisible());
0114 
0115     QVERIFY(!splitterCollapser->isWidgetCollapsed());
0116 
0117     QTextEdit *edit1 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit1"));
0118 
0119     int size = edit1->width();
0120 
0121     QTest::mouseClick(splitterCollapser, Qt::LeftButton);
0122     QVERIFY(splitterCollapser->isWidgetCollapsed());
0123     QCOMPARE(edit1->width(), 0);
0124 
0125     QTest::mouseClick(splitterCollapser, Qt::LeftButton);
0126     QVERIFY(!splitterCollapser->isWidgetCollapsed());
0127     QCOMPARE(edit1->width(), size);
0128 }
0129 
0130 void KSplitterCollapserButtonTest::shouldTestVerticalSplitterFirstWidget()
0131 {
0132     TestSplitter testSplitter;
0133     testSplitter.splitter->setOrientation(Qt::Vertical);
0134     KSplitterCollapserButton *splitterCollapser = new KSplitterCollapserButton(testSplitter.edit1, testSplitter.splitter);
0135 
0136     testSplitter.show();
0137     QVERIFY(QTest::qWaitForWindowExposed(&testSplitter));
0138     QVERIFY(testSplitter.isVisible());
0139 
0140     QVERIFY(!splitterCollapser->isWidgetCollapsed());
0141 
0142     QTextEdit *edit1 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit1"));
0143 
0144     int size = edit1->height();
0145 
0146     QTest::mouseClick(splitterCollapser, Qt::LeftButton);
0147     QVERIFY(splitterCollapser->isWidgetCollapsed());
0148     QCOMPARE(edit1->height(), 0);
0149 
0150     QTest::mouseClick(splitterCollapser, Qt::LeftButton);
0151     QVERIFY(!splitterCollapser->isWidgetCollapsed());
0152     QCOMPARE(edit1->height(), size);
0153 }
0154 
0155 void KSplitterCollapserButtonTest::shouldTestVerticalSplitterSecondWidget()
0156 {
0157     TestSplitter testSplitter;
0158     testSplitter.splitter->setOrientation(Qt::Vertical);
0159     KSplitterCollapserButton *splitterCollapser = new KSplitterCollapserButton(testSplitter.edit2, testSplitter.splitter);
0160 
0161     testSplitter.show();
0162     QVERIFY(QTest::qWaitForWindowExposed(&testSplitter));
0163     QVERIFY(testSplitter.isVisible());
0164 
0165     QVERIFY(!splitterCollapser->isWidgetCollapsed());
0166 
0167     QTextEdit *edit2 = testSplitter.findChild<QTextEdit *>(QStringLiteral("edit2"));
0168 
0169     int size = edit2->height();
0170 
0171     QTest::mouseClick(splitterCollapser, Qt::LeftButton);
0172     QVERIFY(splitterCollapser->isWidgetCollapsed());
0173     QCOMPARE(edit2->height(), 0);
0174 
0175     QTest::mouseClick(splitterCollapser, Qt::LeftButton);
0176     QVERIFY(!splitterCollapser->isWidgetCollapsed());
0177     QCOMPARE(edit2->height(), size);
0178 }
0179 
0180 void KSplitterCollapserButtonTest::shouldBeVisible_data()
0181 {
0182     QTest::addColumn<Qt::Orientation>("splitterOrientation");
0183     QTest::addColumn<int>("widgetPosition");
0184 
0185     QTest::newRow("Horizontal, first widget") << Qt::Horizontal << 0 /*first widget*/;
0186     QTest::newRow("Horizontal, second widget") << Qt::Horizontal << 1 /*second widget*/;
0187     QTest::newRow("Vertical, first widget") << Qt::Vertical << 0 /*first widget*/;
0188     QTest::newRow("Vertical, first widget") << Qt::Vertical << 1 /*second widget*/;
0189 }
0190 
0191 void KSplitterCollapserButtonTest::shouldBeVisible()
0192 {
0193     QFETCH(Qt::Orientation, splitterOrientation);
0194     QFETCH(int, widgetPosition);
0195 
0196     // GIVEN a splitter with two widgets and a collapser button (Horizontal splitter, and apply collapser on first widget)
0197     TestSplitter testSplitter;
0198     testSplitter.splitter->setOrientation(splitterOrientation);
0199     QWidget *widget = (widgetPosition == 0) ? testSplitter.edit1 : testSplitter.edit2;
0200     KSplitterCollapserButton *collapser = new KSplitterCollapserButton(widget, testSplitter.splitter);
0201 
0202     // WHEN showing the splitter
0203     testSplitter.show();
0204     QVERIFY(QTest::qWaitForWindowExposed(&testSplitter));
0205     QVERIFY(testSplitter.isVisible());
0206 
0207     // THEN the button should be visible
0208     QVERIFY(collapser->isVisible());
0209     QVERIFY(collapser->x() > 0);
0210     QVERIFY(collapser->y() > 0);
0211 }
0212 
0213 void KSplitterCollapserButtonTest::shouldBeVisibleWhenMovingHandle_data()
0214 {
0215     QTest::addColumn<QList<int>>("splitterPosition");
0216     QTest::addColumn<bool>("expectedVisibility");
0217     QTest::addColumn<Qt::Orientation>("splitterOrientation");
0218     QTest::addColumn<int>("widgetPosition");
0219 
0220     QTest::newRow("(Horizontal first widget) middle") << (QList<int>() << 1 << 1) << true << Qt::Horizontal << 0;
0221     QTest::newRow("(Horizontal first widget) 1/3") << (QList<int>() << 1 << 3) << true << Qt::Horizontal << 0;
0222     QTest::newRow("(Horizontal first widget) editor collapsed") << (QList<int>() << 0 << 1) << false << Qt::Horizontal << 0;
0223     QTest::newRow("(Horizontal first widget) second editor collapsed") << (QList<int>() << 1 << 0) << true << Qt::Horizontal << 0;
0224 
0225     QTest::newRow("(Horizontal second widget) middle") << (QList<int>() << 1 << 1) << true << Qt::Horizontal << 1;
0226     QTest::newRow("(Horizontal second widget) 1/3") << (QList<int>() << 1 << 3) << true << Qt::Horizontal << 1;
0227     QTest::newRow("(Horizontal second widget) editor collapsed") << (QList<int>() << 1 << 0) << true << Qt::Horizontal << 1;
0228     QTest::newRow("(Horizontal second widget) first editor collapsed") << (QList<int>() << 0 << 1) << true << Qt::Horizontal << 1;
0229 
0230     QTest::newRow("(Vertical first widget) middle") << (QList<int>() << 1 << 1) << true << Qt::Vertical << 0;
0231     QTest::newRow("(Vertical first widget) 1/3") << (QList<int>() << 1 << 3) << true << Qt::Vertical << 0;
0232     QTest::newRow("(Vertical first widget) editor collapsed") << (QList<int>() << 0 << 1) << true << Qt::Vertical << 0;
0233     QTest::newRow("(Vertical first widget) second editor collapsed") << (QList<int>() << 1 << 0) << true << Qt::Vertical << 0;
0234 
0235     QTest::newRow("(Vertical second widget) middle") << (QList<int>() << 1 << 1) << true << Qt::Vertical << 1;
0236     QTest::newRow("(Vertical second widget) 1/3") << (QList<int>() << 1 << 3) << true << Qt::Vertical << 1;
0237     QTest::newRow("(Vertical second widget) editor collapsed") << (QList<int>() << 1 << 0) << true << Qt::Vertical << 1;
0238     QTest::newRow("(Vertical second widget) first editor collapsed") << (QList<int>() << 0 << 1) << false << Qt::Vertical << 1;
0239 }
0240 
0241 void KSplitterCollapserButtonTest::shouldBeVisibleWhenMovingHandle()
0242 {
0243     QFETCH(QList<int>, splitterPosition);
0244     QFETCH(bool, expectedVisibility);
0245     QFETCH(Qt::Orientation, splitterOrientation);
0246     QFETCH(int, widgetPosition);
0247 
0248     // GIVEN a splitter with two widgets and a collapser button (Horizontal splitter, and apply collapser on first widget)
0249     TestSplitter testSplitter;
0250     testSplitter.splitter->setOrientation(splitterOrientation);
0251     QWidget *widget = (widgetPosition == 0) ? testSplitter.edit1 : testSplitter.edit2;
0252 
0253     KSplitterCollapserButton *collapser = new KSplitterCollapserButton(widget, testSplitter.splitter);
0254 
0255     // WHEN showing the splitter
0256     testSplitter.show();
0257     QVERIFY(QTest::qWaitForWindowExposed(&testSplitter));
0258     QVERIFY(testSplitter.isVisible());
0259 
0260     testSplitter.splitter->setSizes(splitterPosition);
0261     // THEN the button should be visible
0262     QVERIFY(collapser->isVisible());
0263     if (widgetPosition == 0) {
0264         QCOMPARE(collapser->x() > 0, expectedVisibility);
0265     } else {
0266         QCOMPARE(collapser->y() > 0, expectedVisibility);
0267     }
0268 }
0269 
0270 QTEST_MAIN(KSplitterCollapserButtonTest)
0271 
0272 #include "moc_ksplittercollapserbuttontest.cpp"