e3640d1bdd
These comments were mostly empty or inaccurate. Appropriate naming of tests and appropriate placement of tests within the directory tree provide more reliable indicators of what is being tested. Change-Id: Ib6bf373d9e79917e4ab1417ee5c1264a2c2d7027 Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com>
332 lines
11 KiB
C++
332 lines
11 KiB
C++
/****************************************************************************
|
|
**
|
|
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
|
** All rights reserved.
|
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
|
**
|
|
** This file is part of the test suite of the Qt Toolkit.
|
|
**
|
|
** $QT_BEGIN_LICENSE:LGPL$
|
|
** GNU Lesser General Public License Usage
|
|
** This file may be used under the terms of the GNU Lesser General Public
|
|
** License version 2.1 as published by the Free Software Foundation and
|
|
** appearing in the file LICENSE.LGPL included in the packaging of this
|
|
** file. Please review the following information to ensure the GNU Lesser
|
|
** General Public License version 2.1 requirements will be met:
|
|
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
**
|
|
** In addition, as a special exception, Nokia gives you certain additional
|
|
** rights. These rights are described in the Nokia Qt LGPL Exception
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
**
|
|
** GNU General Public License Usage
|
|
** Alternatively, this file may be used under the terms of the GNU General
|
|
** Public License version 3.0 as published by the Free Software Foundation
|
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
|
** file. Please review the following information to ensure the GNU General
|
|
** Public License version 3.0 requirements will be met:
|
|
** http://www.gnu.org/copyleft/gpl.html.
|
|
**
|
|
** Other Usage
|
|
** Alternatively, this file may be used in accordance with the terms and
|
|
** conditions contained in a signed written agreement between you and Nokia.
|
|
**
|
|
**
|
|
**
|
|
**
|
|
**
|
|
** $QT_END_LICENSE$
|
|
**
|
|
****************************************************************************/
|
|
|
|
|
|
#include <QtTest/QtTest>
|
|
#include <QtCore/QDebug>
|
|
#include <QtWidgets/QApplication>
|
|
#include <QtGui/QClipboard>
|
|
#ifdef Q_WS_MAC
|
|
#include <Carbon/Carbon.h>
|
|
#endif
|
|
|
|
class tst_QClipboard : public QObject
|
|
{
|
|
Q_OBJECT
|
|
private slots:
|
|
void copy_exit_paste();
|
|
void capabiliyFunctions();
|
|
void modes();
|
|
void testSignals();
|
|
void setMimeData();
|
|
void clearBeforeSetText();
|
|
|
|
private:
|
|
bool nativeClipboardWorking();
|
|
};
|
|
|
|
|
|
bool tst_QClipboard::nativeClipboardWorking()
|
|
{
|
|
#ifdef Q_WS_MAC
|
|
PasteboardRef pasteboard;
|
|
OSStatus status = PasteboardCreate(0, &pasteboard);
|
|
if (status == noErr)
|
|
CFRelease(pasteboard);
|
|
return status == noErr;
|
|
#endif
|
|
return true;
|
|
}
|
|
|
|
Q_DECLARE_METATYPE(QClipboard::Mode)
|
|
|
|
/*
|
|
Tests that the capability functions are implemented on all
|
|
platforms.
|
|
*/
|
|
void tst_QClipboard::capabiliyFunctions()
|
|
{
|
|
QClipboard * const clipboard = QApplication::clipboard();
|
|
|
|
clipboard->supportsSelection();
|
|
clipboard->supportsFindBuffer();
|
|
clipboard->ownsSelection();
|
|
clipboard->ownsClipboard();
|
|
clipboard->ownsFindBuffer();
|
|
}
|
|
|
|
/*
|
|
Test that text inserted into the clipboard in different modes is
|
|
kept separate.
|
|
*/
|
|
void tst_QClipboard::modes()
|
|
{
|
|
QClipboard * const clipboard = QApplication::clipboard();
|
|
|
|
if (!nativeClipboardWorking())
|
|
QSKIP("Native clipboard not working in this setup");
|
|
|
|
const QString defaultMode = "default mode text;";
|
|
clipboard->setText(defaultMode);
|
|
QCOMPARE(clipboard->text(), defaultMode);
|
|
|
|
if (clipboard->supportsSelection()) {
|
|
const QString selectionMode = "selection mode text";
|
|
clipboard->setText(selectionMode, QClipboard::Selection);
|
|
QCOMPARE(clipboard->text(QClipboard::Selection), selectionMode);
|
|
QCOMPARE(clipboard->text(), defaultMode);
|
|
}
|
|
|
|
if (clipboard->supportsFindBuffer()) {
|
|
const QString searchMode = "find mode text";
|
|
clipboard->setText(searchMode, QClipboard::FindBuffer);
|
|
QCOMPARE(clipboard->text(QClipboard::FindBuffer), searchMode);
|
|
QCOMPARE(clipboard->text(), defaultMode);
|
|
}
|
|
}
|
|
|
|
/*
|
|
Test that the appropriate signals are emitted when the cliboard
|
|
contents is changed by calling the qt functions.
|
|
*/
|
|
void tst_QClipboard::testSignals()
|
|
{
|
|
qRegisterMetaType<QClipboard::Mode>("QClipboard::Mode");
|
|
|
|
if (!nativeClipboardWorking())
|
|
QSKIP("Native clipboard not working in this setup");
|
|
|
|
QClipboard * const clipboard = QApplication::clipboard();
|
|
|
|
QSignalSpy changedSpy(clipboard, SIGNAL(changed(QClipboard::Mode)));
|
|
QSignalSpy dataChangedSpy(clipboard, SIGNAL(dataChanged()));
|
|
QSignalSpy searchChangedSpy(clipboard, SIGNAL(findBufferChanged()));
|
|
QSignalSpy selectionChangedSpy(clipboard, SIGNAL(selectionChanged()));
|
|
|
|
const QString text = "clipboard text;";
|
|
|
|
// Test the default mode signal.
|
|
clipboard->setText(text);
|
|
QCOMPARE(dataChangedSpy.count(), 1);
|
|
QCOMPARE(searchChangedSpy.count(), 0);
|
|
QCOMPARE(selectionChangedSpy.count(), 0);
|
|
QCOMPARE(changedSpy.count(), 1);
|
|
QCOMPARE(changedSpy.at(0).count(), 1);
|
|
QCOMPARE(qVariantValue<QClipboard::Mode>(changedSpy.at(0).at(0)), QClipboard::Clipboard);
|
|
|
|
changedSpy.clear();
|
|
|
|
// Test the selection mode signal.
|
|
if (clipboard->supportsSelection()) {
|
|
clipboard->setText(text, QClipboard::Selection);
|
|
QCOMPARE(selectionChangedSpy.count(), 1);
|
|
QCOMPARE(changedSpy.count(), 1);
|
|
QCOMPARE(changedSpy.at(0).count(), 1);
|
|
QCOMPARE(qVariantValue<QClipboard::Mode>(changedSpy.at(0).at(0)), QClipboard::Selection);
|
|
} else {
|
|
QCOMPARE(selectionChangedSpy.count(), 0);
|
|
}
|
|
QCOMPARE(dataChangedSpy.count(), 1);
|
|
QCOMPARE(searchChangedSpy.count(), 0);
|
|
|
|
changedSpy.clear();
|
|
|
|
// Test the search mode signal.
|
|
if (clipboard->supportsFindBuffer()) {
|
|
clipboard->setText(text, QClipboard::FindBuffer);
|
|
QCOMPARE(searchChangedSpy.count(), 1);
|
|
QCOMPARE(changedSpy.count(), 1);
|
|
QCOMPARE(changedSpy.at(0).count(), 1);
|
|
QCOMPARE(qVariantValue<QClipboard::Mode>(changedSpy.at(0).at(0)), QClipboard::FindBuffer);
|
|
} else {
|
|
QCOMPARE(searchChangedSpy.count(), 0);
|
|
}
|
|
QCOMPARE(dataChangedSpy.count(), 1);
|
|
}
|
|
|
|
// Test that pasted text remains on the clipboard after a Qt application exits.
|
|
void tst_QClipboard::copy_exit_paste()
|
|
{
|
|
#ifndef QT_NO_PROCESS
|
|
#if !defined(Q_OS_WIN) && !defined(Q_OS_MAC)
|
|
QSKIP("This test does not make sense on X11 and embedded, copied data disappears from the clipboard when the application exits ");
|
|
// ### It's still possible to test copy/paste - just keep the apps running
|
|
#endif
|
|
if (!nativeClipboardWorking())
|
|
QSKIP("Native clipboard not working in this setup");
|
|
const QStringList stringArgument = QStringList() << "Test string.";
|
|
QCOMPARE(QProcess::execute("copier/copier", stringArgument), 0);
|
|
#ifdef Q_OS_MAC
|
|
// The Pasteboard needs a moment to breathe (at least on older Macs).
|
|
QTest::qWait(100);
|
|
#endif
|
|
QCOMPARE(QProcess::execute("paster/paster", stringArgument), 0);
|
|
#endif
|
|
}
|
|
|
|
void tst_QClipboard::setMimeData()
|
|
{
|
|
if (!nativeClipboardWorking())
|
|
QSKIP("Native clipboard not working in this setup");
|
|
QMimeData *mimeData = new QMimeData;
|
|
const QString TestName(QLatin1String("tst_QClipboard::setMimeData() mimeData"));
|
|
mimeData->setObjectName(TestName);
|
|
#if defined(Q_OS_WINCE)
|
|
// need to set text on CE
|
|
mimeData->setText(QLatin1String("Qt/CE foo"));
|
|
#endif
|
|
|
|
QApplication::clipboard()->setMimeData(mimeData);
|
|
QCOMPARE(QApplication::clipboard()->mimeData(), (const QMimeData *)mimeData);
|
|
QCOMPARE(QApplication::clipboard()->mimeData()->objectName(), TestName);
|
|
|
|
// set it to the same data again, it shouldn't delete mimeData (and crash as a result)
|
|
QApplication::clipboard()->setMimeData(mimeData);
|
|
QCOMPARE(QApplication::clipboard()->mimeData(), (const QMimeData *)mimeData);
|
|
QCOMPARE(QApplication::clipboard()->mimeData()->objectName(), TestName);
|
|
QApplication::clipboard()->clear();
|
|
const QMimeData *appMimeData = QApplication::clipboard()->mimeData();
|
|
QVERIFY(appMimeData != mimeData || appMimeData->objectName() != TestName);
|
|
|
|
// check for crash when using the same mimedata object on several clipboards
|
|
QMimeData *data = new QMimeData;
|
|
data->setText("foo");
|
|
|
|
QApplication::clipboard()->setMimeData(data, QClipboard::Clipboard);
|
|
QApplication::clipboard()->setMimeData(data, QClipboard::Selection);
|
|
QApplication::clipboard()->setMimeData(data, QClipboard::FindBuffer);
|
|
|
|
QSignalSpy spySelection(QApplication::clipboard(), SIGNAL(selectionChanged()));
|
|
QSignalSpy spyData(QApplication::clipboard(), SIGNAL(dataChanged()));
|
|
QSignalSpy spyFindBuffer(QApplication::clipboard(), SIGNAL(findBufferChanged()));
|
|
|
|
QApplication::clipboard()->clear(QClipboard::Clipboard);
|
|
QApplication::clipboard()->clear(QClipboard::Selection); // used to crash on X11
|
|
QApplication::clipboard()->clear(QClipboard::FindBuffer);
|
|
|
|
#if defined(Q_WS_X11)
|
|
QCOMPARE(spySelection.count(), 1);
|
|
QCOMPARE(spyData.count(), 1);
|
|
QCOMPARE(spyFindBuffer.count(), 0);
|
|
#elif defined(Q_WS_MAC)
|
|
QCOMPARE(spySelection.count(), 0);
|
|
QCOMPARE(spyData.count(), 1);
|
|
QCOMPARE(spyFindBuffer.count(), 1);
|
|
#elif defined(Q_WS_WIN)
|
|
QCOMPARE(spySelection.count(), 0);
|
|
QCOMPARE(spyData.count(), 1);
|
|
QCOMPARE(spyFindBuffer.count(), 0);
|
|
#endif
|
|
|
|
// an other crash test
|
|
data = new QMimeData;
|
|
data->setText("foo");
|
|
|
|
QApplication::clipboard()->setMimeData(data, QClipboard::Clipboard);
|
|
QApplication::clipboard()->setMimeData(data, QClipboard::Selection);
|
|
QApplication::clipboard()->setMimeData(data, QClipboard::FindBuffer);
|
|
|
|
QMimeData *newData = new QMimeData;
|
|
newData->setText("bar");
|
|
|
|
spySelection.clear();
|
|
spyData.clear();
|
|
spyFindBuffer.clear();
|
|
|
|
QApplication::clipboard()->setMimeData(newData, QClipboard::Clipboard);
|
|
QApplication::clipboard()->setMimeData(newData, QClipboard::Selection); // used to crash on X11
|
|
QApplication::clipboard()->setMimeData(newData, QClipboard::FindBuffer);
|
|
|
|
#if defined(Q_WS_X11)
|
|
QCOMPARE(spySelection.count(), 1);
|
|
QCOMPARE(spyData.count(), 1);
|
|
QCOMPARE(spyFindBuffer.count(), 0);
|
|
#elif defined(Q_WS_MAC)
|
|
QCOMPARE(spySelection.count(), 0);
|
|
QCOMPARE(spyData.count(), 1);
|
|
QCOMPARE(spyFindBuffer.count(), 1);
|
|
#elif defined(Q_WS_WIN)
|
|
QCOMPARE(spySelection.count(), 0);
|
|
QCOMPARE(spyData.count(), 1);
|
|
QCOMPARE(spyFindBuffer.count(), 0);
|
|
#endif
|
|
}
|
|
|
|
void tst_QClipboard::clearBeforeSetText()
|
|
{
|
|
QApplication::processEvents();
|
|
|
|
if (!nativeClipboardWorking())
|
|
QSKIP("Native clipboard not working in this setup");
|
|
|
|
const QString text = "tst_QClipboard::clearBeforeSetText()";
|
|
|
|
// setText() should work after processEvents()
|
|
QApplication::clipboard()->setText(text);
|
|
QCOMPARE(QApplication::clipboard()->text(), text);
|
|
QApplication::processEvents();
|
|
QCOMPARE(QApplication::clipboard()->text(), text);
|
|
|
|
// same with clear()
|
|
QApplication::clipboard()->clear();
|
|
QVERIFY(QApplication::clipboard()->text().isEmpty());
|
|
QApplication::processEvents();
|
|
QVERIFY(QApplication::clipboard()->text().isEmpty());
|
|
|
|
// setText() again
|
|
QApplication::clipboard()->setText(text);
|
|
QCOMPARE(QApplication::clipboard()->text(), text);
|
|
QApplication::processEvents();
|
|
QCOMPARE(QApplication::clipboard()->text(), text);
|
|
|
|
// clear() immediately followed by setText() should still return the text
|
|
QApplication::clipboard()->clear();
|
|
QVERIFY(QApplication::clipboard()->text().isEmpty());
|
|
QApplication::clipboard()->setText(text);
|
|
QCOMPARE(QApplication::clipboard()->text(), text);
|
|
QApplication::processEvents();
|
|
QCOMPARE(QApplication::clipboard()->text(), text);
|
|
}
|
|
|
|
QTEST_MAIN(tst_QClipboard)
|
|
|
|
#include "tst_qclipboard.moc"
|