From 199eaa042927896c99101fe74e4cfca29129c5c4 Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 28 Oct 2026 02:05:37 +0100 Subject: [PATCH] Verify desktop image previews decode asynchronously and paint without file I/O --- tools/chatgui/tests/test_desktop_commands.cpp | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tools/chatgui/tests/test_desktop_commands.cpp b/tools/chatgui/tests/test_desktop_commands.cpp index c1add085..ce9304ed 100644 --- a/tools/chatgui/tests/test_desktop_commands.cpp +++ b/tools/chatgui/tests/test_desktop_commands.cpp @@ -6,6 +6,7 @@ #include "../db/db_manager.h" #include "../src/inputbar.h" #include "../src/messagedelegate.h" +#include "../src/messagelist.h" #include "../src/sound_manager.h" #include #include @@ -186,6 +187,33 @@ private slots: QCOMPARE(outstanding.size(), size_t(0)); #endif } + void imagePreviewPreparedOutsidePaint() { + QTemporaryDir directory; QVERIFY(directory.isValid()); + const QString path = directory.filePath("image.png"); + QImage original(1200, 1800, QImage::Format_ARGB32); original.fill(Qt::red); QVERIFY(original.save(path)); + MessageList history; history.resize(600, 500); history.show(); + auto* model = history.findChild(); QVERIFY(model); + auto* view = history.findChild(); QVERIFY(view); + auto* item = new QStandardItem; + item->setData("image/png", MsgContentTypeRole); item->setData(path, MsgVoiceFileRole); + item->setData(1200, MsgImageWidthRole); item->setData(1800, MsgImageHeightRole); + item->setData(2, MsgFileDownloadStateRole); model->appendRow(item); + QTRY_VERIFY_WITH_TIMEOUT(!item->data(MsgImagePreviewRole).value().isNull(), 3000); + const QImage preview = item->data(MsgImagePreviewRole).value(); + QVERIFY(preview.width() <= 600 && preview.height() <= 600); + QCOMPARE(preview.width() * 3, preview.height() * 2); QVERIFY(!item->data(MsgImageErrorRole).toBool()); + QVERIFY(QFile::remove(path)); // Paint обязан использовать подготовленное превью даже без файла на диске. + QImage canvas(600, 400, QImage::Format_ARGB32); canvas.fill(Qt::black); + QStyleOptionViewItem option; option.initFrom(view); option.rect = canvas.rect(); + QPainter painter(&canvas); view->itemDelegate()->paint(&painter, option, model->index(0, 0)); painter.end(); + int red = 0; + for (int y = 0; y < canvas.height(); ++y) for (int x = 0; x < canvas.width(); ++x) { + const QColor color = canvas.pixelColor(x, y); + if (color.red() > 220 && color.green() < 30 && color.blue() < 30) ++red; + } + QVERIFY(red > 1000); + } + void boundCommand_data() { QTest::addColumn("scenario"); for (const auto& name : {"unavailable", "stopped", "cancelled", "executed"}) QTest::newRow(name) << QString(name);