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