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"