1 // Copyright (C) 2016 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
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 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "TestController.hxx"
21 #include "MEDModule.hxx"
23 #include <Basics_Utils.hxx> // STDLOG() macro
25 #include <SUIT_Session.h>
26 #include <SUIT_Desktop.h>
28 #include <SALOMEconfig.h>
29 #include CORBA_CLIENT_HEADER(MEDEventListener)
31 #include <pqTestUtility.h>
32 #include <pqXMLEventObserver.h>
33 #include <pqXMLEventSource.h>
35 #include <pqQVTKWidgetEventPlayer.h>
36 #include <pqQVTKWidgetEventTranslator.h>
38 #include <pqTabbedMultiViewWidget.h>
39 #include <pqApplicationCore.h>
40 #include <pqTestingReaction.h>
41 #include <pqSaveScreenshotReaction.h>
43 #include <QFileDialog>
50 class PlayTestEvent: public QEvent {
52 PlayTestEvent(QEvent::Type type, const std::string & filename): QEvent(type), _filename(filename) {}
53 virtual ~PlayTestEvent() {}
54 const std::string _filename;
57 TestController::TestController(MEDModule* mod):
59 _desk(SUIT_Session::session()->activeApplication()->desktop()),
60 _tester(0), _lock_action(0),
61 _quitEventType(QEvent::registerEventType()),
62 _playEventType(QEvent::registerEventType()),
63 _aboutToPlayTest(false),
64 _myEventLoopStarted(false)
66 STDLOG("Creating a TestController");
67 _tester = new pqTestUtility(_desk);
68 _tester->addEventObserver("xml", new pqXMLEventObserver(_desk));
69 _tester->addEventSource("xml", new pqXMLEventSource(_desk));
71 QApplication::instance()->installEventFilter(this);
72 //QTimer::singleShot(0, this, SLOT(onMainEventLoopStarting()));
75 TestController::~TestController()
83 TestController::createActions() {
87 QString label = tr("LAB_RECORD_TEST");
88 QString tooltip = tr("TIP_RECORD_TEST");
90 actionId = _salomeModule->createStandardAction(label,this, SLOT(onRecordTest()),QString(),tooltip);
92 // This action has to be placed in the general file menu
93 int menuId = _salomeModule->createMenu( tr( "MEN_FILE" ), -1, 1 );
94 _salomeModule->action(actionId)->setIconVisibleInMenu(false);
95 _salomeModule->createMenu(actionId, menuId, 60);
97 label = tr("LAB_PLAY_TEST");
98 tooltip = tr("TIP_PLAY_TEST");
99 actionId = _salomeModule->createStandardAction(label,this, SLOT(onPlayTest()),QString(),tooltip);
100 _salomeModule->action(actionId)->setIconVisibleInMenu(false);
101 _salomeModule->createMenu(actionId, menuId, 70);
103 label = tr("LAB_LOCK_TEST");
104 tooltip = tr("TIP_LOCK_TEST");
105 actionId = _salomeModule->createStandardAction(label,this, SLOT(onLockViewSize()),QString(),tooltip);
106 _salomeModule->action(actionId)->setIconVisibleInMenu(false);
107 _salomeModule->action(actionId)->setCheckable(true);
108 _lock_action = _salomeModule->action(actionId);
109 _salomeModule->createMenu(actionId, menuId, 70);
111 label = tr("LAB_SNAP_TEST");
112 tooltip = tr("TIP_SNAP_TEST");
113 actionId = _salomeModule->createStandardAction(label,this, SLOT(onTakeSnapshot()),QString(),tooltip);
114 _salomeModule->action(actionId)->setIconVisibleInMenu(false);
115 _salomeModule->createMenu(actionId, menuId, 70);
118 void TestController::onRecordTest()
121 QFileDialog::getSaveFileName(_desk, "Save test", QString(), QString("XML file (*.xml)"));
122 if (!fileName.isEmpty())
124 QApplication::setActiveWindow(_desk); //mandatory otherwise record pop up doesn't show up
125 _tester->recordTests(fileName);
130 void TestController::onPlayTest()
133 QFileDialog::getOpenFileName(_desk, "Open test", QString(), QString("XML file (*.xml)"));
134 if (!fileName.isEmpty())
135 _tester->playTests(fileName);
138 void TestController::onLockViewSize() const
140 pqTestingReaction::lockViewSize(_lock_action->isChecked());
143 void TestController::onTakeSnapshot() const
145 pqSaveScreenshotReaction::saveScreenshot();
148 void TestController::onRequestTermination()
150 // Check if test playing
151 if (_tester->playingTest() || _aboutToPlayTest)
153 QEvent * e = new QEvent((QEvent::Type)_quitEventType);
154 QApplication::postEvent(this, e);
158 _salomeModule->requestSALOMETermination();
163 TestController::customEvent(QEvent * event)
165 if (event->type() == _quitEventType)
167 if(!isMainEventLoopStarted())
169 QApplication::postEvent(this, new QEvent((QEvent::Type)_quitEventType));
171 onRequestTermination();
173 else if (event->type() == _playEventType)
175 PlayTestEvent * e = dynamic_cast<PlayTestEvent *>(event);
178 // // Wait for main event loop to start:
179 if(!isMainEventLoopStarted())
181 QApplication::postEvent(this, new PlayTestEvent((QEvent::Type)_playEventType, e->_filename));
184 STDLOG("About to play test " << e->_filename);
185 _tester->playTests(e->_filename.c_str());
186 _aboutToPlayTest = false;
187 STDLOG("Done playing test " << e->_filename);
192 { QObject::customEvent(event); }
196 TestController::processWorkspaceEvent(const MEDCALC::MedEvent* event)
198 if ( event->type == MEDCALC::EVENT_PLAY_TEST ) {
199 /* [ABN] Post an event. Indeed, calling the function directly would prevent the proper refresh of the
200 * GUI which also needs to go through the MED event loop (WorkspaceController::processWorkspaceEvent)
202 _aboutToPlayTest = true; // to prevent an early quit!
203 PlayTestEvent * e = new PlayTestEvent((QEvent::Type)_playEventType, std::string(event->filename));
204 QApplication::postEvent(this, e);
206 else if ( event->type == MEDCALC::EVENT_QUIT_SALOME ) {
207 // [ABN] again: post as an event to give a chance to other events (piled up by test
208 // scenarios for example) to execute:
209 QEvent * e = new QEvent((QEvent::Type)_quitEventType);
210 QApplication::postEvent(this, e);
214 void TestController::onMainEventLoopStarting()
216 _myEventLoopStarted = true;
217 QApplication::instance()->removeEventFilter(this);
220 bool TestController::eventFilter(QObject *obj, QEvent *event)
222 if ( obj == QApplication::instance() && event->type() == 9999 )
223 onMainEventLoopStarting();
224 return QObject::eventFilter(obj, event);