187 lines
6.3 KiB
C++
187 lines
6.3 KiB
C++
// Copyright (C) 2022 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
|
|
|
|
#include <QtTest/QtTest>
|
|
#include <QtTest/QSignalSpy>
|
|
#include <QtQuick/qquickwindow.h>
|
|
#include <QtQuick/private/qquickdrag_p_p.h>
|
|
|
|
#include <QtQuickTestUtils/private/qmlutils_p.h>
|
|
|
|
class tst_QQuickDragAttached: public QQmlDataTest
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
tst_QQuickDragAttached();
|
|
|
|
private slots:
|
|
void setMimeData_data();
|
|
void setMimeData();
|
|
|
|
void imageSourceSize_data();
|
|
void imageSourceSize();
|
|
|
|
void startDrag_data();
|
|
void startDrag();
|
|
};
|
|
|
|
tst_QQuickDragAttached::tst_QQuickDragAttached()
|
|
: QQmlDataTest(QT_QMLTEST_DATADIR)
|
|
{
|
|
}
|
|
|
|
void tst_QQuickDragAttached::setMimeData_data()
|
|
{
|
|
QTest::addColumn<QVariantMap>("mimeData");
|
|
QTest::addColumn<QStringList>("formats");
|
|
|
|
const QImage image(50, 50, QImage::Format_RGB32);
|
|
|
|
QTest::addRow("empty") << QVariantMap{} << QStringList{};
|
|
|
|
const auto makeMap = [](const QString &mime, const QVariant &value) {
|
|
QVariantMap map;
|
|
map[mime] = value;
|
|
return map;
|
|
};
|
|
|
|
QTest::addRow("text/plain, string")
|
|
<< makeMap("text/plain", QString("string"))
|
|
<< QStringList{"text/plain"};
|
|
QTest::addRow("valid charset")
|
|
<< makeMap("text/plain;charset=utf-16", QString("string"))
|
|
<< QStringList{"text/plain;charset=utf-16"};
|
|
QTest::addRow("image/png, image")
|
|
<< makeMap("image/png", image)
|
|
<< QStringList{"image/png"};
|
|
QTest::addRow("text/uri-list, string")
|
|
<< makeMap("text/uri-list", QString("https://qt-project.org"))
|
|
<< QStringList{"text/uri-list"};
|
|
QTest::addRow("text/uri-list, RFC2483 string")
|
|
<< makeMap("text/uri-list", QString("https://qt-project.org\r\nhttps://www.test.com"))
|
|
<< QStringList{"text/uri-list"};
|
|
QTest::addRow("text/uri-list, strings")
|
|
<< makeMap("text/uri-list", QStringList{"file://foo", "https://www.test.com"})
|
|
<< QStringList{"text/uri-list"};
|
|
QTest::addRow("text/uri-list, url")
|
|
<< makeMap("text/uri-list", QVariantList{QVariant(QUrl("file://foo"))})
|
|
<< QStringList{"text/uri-list"};
|
|
QTest::addRow("text/uri-list, variant")
|
|
<< makeMap("text/uri-list", QVariantList{QVariant("file://foo")})
|
|
<< QStringList{"text/uri-list"};
|
|
QTest::addRow("application/json")
|
|
<< makeMap("application/json", "{}")
|
|
<< QStringList{"application/json"};
|
|
QTest::addRow("missing charset")
|
|
<< makeMap("text/plain;charset=", QString("foo"))
|
|
<< QStringList{};
|
|
QTest::addRow("invalid charset")
|
|
<< makeMap("text/plain;charset=ugh4", QString("ugh4"))
|
|
<< QStringList{};
|
|
QTest::addRow("mismatch compat")
|
|
<< makeMap("text/plain", image)
|
|
<< QStringList{"text/plain"};
|
|
QTest::addRow("mismatch list")
|
|
<< makeMap("text/uri-list", QVariantList{image})
|
|
<< QStringList{};
|
|
}
|
|
|
|
void tst_QQuickDragAttached::setMimeData()
|
|
{
|
|
QFETCH(QVariantMap, mimeData);
|
|
|
|
QQuickDragAttached attached(nullptr);
|
|
QSignalSpy spy(&attached, &QQuickDragAttached::mimeDataChanged);
|
|
|
|
attached.setMimeData(mimeData);
|
|
int expectedCount = mimeData.isEmpty() ? 0 : 1;
|
|
QCOMPARE(spy.count(), expectedCount);
|
|
|
|
QCOMPARE(attached.mimeData(), mimeData);
|
|
|
|
attached.setMimeData(mimeData);
|
|
QCOMPARE(spy.count(), expectedCount);
|
|
|
|
expectedCount += mimeData.isEmpty() ? 0 : 1;
|
|
attached.setMimeData({});
|
|
QCOMPARE(spy.count(), expectedCount);
|
|
}
|
|
|
|
void tst_QQuickDragAttached::imageSourceSize_data()
|
|
{
|
|
QTest::addColumn<bool>("sizeFirst");
|
|
QTest::addColumn<QSize>("imageSourceSize");
|
|
QTest::addColumn<QSize>("expectedSourceSize");
|
|
QTest::addColumn<QSize>("expectedImageSize");
|
|
|
|
QTest::addRow("default size") << false << QSize() << QSize(462, 339) << QSize(462, 339);
|
|
QTest::addRow("shrunken elongated") << false << QSize(214, 114) << QSize(214, 114) << QSize(214, 114);
|
|
QTest::addRow("width, neg height") << false << QSize(154, -1) << QSize(154, 339) << QSize(154, 339);
|
|
QTest::addRow("width, zero height") << false << QSize(154, 0) << QSize(154, 0) << QSize(154, 113);
|
|
|
|
QTest::addRow("size first: default size") << true << QSize() << QSize(462, 339) << QSize(462, 339);
|
|
QTest::addRow("size first: shrunken elongated") << true << QSize(214, 114) << QSize(214, 114) << QSize(214, 114);
|
|
QTest::addRow("size first: width, neg height") << true << QSize(154, -1) << QSize(154, 339) << QSize(462, 339);
|
|
QTest::addRow("size first: width, zero height") << true << QSize(154, 0) << QSize(154, 0) << QSize(154, 113);
|
|
}
|
|
|
|
void tst_QQuickDragAttached::imageSourceSize()
|
|
{
|
|
QFETCH(bool, sizeFirst);
|
|
QFETCH(QSize, imageSourceSize);
|
|
QFETCH(QSize, expectedSourceSize);
|
|
QFETCH(QSize, expectedImageSize);
|
|
|
|
QQuickDragAttached attached(nullptr);
|
|
QSignalSpy spy(&attached, &QQuickDragAttached::imageSourceSizeChanged);
|
|
|
|
if (sizeFirst)
|
|
attached.setImageSourceSize(imageSourceSize);
|
|
attached.setImageSource(testFileUrl("qt_logo.svg"));
|
|
attached.setImageSourceSize(imageSourceSize);
|
|
|
|
const int expectedCount = imageSourceSize.width() >= 0 || imageSourceSize.height() >= 0 ? 1 : 0;
|
|
QCOMPARE(spy.count(), expectedCount);
|
|
QCOMPARE(attached.imageSourceSize(), expectedSourceSize);
|
|
QCOMPARE(QQuickDragAttachedPrivate::get(&attached)->pixmapLoader.image().size(), expectedImageSize);
|
|
}
|
|
|
|
void tst_QQuickDragAttached::startDrag_data()
|
|
{
|
|
setMimeData_data();
|
|
}
|
|
|
|
void tst_QQuickDragAttached::startDrag()
|
|
{
|
|
#ifdef QT_BUILD_INTERNAL
|
|
QFETCH(QVariantMap, mimeData);
|
|
QFETCH(QStringList, formats);
|
|
|
|
QQuickDragAttached attached(nullptr);
|
|
attached.setMimeData(mimeData);
|
|
|
|
auto *d = static_cast<QQuickDragAttachedPrivate *>(QObjectPrivate::get(&attached));
|
|
|
|
if (formats.isEmpty()) {
|
|
if (!mimeData.isEmpty())
|
|
QTest::ignoreMessage(QtWarningMsg, QRegularExpression(".*QML QQuickDragAttached:.*"));
|
|
else
|
|
QTest::failOnWarning(QRegularExpression(".*"));
|
|
}
|
|
std::unique_ptr<QMimeData> data(d->createMimeData());
|
|
QVERIFY(data);
|
|
|
|
auto debugHelper = qScopeGuard([&data]{
|
|
qWarning() << data->formats();
|
|
});
|
|
QCOMPARE(data->formats(), formats);
|
|
debugHelper.dismiss();
|
|
#else
|
|
QSKIP("This test relies on private APIs that are only exported in developer-builds");
|
|
#endif
|
|
}
|
|
|
|
QTEST_MAIN(tst_QQuickDragAttached)
|
|
|
|
#include "tst_qquickdragattached.moc"
|