1 /*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: QTestApp.cxx
5
6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7 All rights reserved.
8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9
10 This software is distributed WITHOUT ANY WARRANTY; without even
11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12 PURPOSE. See the above copyright notice for more information.
13
14 =========================================================================*/
15 /*-------------------------------------------------------------------------
16 Copyright 2008 Sandia Corporation.
17 Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
18 the U.S. Government retains certain rights in this software.
19 -------------------------------------------------------------------------*/
20
21 #include "QTestApp.h"
22
23 #include <stdio.h>
24
25 #include <QTimer>
26 #include <QWidget>
27 #include <QKeyEvent>
28 #include <QMouseEvent>
29
30 int QTestApp::Error = 0;
31
QTestApp(int _argc,char * _argv[])32 QTestApp::QTestApp(int _argc, char* _argv[])
33 {
34 qInstallMessageHandler(QTestApp::messageHandler);
35
36 // CMake generated driver removes argv[0],
37 // so let's put a dummy back in
38 this->Argv.append("qTestApp");
39 for(int i=0; i<_argc; i++)
40 {
41 this->Argv.append(_argv[i]);
42 }
43 for(int j=0; j<this->Argv.size(); j++)
44 {
45 this->Argvp.append(this->Argv[j].data());
46 }
47 this->Argc = this->Argvp.size();
48 App = new QApplication(this->Argc, this->Argvp.data());
49 }
50
~QTestApp()51 QTestApp::~QTestApp()
52 {
53 delete App;
54 qInstallMessageHandler(nullptr);
55 }
56
exec()57 int QTestApp::exec()
58 {
59 if(!QCoreApplication::arguments().contains("--no_exit"))
60 {
61 QTimer::singleShot(1000, QCoreApplication::instance(), SLOT(quit()));
62 }
63
64 int ret = QApplication::exec();
65 return Error + ret;
66 }
67
messageHandler(QtMsgType type,const QMessageLogContext & context,const QString & message)68 void QTestApp::messageHandler(QtMsgType type,
69 const QMessageLogContext & context,
70 const QString & message)
71 {
72 Q_UNUSED(context)
73 const char * msg = qPrintable(message);
74 switch(type)
75 {
76 case QtDebugMsg:
77 fprintf(stderr, "Debug: %s\n", msg);
78 break;
79 case QtInfoMsg:
80 fprintf(stderr, "Info: %s\n", msg);
81 break;
82 case QtWarningMsg:
83 fprintf(stderr, "Warning: %s\n", msg);
84 Error++;
85 break;
86 case QtCriticalMsg:
87 fprintf(stderr, "Critical: %s\n", msg);
88 Error++;
89 break;
90 case QtFatalMsg:
91 fprintf(stderr, "Fatal: %s\n", msg);
92 abort();
93 }
94 }
95
delay(int ms)96 void QTestApp::delay(int ms)
97 {
98 if(ms > 0)
99 {
100 QTimer::singleShot(ms, QApplication::instance(), SLOT(quit()));
101 QApplication::exec();
102 }
103 }
104
simulateEvent(QWidget * w,QEvent * e)105 void QTestApp::simulateEvent(QWidget* w, QEvent* e)
106 {
107 bool status = QApplication::sendEvent(w, e);
108 if(!status)
109 {
110 qWarning("event not handled\n");
111 }
112 QApplication::processEvents();
113 }
114
keyUp(QWidget * w,Qt::Key key,Qt::KeyboardModifiers mod,int ms)115 void QTestApp::keyUp(QWidget* w, Qt::Key key, Qt::KeyboardModifiers mod, int ms)
116 {
117 delay(ms);
118 QKeyEvent e(QEvent::KeyRelease, key, mod);
119 simulateEvent(w, &e);
120 }
121
keyDown(QWidget * w,Qt::Key key,Qt::KeyboardModifiers mod,int ms)122 void QTestApp::keyDown(QWidget* w, Qt::Key key, Qt::KeyboardModifiers mod, int ms)
123 {
124 delay(ms);
125 QKeyEvent e(QEvent::KeyPress, key, mod);
126 simulateEvent(w, &e);
127 }
128
keyClick(QWidget * w,Qt::Key key,Qt::KeyboardModifiers mod,int ms)129 void QTestApp::keyClick(QWidget* w, Qt::Key key, Qt::KeyboardModifiers mod, int ms)
130 {
131 delay(ms);
132 keyDown(w, key, mod, 0);
133 keyUp(w, key, mod, 0);
134 }
135
mouseDown(QWidget * w,QPoint pos,Qt::MouseButton btn,Qt::KeyboardModifiers mod,int ms)136 void QTestApp::mouseDown(QWidget* w, QPoint pos, Qt::MouseButton btn,
137 Qt::KeyboardModifiers mod, int ms)
138 {
139 delay(ms);
140 QMouseEvent e(QEvent::MouseButtonPress, pos, btn, btn, mod);
141 simulateEvent(w, &e);
142 }
143
mouseUp(QWidget * w,QPoint pos,Qt::MouseButton btn,Qt::KeyboardModifiers mod,int ms)144 void QTestApp::mouseUp(QWidget* w, QPoint pos, Qt::MouseButton btn,
145 Qt::KeyboardModifiers mod, int ms)
146 {
147 delay(ms);
148 QMouseEvent e(QEvent::MouseButtonRelease, pos, btn, btn, mod);
149 simulateEvent(w, &e);
150 }
151
mouseMove(QWidget * w,QPoint pos,Qt::MouseButton btn,Qt::KeyboardModifiers mod,int ms)152 void QTestApp::mouseMove(QWidget* w, QPoint pos, Qt::MouseButton btn,
153 Qt::KeyboardModifiers mod, int ms)
154 {
155 delay(ms);
156 QMouseEvent e(QEvent::MouseMove, pos, btn, btn, mod);
157 simulateEvent(w, &e);
158 }
159
mouseClick(QWidget * w,QPoint pos,Qt::MouseButton btn,Qt::KeyboardModifiers mod,int ms)160 void QTestApp::mouseClick(QWidget* w, QPoint pos, Qt::MouseButton btn,
161 Qt::KeyboardModifiers mod, int ms)
162 {
163 delay(ms);
164 mouseDown(w, pos, btn, mod, 0);
165 mouseUp(w, pos, btn, mod, 0);
166 }
167
168
169