File indexing completed on 2024-04-28 15:31:54
0001 /* 0002 SPDX-FileCopyrightText: 2017 Henrik Fehlauer <rkflx@lab12.net> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "ksqueezedtextlabelautotest.h" 0008 0009 #include <KSqueezedTextLabel> 0010 0011 #include <QTest> 0012 0013 Q_DECLARE_METATYPE(Qt::TextElideMode) 0014 0015 namespace 0016 { 0017 0018 std::unique_ptr<KSqueezedTextLabel> createLabel(const QString &text = QStringLiteral("Squeeze me")) 0019 { 0020 auto label = std::make_unique<KSqueezedTextLabel>(QStringLiteral(""), nullptr); 0021 label->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); 0022 // workaround for a QLabel bug, where the sizing for an empty label 0023 // is off, if it was initialized to an empty text. 0024 label->setText(QStringLiteral("x")); 0025 label->setText(text); 0026 label->show(); 0027 return label; 0028 } 0029 0030 void squeezeLabel(KSqueezedTextLabel *label, const int pixels = 10) 0031 { 0032 label->resize(label->size().width() - pixels, label->size().height()); 0033 } 0034 0035 } // namespace 0036 0037 void KSqueezedTextLabelAutotest::testEmptyText() 0038 { 0039 const auto label = createLabel(QString()); 0040 0041 QVERIFY(label->text().isEmpty()); 0042 QVERIFY(label->fullText().isEmpty()); 0043 QVERIFY(label->toolTip().isEmpty()); 0044 QVERIFY(!label->isSqueezed()); 0045 QCOMPARE(label->width(), 0); 0046 } 0047 0048 void KSqueezedTextLabelAutotest::testElisionOnResize_data() 0049 { 0050 QTest::addColumn<QString>("text"); 0051 QTest::addColumn<int>("squeezePixels"); 0052 0053 QTest::newRow("whitespace text") << " " << 10; 0054 QTest::newRow("normal text") << "Squeeze me" << 10; 0055 QTest::newRow("rich text") << "<h1>Squeeze me!</h1>" << 80; 0056 // QTest::newRow("multiline text") << "Squeeze me,\nand\nme too."; 0057 // QTest::newRow("multiline rich text") << "<i>Squeeze</i> me,\n<b>and\nme</b> too."; 0058 } 0059 0060 void KSqueezedTextLabelAutotest::testElisionOnResize() 0061 { 0062 QFETCH(QString, text); 0063 QFETCH(int, squeezePixels); 0064 0065 const auto label = createLabel(text); 0066 0067 QVERIFY(label->text() == text); 0068 QVERIFY(label->fullText() == text); 0069 QVERIFY(label->toolTip().isEmpty()); 0070 QVERIFY(!label->isSqueezed()); 0071 0072 squeezeLabel(label.get(), squeezePixels); 0073 0074 QVERIFY(label->text() != text); 0075 QVERIFY(label->fullText() == text); 0076 QVERIFY(label->toolTip() == text); 0077 QVERIFY(label->isSqueezed()); 0078 0079 squeezeLabel(label.get(), -squeezePixels); 0080 0081 QVERIFY(label->text() == text); 0082 QVERIFY(label->fullText() == text); 0083 QVERIFY(label->toolTip().isEmpty()); 0084 QVERIFY(!label->isSqueezed()); 0085 } 0086 0087 void KSqueezedTextLabelAutotest::testElisionOnTextUpdate() 0088 { 0089 const auto label = createLabel(); 0090 0091 QVERIFY(!label->isSqueezed()); 0092 0093 label->setText(label->text() + QStringLiteral("!!!")); 0094 0095 QVERIFY(label->isSqueezed()); 0096 } 0097 0098 void KSqueezedTextLabelAutotest::testElideMode_data() 0099 { 0100 QTest::addColumn<Qt::TextElideMode>("mode"); 0101 QTest::addColumn<QChar>("prefix"); 0102 QTest::addColumn<QChar>("infix"); 0103 QTest::addColumn<QChar>("postfix"); 0104 0105 const QChar ellipsisChar(0x2026); 0106 const QChar a(QLatin1Char('a')); 0107 const QChar b(QLatin1Char('b')); 0108 const QChar c(QLatin1Char('c')); 0109 0110 QTest::newRow("ElideLeft") << Qt::ElideLeft << ellipsisChar << b << c; 0111 QTest::newRow("ElideRight") << Qt::ElideRight << a << b << ellipsisChar; 0112 QTest::newRow("ElideMiddle") << Qt::ElideMiddle << a << ellipsisChar << c; 0113 QTest::newRow("ElideNone") << Qt::ElideNone << a << b << c; 0114 } 0115 0116 void KSqueezedTextLabelAutotest::testElideMode() 0117 { 0118 QFETCH(Qt::TextElideMode, mode); 0119 QFETCH(QChar, prefix); 0120 QFETCH(QChar, infix); 0121 QFETCH(QChar, postfix); 0122 0123 // "abc" is not sufficient, because ellipsis might be wider than a single char 0124 const auto label = createLabel(QStringLiteral("aaabbbccc")); 0125 label->setTextElideMode(mode); 0126 squeezeLabel(label.get()); 0127 const int infixPos = label->text().indexOf(infix); 0128 0129 QVERIFY(label->isSqueezed() || mode == Qt::ElideNone); 0130 QVERIFY(label->text().startsWith(prefix)); 0131 QVERIFY(0 < infixPos && infixPos < label->text().length() - 1); 0132 QVERIFY(label->text().endsWith(postfix)); 0133 } 0134 0135 void KSqueezedTextLabelAutotest::testSizeHints() 0136 { 0137 const auto label = createLabel(QString()); 0138 0139 QVERIFY(!label->isSqueezed()); 0140 QCOMPARE(label->size().width(), 0); 0141 QCOMPARE(label->minimumSizeHint().width(), -1); 0142 QCOMPARE(label->sizeHint().width(), 0); 0143 0144 label->adjustSize(); 0145 0146 QVERIFY(!label->isSqueezed()); 0147 QCOMPARE(label->size().width(), 0); 0148 QCOMPARE(label->minimumSizeHint().width(), -1); 0149 QCOMPARE(label->sizeHint().width(), 0); 0150 0151 const QString text = QStringLiteral("Squeeze me"); 0152 label->setText(text); 0153 const int labelWidth = label->sizeHint().width(); 0154 0155 QVERIFY(label->isSqueezed()); 0156 QCOMPARE(label->size().width(), 0); 0157 QCOMPARE(label->minimumSizeHint().width(), -1); 0158 0159 label->adjustSize(); 0160 0161 QVERIFY(!label->isSqueezed()); 0162 QCOMPARE(label->size().width(), labelWidth); 0163 QCOMPARE(label->minimumSizeHint().width(), -1); 0164 QCOMPARE(label->sizeHint().width(), labelWidth); 0165 0166 const int indent = 40; 0167 label->setIndent(indent); 0168 label->adjustSize(); 0169 0170 QVERIFY(!label->isSqueezed()); 0171 QCOMPARE(label->size().width(), labelWidth + indent); 0172 QCOMPARE(label->minimumSizeHint().width(), -1); 0173 QCOMPARE(label->sizeHint().width(), labelWidth + indent); 0174 } 0175 0176 void KSqueezedTextLabelAutotest::testClearing() 0177 { 0178 const auto label = createLabel(); 0179 squeezeLabel(label.get()); 0180 0181 QVERIFY(label->isSqueezed()); 0182 0183 label->clear(); 0184 0185 QVERIFY(label->text().isEmpty()); 0186 QVERIFY(label->fullText().isEmpty()); 0187 QEXPECT_FAIL("", "To fix: Reset tooltip in clear()", Continue); 0188 QVERIFY(label->toolTip().isEmpty()); 0189 QVERIFY(!label->isSqueezed()); 0190 } 0191 0192 void KSqueezedTextLabelAutotest::testChrome_data() 0193 { 0194 const QFontMetrics fm(KSqueezedTextLabel().fontMetrics()); 0195 const int xWidth = fm.horizontalAdvance(QLatin1Char('x')) / 2; 0196 0197 QTest::addColumn<QString>("attribute"); 0198 QTest::addColumn<int>("amount"); 0199 QTest::addColumn<int>("widthDifference"); 0200 0201 QTest::newRow("indent") << "indent" << 20 << 20; 0202 QTest::newRow("margin") << "margin" << 20 << 40; 0203 QTest::newRow("frame") << "lineWidth" << 20 << 40 + xWidth; 0204 } 0205 0206 void KSqueezedTextLabelAutotest::testChrome() 0207 { 0208 QFETCH(QString, attribute); 0209 QFETCH(int, amount); 0210 QFETCH(int, widthDifference); 0211 0212 const auto label = createLabel(); 0213 label->setFrameStyle(QFrame::Box); 0214 label->setLineWidth(0); 0215 const int oldWidth = label->width(); 0216 0217 QVERIFY(!label->isSqueezed()); 0218 0219 label->setProperty(attribute.toLatin1().data(), amount); 0220 0221 QVERIFY(label->isSqueezed()); 0222 0223 label->adjustSize(); 0224 0225 QVERIFY(!label->isSqueezed()); 0226 QCOMPARE(label->width(), oldWidth + widthDifference); 0227 } 0228 0229 QTEST_MAIN(KSqueezedTextLabelAutotest) 0230 0231 // TODO 0232 // currently untested, may need clarification/definition of correct behaviour: 0233 // - multiline text 0234 // - setWordWrap 0235 // - setAlignment 0236 // - setToolTip 0237 // - context menu 0238 // - Qt::TextInteractionFlags, keyboard/mouse interaction 0239 // - linkHovered/linkActivated 0240 // - setPixmap 0241 0242 #include "moc_ksqueezedtextlabelautotest.cpp"