qt5base-lts/tests/auto/qworkspace/tst_qworkspace.cpp
Qt by Nokia 38be0d1383 Initial import from the monolithic Qt.
This is the beginning of revision history for this module. If you
want to look at revision history older than this, please refer to the
Qt Git wiki for how to use Git history grafting. At the time of
writing, this wiki is located here:

http://qt.gitorious.org/qt/pages/GitIntroductionWithQt

If you have already performed the grafting and you don't see any
history beyond this commit, try running "git log" with the "--follow"
argument.

Branched from the monolithic repo, Qt master branch, at commit
896db169ea224deb96c59ce8af800d019de63f12
2011-04-27 12:05:43 +02:00

738 lines
20 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$
** No Commercial Usage
** This file contains pre-release code and may not be distributed.
** You may use this file in accordance with the terms and conditions
** contained in the Technology Preview License Agreement accompanying
** this package.
**
** GNU Lesser General Public License Usage
** Alternatively, 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.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtTest/QtTest>
#include <qapplication.h>
#include <qmainwindow.h>
#include <qmenubar.h>
#include <qworkspace.h>
#if defined(QT3_SUPPORT)
#include <q3popupmenu.h>
#include <q3accel.h>
#endif
//TESTED_CLASS=
//TESTED_FILES=
class tst_QWorkspace : public QObject
{
Q_OBJECT
public:
tst_QWorkspace();
virtual ~tst_QWorkspace();
protected slots:
void activeChanged( QWidget *w );
void accelActivated();
public slots:
void initTestCase();
void cleanupTestCase();
void init();
void cleanup();
private slots:
void getSetCheck();
void windowActivated_data();
void windowActivated();
void accelPropagation();
void windowActivatedWithMinimize();
void showWindows();
void changeWindowTitle();
void changeModified();
void childSize();
void fixedSize();
#if defined(Q_WS_WIN) || defined(Q_WS_X11)
void nativeSubWindows();
#endif
void task206368();
private:
QWidget *activeWidget;
bool accelPressed;
};
// Testing get/set functions
void tst_QWorkspace::getSetCheck()
{
QWorkspace obj1;
// bool QWorkspace::scrollBarsEnabled()
// void QWorkspace::setScrollBarsEnabled(bool)
obj1.setScrollBarsEnabled(false);
QCOMPARE(false, obj1.scrollBarsEnabled());
obj1.setScrollBarsEnabled(true);
QCOMPARE(true, obj1.scrollBarsEnabled());
}
tst_QWorkspace::tst_QWorkspace()
: activeWidget( 0 )
{
}
tst_QWorkspace::~tst_QWorkspace()
{
}
// initTestCase will be executed once before the first testfunction is executed.
void tst_QWorkspace::initTestCase()
{
}
// cleanupTestCase will be executed once after the last testfunction is executed.
void tst_QWorkspace::cleanupTestCase()
{
}
// init() will be executed immediately before each testfunction is run.
void tst_QWorkspace::init()
{
// TODO: Add testfunction specific initialization code here.
}
// cleanup() will be executed immediately after each testfunction is run.
void tst_QWorkspace::cleanup()
{
// TODO: Add testfunction specific cleanup code here.
}
void tst_QWorkspace::activeChanged( QWidget *w )
{
activeWidget = w;
}
void tst_QWorkspace::windowActivated_data()
{
// define the test elements we're going to use
QTest::addColumn<int>("count");
// create a first testdata instance and fill it with data
QTest::newRow( "data0" ) << 0;
QTest::newRow( "data1" ) << 1;
QTest::newRow( "data2" ) << 2;
}
void tst_QWorkspace::windowActivated()
{
QMainWindow mw(0, Qt::X11BypassWindowManagerHint);
mw.menuBar();
QWorkspace *workspace = new QWorkspace(&mw);
workspace->setObjectName("testWidget");
mw.setCentralWidget(workspace);
QSignalSpy spy(workspace, SIGNAL(windowActivated(QWidget*)));
connect( workspace, SIGNAL(windowActivated(QWidget*)), this, SLOT(activeChanged(QWidget*)) );
mw.show();
qApp->setActiveWindow(&mw);
QFETCH( int, count );
int i;
for ( i = 0; i < count; ++i ) {
QWidget *widget = new QWidget(workspace, 0);
widget->setAttribute(Qt::WA_DeleteOnClose);
workspace->addWindow(widget);
widget->show();
qApp->processEvents();
QVERIFY( activeWidget == workspace->activeWindow() );
QCOMPARE(spy.count(), 1);
spy.clear();
}
QWidgetList windows = workspace->windowList();
QCOMPARE( (int)windows.count(), count );
for ( i = 0; i < count; ++i ) {
QWidget *window = windows.at(i);
window->showMinimized();
qApp->processEvents();
QVERIFY( activeWidget == workspace->activeWindow() );
if ( i == 1 )
QVERIFY( activeWidget == window );
}
for ( i = 0; i < count; ++i ) {
QWidget *window = windows.at(i);
window->showNormal();
qApp->processEvents();
QVERIFY( window == activeWidget );
QVERIFY( activeWidget == workspace->activeWindow() );
}
spy.clear();
while ( workspace->activeWindow() ) {
workspace->activeWindow()->close();
qApp->processEvents();
QVERIFY( activeWidget == workspace->activeWindow() );
QCOMPARE(spy.count(), 1);
spy.clear();
}
QVERIFY(activeWidget == 0);
QVERIFY(workspace->activeWindow() == 0);
QVERIFY(workspace->windowList().count() == 0);
{
workspace->hide();
QWidget *widget = new QWidget(workspace);
widget->setObjectName("normal");
widget->setAttribute(Qt::WA_DeleteOnClose);
workspace->addWindow(widget);
widget->show();
QCOMPARE(spy.count(), 0);
workspace->show();
QCOMPARE(spy.count(), 1);
spy.clear();
QVERIFY( activeWidget == widget );
widget->close();
qApp->processEvents();
QCOMPARE(spy.count(), 1);
spy.clear();
QVERIFY( activeWidget == 0 );
}
{
workspace->hide();
QWidget *widget = new QWidget(workspace);
widget->setObjectName("maximized");
widget->setAttribute(Qt::WA_DeleteOnClose);
workspace->addWindow(widget);
widget->showMaximized();
qApp->sendPostedEvents();
#ifdef Q_WS_MAC
QEXPECT_FAIL("", "This test has never passed on Mac. QWorkspace is obsoleted -> won't fix", Abort);
#endif
QCOMPARE(spy.count(), 0);
spy.clear();
workspace->show();
QCOMPARE(spy.count(), 1);
spy.clear();
QVERIFY( activeWidget == widget );
widget->close();
qApp->processEvents();
QCOMPARE(spy.count(), 1);
spy.clear();
QVERIFY( activeWidget == 0 );
}
{
QWidget *widget = new QWidget(workspace);
widget->setObjectName("minimized");
widget->setAttribute(Qt::WA_DeleteOnClose);
workspace->addWindow(widget);
widget->showMinimized();
QCOMPARE(spy.count(), 1);
spy.clear();
QVERIFY( activeWidget == widget );
QVERIFY(workspace->activeWindow() == widget);
widget->close();
qApp->processEvents();
QCOMPARE(spy.count(), 1);
spy.clear();
QVERIFY(workspace->activeWindow() == 0);
QVERIFY( activeWidget == 0 );
}
}
void tst_QWorkspace::windowActivatedWithMinimize()
{
QMainWindow mw(0, Qt::X11BypassWindowManagerHint) ;
mw.menuBar();
QWorkspace *workspace = new QWorkspace(&mw);
workspace->setObjectName("testWidget");
mw.setCentralWidget(workspace);
QSignalSpy spy(workspace, SIGNAL(windowActivated(QWidget*)));
connect( workspace, SIGNAL(windowActivated(QWidget*)), this, SLOT(activeChanged(QWidget*)) );
mw.show();
qApp->setActiveWindow(&mw);
QWidget *widget = new QWidget(workspace);
widget->setObjectName("minimized1");
widget->setAttribute(Qt::WA_DeleteOnClose);
workspace->addWindow(widget);
QWidget *widget2 = new QWidget(workspace);
widget2->setObjectName("minimized2");
widget2->setAttribute(Qt::WA_DeleteOnClose);
workspace->addWindow(widget2);
widget->showMinimized();
QVERIFY( activeWidget == widget );
widget2->showMinimized();
QVERIFY( activeWidget == widget2 );
widget2->close();
qApp->processEvents();
QVERIFY( activeWidget == widget );
widget->close();
qApp->processEvents();
QVERIFY(workspace->activeWindow() == 0);
QVERIFY( activeWidget == 0 );
QVERIFY( workspace->windowList().count() == 0 );
}
void tst_QWorkspace::accelActivated()
{
accelPressed = TRUE;
}
void tst_QWorkspace::accelPropagation()
{
#if defined (QT3_SUPPORT)
QSKIP( "Until QTest::keyPress() sends the events via the OS, this will skip", SkipAll);
// See #13987 for details of bug report related to this
QMainWindow mw(0, Qt::X11BypassWindowManagerHint) ;
mw.menuBar();
QWorkspace *workspace = new QWorkspace(&mw);
workspace->setObjectName("testWidget");
mw.setCentralWidget(workspace);
connect( workspace, SIGNAL(windowActivated(QWidget*)), this, SLOT(activeChanged(QWidget*)) );
mw.show();
qApp->setActiveWindow(&mw);
QMainWindow* mainWindow = new QMainWindow( workspace );
// The popup menu has to have no parent, this is vital in the
// original case of reproducing the bug
Q3PopupMenu* popup = new Q3PopupMenu;
popup->insertItem("First");
mainWindow->menuBar()->insertItem("Menu", popup);
Q3Accel* accel = new Q3Accel(mainWindow);
accel->connectItem(accel->insertItem(Qt::Key_Escape), this, SLOT(accelActivated()) );
mainWindow->show();
QTest::keyPress( mainWindow, Qt::Key_Escape );
QVERIFY( accelPressed );
accelPressed = FALSE;
QTest::mousePress( mainWindow->menuBar(), Qt::LeftButton, 0, QPoint( 5, 5 ) );
// Check the popup menu did appear to be sure
QVERIFY( qApp->activePopupWidget() == popup );
QTest::mouseClick( popup, Qt::LeftButton, 0, QPoint( 5, 25 ) );
// Check we did actually cause the popup menu to be closed
QVERIFY( !popup->isVisible() );
// Now we check that the accelarator still works
QTest::keyPress( mainWindow, Qt::Key_Escape );
QVERIFY( accelPressed );
delete popup;
#else
QSKIP( "No Qt3Support. Skipping.", SkipAll);
#endif
}
void tst_QWorkspace::showWindows()
{
QWorkspace *ws = new QWorkspace( 0 );
QWidget *widget = 0;
ws->show();
widget = new QWidget(ws);
widget->setObjectName("plain1");
widget->show();
QVERIFY( widget->isVisible() );
widget = new QWidget(ws);
widget->setObjectName("maximized1");
widget->showMaximized();
QVERIFY( widget->isMaximized() );
widget->showNormal();
QVERIFY( !widget->isMaximized() );
widget = new QWidget(ws);
widget->setObjectName("minimized1");
widget->showMinimized();
QVERIFY( widget->isMinimized() );
widget->showNormal();
QVERIFY( !widget->isMinimized() );
ws->hide();
widget = new QWidget(ws);
widget->setObjectName("plain2");
ws->show();
QVERIFY( widget->isVisible() );
ws->hide();
widget = new QWidget(ws);
widget->setObjectName("maximized2");
widget->showMaximized();
QVERIFY( widget->isMaximized() );
ws->show();
QVERIFY( widget->isVisible() );
QVERIFY( widget->isMaximized() );
ws->hide();
widget = new QWidget(ws);
widget->setObjectName("minimized2");
widget->showMinimized();
ws->show();
QVERIFY( widget->isMinimized() );
ws->hide();
delete ws;
}
//#define USE_SHOW
void tst_QWorkspace::changeWindowTitle()
{
#ifdef Q_OS_WINCE
QSKIP( "Test fails on Windows CE due to QWorkspace state handling", SkipAll);
#endif
const QString mwc( "MainWindow's Caption" );
const QString mwc2( "MainWindow's New Caption" );
const QString wc( "Widget's Caption" );
const QString wc2( "Widget's New Caption" );
QMainWindow *mw = new QMainWindow(0, Qt::X11BypassWindowManagerHint);
mw->setWindowTitle( mwc );
QWorkspace *ws = new QWorkspace( mw );
mw->setCentralWidget( ws );
QWidget *widget = new QWidget( ws );
widget->setWindowTitle( wc );
ws->addWindow(widget);
QCOMPARE( mw->windowTitle(), mwc );
#ifdef USE_SHOW
widget->showMaximized();
#else
widget->setWindowState(Qt::WindowMaximized);
#endif
QCOMPARE( mw->windowTitle(), QString("%1 - [%2]").arg(mwc).arg(wc) );
#ifdef USE_SHOW
widget->showNormal();
#else
widget->setWindowState(Qt::WindowNoState);
#endif
qApp->processEvents();
QCOMPARE( mw->windowTitle(), mwc );
#ifdef USE_SHOW
widget->showMaximized();
#else
widget->setWindowState(Qt::WindowMaximized);
#endif
qApp->processEvents();
QCOMPARE( mw->windowTitle(), QString("%1 - [%2]").arg(mwc).arg(wc) );
widget->setWindowTitle( wc2 );
QCOMPARE( mw->windowTitle(), QString("%1 - [%2]").arg(mwc).arg(wc2) );
mw->setWindowTitle( mwc2 );
QCOMPARE( mw->windowTitle(), QString("%1 - [%2]").arg(mwc2).arg(wc2) );
mw->show();
qApp->setActiveWindow(mw);
#ifdef USE_SHOW
mw->showFullScreen();
#else
mw->setWindowState(Qt::WindowFullScreen);
#endif
qApp->processEvents();
QCOMPARE( mw->windowTitle(), QString("%1 - [%2]").arg(mwc2).arg(wc2) );
#ifdef USE_SHOW
widget->showNormal();
#else
widget->setWindowState(Qt::WindowNoState);
#endif
qApp->processEvents();
QCOMPARE( mw->windowTitle(), mwc2 );
#ifdef USE_SHOW
widget->showMaximized();
#else
widget->setWindowState(Qt::WindowMaximized);
#endif
qApp->processEvents();
QCOMPARE( mw->windowTitle(), QString("%1 - [%2]").arg(mwc2).arg(wc2) );
#ifdef USE_SHOW
mw->showNormal();
#else
mw->setWindowState(Qt::WindowNoState);
#endif
qApp->processEvents();
QCOMPARE( mw->windowTitle(), QString("%1 - [%2]").arg(mwc2).arg(wc2) );
#ifdef USE_SHOW
widget->showNormal();
#else
widget->setWindowState(Qt::WindowNoState);
#endif
QCOMPARE( mw->windowTitle(), mwc2 );
delete mw;
}
void tst_QWorkspace::changeModified()
{
const QString mwc( "MainWindow's Caption" );
const QString wc( "Widget's Caption[*]" );
QMainWindow *mw = new QMainWindow(0, Qt::X11BypassWindowManagerHint);
mw->setWindowTitle( mwc );
QWorkspace *ws = new QWorkspace( mw );
mw->setCentralWidget( ws );
QWidget *widget = new QWidget( ws );
widget->setWindowTitle( wc );
ws->addWindow(widget);
QCOMPARE( mw->isWindowModified(), false);
QCOMPARE( widget->isWindowModified(), false);
widget->setWindowState(Qt::WindowMaximized);
QCOMPARE( mw->isWindowModified(), false);
QCOMPARE( widget->isWindowModified(), false);
widget->setWindowState(Qt::WindowNoState);
QCOMPARE( mw->isWindowModified(), false);
QCOMPARE( widget->isWindowModified(), false);
widget->setWindowModified(true);
QCOMPARE( mw->isWindowModified(), false);
QCOMPARE( widget->isWindowModified(), true);
widget->setWindowState(Qt::WindowMaximized);
QCOMPARE( mw->isWindowModified(), true);
QCOMPARE( widget->isWindowModified(), true);
widget->setWindowState(Qt::WindowNoState);
QCOMPARE( mw->isWindowModified(), false);
QCOMPARE( widget->isWindowModified(), true);
widget->setWindowState(Qt::WindowMaximized);
QCOMPARE( mw->isWindowModified(), true);
QCOMPARE( widget->isWindowModified(), true);
widget->setWindowModified(false);
QCOMPARE( mw->isWindowModified(), false);
QCOMPARE( widget->isWindowModified(), false);
widget->setWindowModified(true);
QCOMPARE( mw->isWindowModified(), true);
QCOMPARE( widget->isWindowModified(), true);
widget->setWindowState(Qt::WindowNoState);
QCOMPARE( mw->isWindowModified(), false);
QCOMPARE( widget->isWindowModified(), true);
delete mw;
}
class MyChild : public QWidget
{
public:
MyChild(QWidget *parent = 0, Qt::WFlags f = 0)
: QWidget(parent, f)
{
}
QSize sizeHint() const
{
return QSize(234, 123);
}
};
void tst_QWorkspace::childSize()
{
QWorkspace ws;
MyChild *child = new MyChild(&ws);
child->show();
QCOMPARE(child->size(), child->sizeHint());
delete child;
child = new MyChild(&ws);
child->setFixedSize(200, 200);
child->show();
QCOMPARE(child->size(), child->minimumSize());
delete child;
child = new MyChild(&ws);
child->resize(150, 150);
child->show();
QCOMPARE(child->size(), QSize(150,150));
delete child;
}
void tst_QWorkspace::fixedSize()
{
QWorkspace *ws = new QWorkspace;
int i;
ws->resize(500, 500);
// ws->show();
QSize fixed(300, 300);
for (i = 0; i < 4; ++i) {
QWidget *child = new QWidget(ws);
child->setFixedSize(fixed);
child->show();
}
QWidgetList windows = ws->windowList();
for (i = 0; i < (int)windows.count(); ++i) {
QWidget *child = windows.at(i);
QCOMPARE(child->size(), fixed);
QCOMPARE(child->visibleRegion().boundingRect().size(), fixed);
}
ws->cascade();
ws->resize(800, 800);
for (i = 0; i < (int)windows.count(); ++i) {
QWidget *child = windows.at(i);
QCOMPARE(child->size(), fixed);
QCOMPARE(child->visibleRegion().boundingRect().size(), fixed);
}
ws->resize(500, 500);
ws->tile();
ws->resize(800, 800);
for (i = 0; i < (int)windows.count(); ++i) {
QWidget *child = windows.at(i);
QCOMPARE(child->size(), fixed);
QCOMPARE(child->visibleRegion().boundingRect().size(), fixed);
}
ws->resize(500, 500);
for (i = 0; i < (int)windows.count(); ++i) {
QWidget *child = windows.at(i);
delete child;
}
delete ws;
}
#if defined(Q_WS_WIN) || defined(Q_WS_X11)
void tst_QWorkspace::nativeSubWindows()
{
{ // Add native widgets after show.
QWorkspace workspace;
workspace.addWindow(new QWidget);
workspace.addWindow(new QWidget);
workspace.show();
#ifdef Q_WS_X11
qt_x11_wait_for_window_manager(&workspace);
#endif
// No native widgets.
foreach (QWidget *subWindow, workspace.windowList())
QVERIFY(!subWindow->parentWidget()->internalWinId());
QWidget *nativeWidget = new QWidget;
QVERIFY(nativeWidget->winId()); // enforce native window.
workspace.addWindow(nativeWidget);
// All the sub-windows must be native.
foreach (QWidget *subWindow, workspace.windowList())
QVERIFY(subWindow->parentWidget()->internalWinId());
// Add a non-native widget. This should become native.
QWidget *subWindow = workspace.addWindow(new QWidget);
QVERIFY(subWindow->parentWidget()->internalWinId());
}
{ // Add native widgets before show.
QWorkspace workspace;
workspace.addWindow(new QWidget);
QWidget *nativeWidget = new QWidget;
(void)nativeWidget->winId();
workspace.addWindow(nativeWidget);
workspace.show();
#ifdef Q_WS_X11
qt_x11_wait_for_window_manager(&workspace);
#endif
// All the sub-windows must be native.
foreach (QWidget *subWindow, workspace.windowList())
QVERIFY(subWindow->parentWidget()->internalWinId());
}
{ // Make a sub-window native *after* it's added to the area.
QWorkspace workspace;
workspace.addWindow(new QWidget);
workspace.addWindow(new QWidget);
workspace.show();
#ifdef Q_WS_X11
qt_x11_wait_for_window_manager(&workspace);
#endif
QWidget *nativeSubWindow = workspace.windowList().last()->parentWidget();
QVERIFY(!nativeSubWindow->internalWinId());
(void)nativeSubWindow->winId();
// All the sub-windows should be native at this point.
foreach (QWidget *subWindow, workspace.windowList())
QVERIFY(subWindow->parentWidget()->internalWinId());
}
}
#endif
void tst_QWorkspace::task206368()
{
// Make sure the internal list of iconified windows doesn't contain dangling pointers.
QWorkspace workspace;
QWidget *child = new QWidget;
QWidget *window = workspace.addWindow(child);
workspace.show();
child->showMinimized();
delete window;
// This shouldn't crash.
workspace.arrangeIcons();
}
QTEST_MAIN(tst_QWorkspace)
#include "tst_qworkspace.moc"