Line data Source code
1 : /****************************************************************************
2 : **
3 : ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
4 : ** Contact: http://www.qt-project.org/legal
5 : **
6 : ** This file is part of the QtTest module of the Qt Toolkit.
7 : **
8 : ** $QT_BEGIN_LICENSE:LGPL$
9 : ** Commercial License Usage
10 : ** Licensees holding valid commercial Qt licenses may use this file in
11 : ** accordance with the commercial license agreement provided with the
12 : ** Software or, alternatively, in accordance with the terms contained in
13 : ** a written agreement between you and Digia. For licensing terms and
14 : ** conditions see http://qt.digia.com/licensing. For further information
15 : ** use the contact form at http://qt.digia.com/contact-us.
16 : **
17 : ** GNU Lesser General Public License Usage
18 : ** Alternatively, this file may be used under the terms of the GNU Lesser
19 : ** General Public License version 2.1 as published by the Free Software
20 : ** Foundation and appearing in the file LICENSE.LGPL included in the
21 : ** packaging of this file. Please review the following information to
22 : ** ensure the GNU Lesser General Public License version 2.1 requirements
23 : ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 : **
25 : ** In addition, as a special exception, Digia gives you certain additional
26 : ** rights. These rights are described in the Digia Qt LGPL Exception
27 : ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 : **
29 : ** GNU General Public License Usage
30 : ** Alternatively, this file may be used under the terms of the GNU
31 : ** General Public License version 3.0 as published by the Free Software
32 : ** Foundation and appearing in the file LICENSE.GPL included in the
33 : ** packaging of this file. Please review the following information to
34 : ** ensure the GNU General Public License version 3.0 requirements will be
35 : ** met: http://www.gnu.org/copyleft/gpl.html.
36 : **
37 : **
38 : ** $QT_END_LICENSE$
39 : **
40 : ****************************************************************************/
41 :
42 : #ifndef QTESTEVENTLOOP_H
43 : #define QTESTEVENTLOOP_H
44 :
45 : #include <QtTest/qtest_global.h>
46 :
47 : #include <QtCore/qcoreapplication.h>
48 : #include <QtCore/qeventloop.h>
49 : #include <QtCore/qobject.h>
50 : #include <QtCore/qpointer.h>
51 :
52 : QT_BEGIN_NAMESPACE
53 :
54 :
55 4 : class Q_TESTLIB_EXPORT QTestEventLoop : public QObject
56 : {
57 : Q_OBJECT
58 :
59 : public:
60 4 : inline QTestEventLoop(QObject *aParent = 0)
61 4 : : QObject(aParent), inLoop(false), _timeout(false), timerId(-1), loop(0) {}
62 :
63 : inline void enterLoopMSecs(int ms);
64 : inline void enterLoop(int secs) { enterLoopMSecs(secs * 1000); }
65 :
66 : inline void changeInterval(int secs)
67 : { killTimer(timerId); timerId = startTimer(secs * 1000); }
68 :
69 : inline bool timeout() const
70 : { return _timeout; }
71 :
72 : inline static QTestEventLoop &instance()
73 : {
74 : static QPointer<QTestEventLoop> testLoop;
75 : if (testLoop.isNull())
76 : testLoop = new QTestEventLoop(QCoreApplication::instance());
77 : return *static_cast<QTestEventLoop *>(testLoop);
78 : }
79 :
80 : public Q_SLOTS:
81 : inline void exitLoop();
82 :
83 : protected:
84 : inline void timerEvent(QTimerEvent *e);
85 :
86 : private:
87 : bool inLoop;
88 : bool _timeout;
89 : int timerId;
90 :
91 : QEventLoop *loop;
92 : };
93 :
94 5 : inline void QTestEventLoop::enterLoopMSecs(int ms)
95 : {
96 5 : Q_ASSERT(!loop);
97 :
98 5 : QEventLoop l;
99 :
100 5 : inLoop = true;
101 5 : _timeout = false;
102 :
103 5 : timerId = startTimer(ms);
104 :
105 5 : loop = &l;
106 5 : l.exec();
107 5 : loop = 0;
108 5 : }
109 :
110 5 : inline void QTestEventLoop::exitLoop()
111 : {
112 5 : if (timerId != -1)
113 5 : killTimer(timerId);
114 5 : timerId = -1;
115 :
116 5 : if (loop)
117 5 : loop->exit();
118 :
119 5 : inLoop = false;
120 5 : }
121 :
122 0 : inline void QTestEventLoop::timerEvent(QTimerEvent *e)
123 : {
124 0 : if (e->timerId() != timerId)
125 0 : return;
126 0 : _timeout = true;
127 0 : exitLoop();
128 : }
129 :
130 : QT_END_NAMESPACE
131 :
132 : #endif
|