KDELibs4Support

qtest_kde.h
1 /* This file is part of the KDE libraries
2  Copyright (C) 2006 David Faure <[email protected]>
3 
4  This library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Library General Public
6  License version 2 as published by the Free Software Foundation.
7 
8  This library is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  Library General Public License for more details.
12 
13  You should have received a copy of the GNU Library General Public License
14  along with this library; see the file COPYING.LIB. If not, write to
15  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16  Boston, MA 02110-1301, USA.
17 */
18 
19 #ifndef QTEST_KDE_H
20 #define QTEST_KDE_H
21 
22 #include <kdelibs4support_export.h>
23 #include <QTest>
24 #include <stdlib.h>
25 #include <assert.h>
26 #include <k4aboutdata.h>
27 #include <klocalizedstring.h>
28 #include <kcmdlineargs.h>
29 #include <kcomponentdata.h>
30 #include "kglobal.h"
31 #include <kurl.h>
32 #include <QApplication>
33 #include <QEventLoop>
34 #include <QSignalSpy>
35 
36 namespace QTest
37 {
38 /**
39  * Starts an event loop that runs until the given signal is received.
40  * Optionally the event loop can return earlier on a timeout.
41  *
42  * \param timeout the timeout in milliseconds
43  *
44  * \return \p true if the requested signal was received
45  * \p false on timeout
46  * \deprecated since 5.0, use QSignalSpy::wait(timeout)
47  */
48 KDELIBS4SUPPORT_DEPRECATED_EXPORT bool kWaitForSignal(QObject *obj, const char *signal, int timeout = 0);
49 } // namespace QTest
50 
51 // By default, unit tests get no gui.
52 // Pass GUI if you use any GUI classes
53 enum KDEMainFlag { NoGUI = 0, GUI = 1 }; // bitfield, next item is 2!
54 Q_DECLARE_FLAGS(KDEMainFlags, KDEMainFlag)
55 Q_DECLARE_OPERATORS_FOR_FLAGS(KDEMainFlags)
56 /**
57  * \short QTEST_KDEMAIN variant with additional argument for the main component name
58  *
59  * This variant is useful for testing application classes which rely on the main
60  * component having a specific name (for instance to find xmlgui .rc files).
61  *
62  * This variant should not be needed in kdelibs's own unit tests.
63  *
64  * \param TestObject The class you use for testing.
65  * \param flags one of KDEMainFlag. This is passed to the QApplication constructor.
66  * \param componentName the name that will be given to the main component data.
67  *
68  * \see KDEMainFlag
69  * \see QTestLib
70  */
71 #define QTEST_KDEMAIN_WITH_COMPONENTNAME(TestObject, flags, componentName) \
72  int main(int argc, char *argv[]) \
73  { \
74  qputenv("LC_ALL", "C"); \
75  assert( !QDir::homePath().isEmpty() ); \
76  qputenv("XDG_DATA_HOME", QFile::encodeName( QDir::homePath() + QString::fromLatin1("/.kde-unit-test/xdg/local") )); \
77  qputenv("XDG_CONFIG_HOME", QFile::encodeName( QDir::homePath() + QString::fromLatin1("/.kde-unit-test/xdg/config") )); \
78  qputenv("XDG_CACHE_HOME", QFile::encodeName( QDir::homePath() + QString::fromLatin1("/.kde-unit-test/xdg/cache") )); \
79  qputenv("KDE_SKIP_KDERC", "1"); \
80  unsetenv("KDE_COLOR_DEBUG"); \
81  QFile::remove(QDir::homePath() + QString::fromLatin1("/.kde-unit-test/xdg/config/qttestrc")); \
82  K4AboutData aboutData( QByteArray(componentName), QByteArray(), ki18n("KDE Test Program"), QByteArray("version") ); \
83  KDEMainFlags mainFlags = flags; \
84  KComponentData cData(&aboutData); \
85  QApplication app( argc, argv, (mainFlags & GUI) != 0 ); \
86  app.setApplicationName( QLatin1String("qttest") ); \
87  qRegisterMetaType<KUrl>(); /*as done by kapplication*/ \
88  qRegisterMetaType<QList<KUrl> >(); \
89  TestObject tc; \
90  KGlobal::ref(); /* don't quit qeventloop after closing a mainwindow */ \
91  return QTest::qExec( &tc, argc, argv ); \
92  }
93 
94 /**
95  * \short KDE Replacement for QTEST_MAIN from QTestLib
96  *
97  * This macro should be used for classes that need a KComponentData.
98  * So instead of writing QTEST_MAIN( TestClass ) you write
99  * QTEST_KDEMAIN( TestClass, GUI ).
100  *
101  * \param TestObject The class you use for testing.
102  * \param flags one of KDEMainFlag. This is passed to the QApplication constructor.
103  *
104  * \see KDEMainFlag
105  * \see QTestLib
106  */
107 #define QTEST_KDEMAIN(TestObject, flags) QTEST_KDEMAIN_WITH_COMPONENTNAME(TestObject, flags, "qttest")
108 
109 /**
110  * \short KDE Replacement for QTEST_MAIN from QTestLib, for non-gui code.
111  *
112  * This macro should be used for classes that need a KComponentData.
113  * So instead of writing QTEST_MAIN( TestClass ) you write
114  * QTEST_KDEMAIN_CORE( TestClass ).
115  *
116  * \param TestObject The class you use for testing.
117  *
118  * \see KDEMainFlag
119  * \see QTestLib
120  * \since 4.3
121  */
122 #define QTEST_KDEMAIN_CORE_WITH_COMPONENTNAME(TestObject, componentName) \
123  int main(int argc, char *argv[]) \
124  { \
125  qputenv("LC_ALL", "C"); \
126  assert( !QDir::homePath().isEmpty() ); \
127  qputenv("XDG_DATA_HOME", QFile::encodeName( QDir::homePath() + QString::fromLatin1("/.kde-unit-test/xdg/local"))); \
128  qputenv("XDG_CONFIG_HOME", QFile::encodeName( QDir::homePath() + QString::fromLatin1("/.kde-unit-test/xdg/config") )); \
129  qputenv("XDG_CACHE_HOME", QFile::encodeName( QDir::homePath() + QString::fromLatin1("/.kde-unit-test/xdg/cache") )); \
130  qputenv("KDE_SKIP_KDERC", "1"); \
131  unsetenv("KDE_COLOR_DEBUG"); \
132  QFile::remove(QDir::homePath() + QString::fromLatin1("/.kde-unit-test/xdg/config/qttestrc")); \
133  K4AboutData aboutData( QByteArray(componentName), QByteArray(), ki18n("KDE Test Program"), QByteArray("version") ); \
134  KComponentData cData(&aboutData); \
135  QCoreApplication app( argc, argv ); \
136  app.setApplicationName( QLatin1String("qttest") ); \
137  qRegisterMetaType<KUrl>(); /*as done by kapplication*/ \
138  qRegisterMetaType<QList<KUrl> >(); \
139  TestObject tc; \
140  KGlobal::ref(); /* don't quit qeventloop after closing a mainwindow */ \
141  return QTest::qExec( &tc, argc, argv ); \
142  }
143 
144 /**
145  * \short KDE Replacement for QTEST_MAIN from QTestLib, for non-gui code.
146  *
147  * This macro should be used for classes that need a KComponentData.
148  * So instead of writing QTEST_MAIN( TestClass ) you write
149  * QTEST_KDEMAIN_CORE( TestClass ).
150  *
151  * \param TestObject The class you use for testing.
152  *
153  * \see KDEMainFlag
154  * \see QTestLib
155  */
156 #define QTEST_KDEMAIN_CORE(TestObject) QTEST_KDEMAIN_CORE_WITH_COMPONENTNAME(TestObject, "qttest")
157 
158 #endif /* QTEST_KDE_H */
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Sun Jun 20 2021 22:58:15 by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.