File indexing completed on 2024-05-26 05:05:59
0001 /* 0002 SPDX-FileCopyrightText: 2020 David Faure <faure@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "messagelistdelegatetest.h" 0008 #include "messages/message.h" 0009 #include "messages/messageattachment.h" 0010 #include "rocketchataccount.h" 0011 #include "room/delegate/messagelistdelegate.h" 0012 #include "ruqola.h" 0013 #include "testdata.h" 0014 0015 #include <QStandardItemModel> 0016 #include <QStandardPaths> 0017 #include <QStyleOptionViewItem> 0018 #include <QTest> 0019 0020 QTEST_MAIN(MessageListDelegateTest) 0021 0022 MessageListDelegateTest::MessageListDelegateTest(QObject *parent) 0023 : QObject(parent) 0024 { 0025 initTestAccount(); 0026 0027 const QString userId = QStringLiteral("dfaureUserId"); 0028 Ruqola::self()->rocketChatAccount()->insertAvatarUrl(userId, avatarLink()); 0029 } 0030 0031 void MessageListDelegateTest::layoutChecks_data() 0032 { 0033 QTest::addColumn<Message>("message"); 0034 QTest::addColumn<bool>("withDateHeader"); 0035 0036 Message message; 0037 message.setMessageId(QStringLiteral("someNonEmptyId")); 0038 message.setUserId(QStringLiteral("dfaureUserId")); 0039 message.setUsername(QStringLiteral("dfaure")); 0040 message.setTimeStamp(QDateTime(QDate(2020, 2, 1), QTime(4, 7, 15)).toMSecsSinceEpoch()); 0041 message.setMessageType(Message::NormalText); 0042 0043 QTest::newRow("text_no_date") << message << false; 0044 QTest::newRow("text_with_date") << message << true; 0045 0046 message.setMessageType(Message::NormalText); 0047 MessageAttachment msgAttach = testAttachment(); 0048 msgAttach.setAttachmentType(MessageAttachment::Image); 0049 message.setAttachments({msgAttach}); 0050 0051 QTest::newRow("attachment_no_text_no_date") << message << false; 0052 QTest::newRow("attachment_no_text_with_date") << message << true; 0053 0054 message.setText(QStringLiteral("The <b>text</b>")); 0055 0056 QTest::newRow("attachment_with_text_no_date") << message << false; 0057 QTest::newRow("attachment_with_text_with_date") << message << true; 0058 0059 message.setEditedByUsername(message.username()); 0060 0061 QTest::newRow("edited_with_attachment_with_text_with_date") << message << true; 0062 0063 // TODO tests with reactions 0064 } 0065 0066 void MessageListDelegateTest::layoutChecks() 0067 { 0068 QFETCH(Message, message); 0069 QFETCH(bool, withDateHeader); 0070 0071 // GIVEN a delegate and an index pointing to a message 0072 MessageListDelegate delegate(Ruqola::self()->rocketChatAccount(), nullptr); 0073 delegate.setRocketChatAccount(Ruqola::self()->rocketChatAccount()); 0074 QStyleOptionViewItem option; 0075 QWidget fakeWidget; 0076 option.widget = &fakeWidget; 0077 option.rect = QRect(100, 100, 500, 500); 0078 0079 QStandardItemModel model; 0080 auto item = new QStandardItem; 0081 item->setData(message.username(), MessagesModel::Username); 0082 item->setData(message.userId(), MessagesModel::UserId); 0083 item->setData(withDateHeader, MessagesModel::DateDiffersFromPrevious); 0084 item->setData(message.displayTime(), MessagesModel::Timestamp); 0085 item->setData(QVariant::fromValue(&message), MessagesModel::MessagePointer); 0086 item->setData(message.text(), MessagesModel::OriginalMessage); 0087 item->setData(message.text(), MessagesModel::MessageConvertedText); 0088 model.setItem(0, 0, item); 0089 // Ensure it's not last, that's a special case in sizeHint 0090 auto item2 = new QStandardItem; 0091 model.setItem(1, 0, item2); 0092 0093 const QModelIndex index = model.index(0, 0); 0094 0095 // WHEN calculating sizehint 0096 const QSize sizeHint = delegate.sizeHint(option, index); 0097 QVERIFY(sizeHint.isValid()); 0098 option.rect.setSize(sizeHint); 0099 0100 // ... and redoing layout while painting 0101 const MessageListLayoutBase::Layout layout = delegate.doLayout(option, index); 0102 0103 // THEN 0104 QCOMPARE(layout.senderText, QStringLiteral("@dfaure")); 0105 QCOMPARE(layout.timeStampText, QStringLiteral("04:07")); 0106 QVERIFY(option.rect.contains(layout.usableRect)); 0107 QVERIFY(option.rect.contains(layout.senderRect.toRect())); 0108 if (message.attachments().isEmpty()) { 0109 QVERIFY(layout.attachmentsRect.isNull()); 0110 } else { 0111 QVERIFY(sizeHint.height() > layout.senderRect.height() + 1); 0112 QVERIFY(option.rect.contains(layout.attachmentsRect)); 0113 } 0114 0115 // Text 0116 if (message.text().isEmpty()) { 0117 QVERIFY(!layout.textRect.isValid()); 0118 } else { 0119 QVERIFY(option.rect.contains(layout.textRect)); 0120 QCOMPARE(layout.usableRect.left(), layout.textRect.left()); 0121 QVERIFY(layout.textRect.top() >= layout.usableRect.top()); 0122 QVERIFY(!layout.senderRect.intersects(layout.textRect)); 0123 if (!message.attachments().isEmpty()) { 0124 QCOMPARE(layout.attachmentsRect.top(), layout.textRect.y() + layout.textRect.height()); 0125 } 0126 } 0127 0128 const int bottom = layout.usableRect.y() + layout.usableRect.height(); 0129 0130 #if 0 // Need to reactivate it 0131 // Avatar 0132 QCOMPARE(qRound(layout.avatarPixmap.height() / layout.avatarPixmap.devicePixelRatioF()), layout.senderRect.height()); 0133 QCOMPARE(layout.avatarPixmap.devicePixelRatioF(), fakeWidget.devicePixelRatioF()); 0134 // qDebug() << layout.avatarPos.y() << "+" << layout.avatarPixmap.height() << "must be <=" << bottom; 0135 QVERIFY(layout.avatarPos.y() + layout.avatarPixmap.height() / layout.avatarPixmap.devicePixelRatioF() <= bottom); 0136 #endif 0137 // Reactions 0138 if (message.reactions().isEmpty()) { 0139 QCOMPARE(layout.reactionsHeight, 0); 0140 } else { 0141 QVERIFY(layout.reactionsHeight > 15); 0142 QVERIFY(layout.reactionsY + layout.reactionsHeight <= bottom); 0143 } 0144 0145 // Edited 0146 if (message.wasEdited()) { 0147 QVERIFY(option.rect.contains(layout.editedIconRect)); 0148 QVERIFY(!layout.editedIconRect.intersects(layout.textRect)); 0149 QVERIFY(!layout.editedIconRect.intersects(layout.senderRect.toRect())); 0150 } 0151 } 0152 0153 #include "moc_messagelistdelegatetest.cpp"