File indexing completed on 2024-04-28 03:58:57
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"