ctkWorkflowWidgetTest2.cpp 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749
  1. /*=========================================================================
  2. Library: CTK
  3. Copyright (c) Kitware Inc.
  4. Licensed under the Apache License, Version 2.0 (the "License");
  5. you may not use this file except in compliance with the License.
  6. You may obtain a copy of the License at
  7. http://www.apache.org/licenses/LICENSE-2.0.txt
  8. Unless required by applicable law or agreed to in writing, software
  9. distributed under the License is distributed on an "AS IS" BASIS,
  10. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. See the License for the specific language governing permissions and
  12. limitations under the License.
  13. =========================================================================*/
  14. // QT includes
  15. #include <QApplication>
  16. #include <QTimer>
  17. #include <QPushButton>
  18. #include <QLabel>
  19. #include <QLineEdit>
  20. #include <QList>
  21. #include <QStyle>
  22. #include <QDebug>
  23. // CTK includes
  24. #include "ctkPushButton.h"
  25. #include "ctkWorkflow.h"
  26. #include "ctkWorkflowWidget.h"
  27. #include "ctkWorkflowStackedWidget.h"
  28. #include "ctkWorkflowTabWidget.h"
  29. #include "ctkWorkflowWidgetStep.h"
  30. #include "ctkWorkflowGroupBox.h"
  31. #include "ctkWorkflowButtonBoxWidget.h"
  32. #include "ctkExampleWorkflowWidgetStepUsingSignalsAndSlots.h"
  33. // STD includes
  34. #include <cstdlib>
  35. #include <iostream>
  36. //-----------------------------------------------------------------------------
  37. bool buttonClickTestSignalSlot(QApplication& app, int defaultTime, ctkWorkflowWidgetStep* currentStep, QWidget* shownStepArea, QLineEdit* shownLineEdit, QLabel* shownLabel, QWidget* hiddenStepArea, QLineEdit* hiddenLineEdit, QLabel* hiddenLabel, ctkWorkflow* workflow, ctkWorkflowWidget* workflowWidget, QPushButton* backButton, QPushButton* nextButton, QPushButton* finishButton1=0, QPushButton* finishButton2=0)
  38. {
  39. QTimer::singleShot(defaultTime, &app, SLOT(quit()));
  40. app.exec();
  41. // // ensure we are in the correct step
  42. if (workflow->currentStep() != currentStep)
  43. {
  44. std::cerr << "In incorrect step" << std::endl;
  45. return false;
  46. }
  47. // ensure that the widgets of the current step are visible
  48. if ((currentStep && (!shownStepArea || !shownStepArea->isVisible()))
  49. || (shownLabel && !shownLabel->isVisible())
  50. || (shownLineEdit && !shownLineEdit->isVisible())
  51. || !backButton->isVisible()
  52. || !nextButton->isVisible()
  53. || (finishButton1 && !finishButton1->isVisible())
  54. || (finishButton2 && !finishButton2->isVisible()))
  55. {
  56. std::cerr << "Incorrect widget visibility - the current step's widgets are invisible" << std::endl;
  57. return false;
  58. }
  59. // ensure that buttons are appropriately enabled
  60. // TODO finish buttons
  61. if ((workflow->canGoBackward() != backButton->isEnabled()) || (workflow->canGoForward() != nextButton->isEnabled()) || (shownLineEdit && !shownLineEdit->isEnabled()))
  62. {
  63. std::cerr << "Incorrect widget visibility - the buttons are incorrectly enabled" << std::endl;
  64. return false;
  65. }
  66. // ensure that the currentStep step's name and description are shown in
  67. // the widget
  68. ctkWorkflowGroupBox* groupBox;
  69. if (ctkWorkflowAbstractPagedWidget* pagedWidget = qobject_cast<ctkWorkflowAbstractPagedWidget*>(workflowWidget))
  70. {
  71. groupBox = pagedWidget->workflowGroupBox(currentStep);
  72. }
  73. else
  74. {
  75. groupBox = workflowWidget->workflowGroupBox();
  76. }
  77. Q_ASSERT(groupBox);
  78. if (currentStep->name() != groupBox->title() || currentStep->description() != groupBox->subTitle())
  79. {
  80. std::cerr << "Incorrect widget title/subtitle" << std::endl;
  81. return false;
  82. }
  83. // ensure that the finish button has an icon
  84. if ((finishButton1 && finishButton1->icon().isNull()) || (finishButton2 && finishButton2->icon().isNull()))
  85. {
  86. std::cerr << "Incorrect finish icon visibility" << std::endl;
  87. return false;
  88. }
  89. // ensure that widgets of the other step are either invisible, or
  90. // visible but disabled
  91. if (hiddenStepArea)
  92. {
  93. if (hiddenStepArea->isVisible() && groupBox->hideWidgetsOfNonCurrentSteps())
  94. {
  95. std::cerr << "Incorrect widget visibility - the other step's stepArea is showing" << std::endl;
  96. return false;
  97. }
  98. else if (hiddenStepArea->isVisible() && hiddenStepArea->isEnabled())
  99. {
  100. std::cerr << "Incorrect widget visibility - the other step's stepArea is enabled" << std::endl;
  101. return false;
  102. }
  103. }
  104. if (hiddenLabel)
  105. {
  106. if (hiddenLabel->isVisible() && groupBox->hideWidgetsOfNonCurrentSteps())
  107. {
  108. std::cerr << "Incorrect widget visibility - the other step's label is showing" << std::endl;
  109. return false;
  110. }
  111. }
  112. if (hiddenLineEdit)
  113. {
  114. if (hiddenLineEdit->isVisible() && groupBox->hideWidgetsOfNonCurrentSteps())
  115. {
  116. std::cerr << "Incorrect widget visibility - the other step's lineEdit is showing" << std::endl;
  117. return false;
  118. }
  119. else if (hiddenLineEdit->isVisible() && hiddenLineEdit->isEnabled())
  120. {
  121. std::cerr << "Incorrect widget visibility - the other step's lineEdit is enabled" << std::endl;
  122. return false;
  123. }
  124. }
  125. return true;
  126. }
  127. //-----------------------------------------------------------------------------
  128. struct signalSlotTestData
  129. {
  130. QPushButton* buttonToClick;
  131. ctkWorkflowWidgetStep* currentStep;
  132. ctkWorkflowWidgetStep* hiddenStep;
  133. ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* currentQObject;
  134. ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* hiddenQObject;
  135. ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* qObjectToChangeLineEdit;
  136. QString lineEditText;
  137. signalSlotTestData(QPushButton* newButtonToClick, ctkWorkflowWidgetStep* newCurrentStep, ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* newCurrentQObject, ctkWorkflowWidgetStep* newHiddenStep, ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* newHiddenQObject, ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* newQObjectToChangeLineEdit=0, QString newLineEditText="")
  138. {
  139. this->buttonToClick = newButtonToClick;
  140. this->currentStep = newCurrentStep;
  141. this->currentQObject = newCurrentQObject;
  142. this->hiddenStep = newHiddenStep;
  143. this->hiddenQObject = newHiddenQObject;
  144. this->qObjectToChangeLineEdit = newQObjectToChangeLineEdit;
  145. this->lineEditText = newLineEditText;
  146. }
  147. bool runTest(QApplication& app, int defaultTime, ctkWorkflow* workflow, ctkWorkflowWidget* workflowWidget, QPushButton* backButton, QPushButton* nextButton, QPushButton* finishButton1=0, QPushButton* finishButton2=0)
  148. {
  149. if (this->qObjectToChangeLineEdit)
  150. {
  151. this->qObjectToChangeLineEdit->lineEdit()->setText(lineEditText);
  152. }
  153. if (this->buttonToClick)
  154. {
  155. this->buttonToClick->click();
  156. }
  157. if (this->currentStep)
  158. {
  159. return buttonClickTestSignalSlot(app, defaultTime, this->currentStep, this->currentStep->stepArea(), this->currentQObject->lineEdit(), this->currentQObject->label(), this->hiddenStep->stepArea(), this->hiddenQObject->lineEdit(), this->hiddenQObject->label(), workflow, workflowWidget, backButton, nextButton, finishButton1, finishButton2);
  160. }
  161. else
  162. {
  163. return buttonClickTestSignalSlot(app, defaultTime, this->currentStep, 0, 0, 0, this->hiddenStep->stepArea(), this->hiddenQObject->lineEdit(), this->hiddenQObject->label(), workflow, workflowWidget, backButton, nextButton, finishButton1, finishButton2);
  164. }
  165. }
  166. };
  167. //-----------------------------------------------------------------------------
  168. // simulates valid and invalid user interaction for a workflow with
  169. // two steps
  170. int userInteractionSimulator1(QApplication& app, ctkWorkflowWidgetStep* step1, ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* qObject1, ctkWorkflowWidgetStep* step2, ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* qObject2, ctkWorkflow* workflow, ctkWorkflowWidget* workflowWidget, int defaultTime)
  171. {
  172. QPushButton* backButton = workflowWidget->buttonBoxWidget()->backButton();
  173. QPushButton* nextButton = workflowWidget->buttonBoxWidget()->nextButton();
  174. Q_ASSERT(backButton);
  175. Q_ASSERT(nextButton);
  176. QList<signalSlotTestData*> tests;
  177. // we should be in the first step at the start of the workflow
  178. tests << new signalSlotTestData(0, step1, qObject1, step2, qObject2);
  179. // tests with good input (lineEdit value = 100, which passes the
  180. // condition that it be >= 10)
  181. // CurrentStep ButtonPress ExpectedStep Shouldn'tDoAnything
  182. // step1 next step2
  183. // step2 back step1
  184. // step1 next step2
  185. // step2 back step1
  186. tests << new signalSlotTestData(nextButton, step2, qObject2, step1, qObject1)
  187. << new signalSlotTestData(backButton, step1, qObject1, step2, qObject2)
  188. << new signalSlotTestData(nextButton, step2, qObject2, step1, qObject1)
  189. << new signalSlotTestData(backButton, step1, qObject1, step2, qObject2);
  190. // tests with both good and bad input (lineEdit value may be
  191. // invalid)
  192. // CurrentStep ButtonPress Invalid input ExpectedStep
  193. // step1 next * step1
  194. // step1 next step2
  195. // step2 back * step1
  196. // step1 next * (empty) step1
  197. // step1 next step2
  198. tests << new signalSlotTestData(nextButton, step1, qObject1, step2, qObject2, qObject1, "1")
  199. << new signalSlotTestData(nextButton, step2, qObject2, step1, qObject1, qObject1, "100")
  200. << new signalSlotTestData(backButton, step1, qObject1, step2, qObject2)
  201. << new signalSlotTestData(nextButton, step1, qObject1, step2, qObject2, qObject1, "")
  202. << new signalSlotTestData(nextButton, step2, qObject2, step1, qObject1, qObject1, "100");
  203. foreach (signalSlotTestData* test, tests)
  204. {
  205. if (!test->runTest(app, defaultTime, workflow, workflowWidget, backButton, nextButton))
  206. {
  207. return EXIT_FAILURE;
  208. }
  209. }
  210. // TODO
  211. // // after adding the steps, then the widget's client area should have
  212. // // them as a child
  213. // if (!workflowWidget->clientArea()->isAncestorOf(step1->stepArea()))
  214. // {
  215. // std::cerr << "step1 was incorrectly added to the workflowWidget" << std::endl;
  216. // return EXIT_FAILURE;
  217. // }
  218. // if (!workflowWidget->clientArea()->isAncestorOf(step2->stepArea()))
  219. // {
  220. // std::cerr << "step2 was incorrectly added to the workflowWidget" << std::endl;
  221. // return EXIT_FAILURE;
  222. // }
  223. return EXIT_SUCCESS;
  224. }
  225. //-----------------------------------------------------------------------------
  226. // simulates valid and invalid user interaction for a workflow with
  227. // three steps
  228. int userInteractionSimulator2(QApplication& app, ctkWorkflowWidgetStep* step1, ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* qObject1, ctkWorkflowWidgetStep* step2, ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* qObject2, ctkWorkflowWidgetStep* step3, ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* qObject3, ctkWorkflow* workflow, ctkWorkflowWidget* workflowWidget, int defaultTime)
  229. {
  230. // ensure we can get the pages/layouts we may want
  231. if (ctkWorkflowAbstractPagedWidget* pagedWidget = qobject_cast<ctkWorkflowAbstractPagedWidget*>(workflowWidget))
  232. {
  233. if (!pagedWidget->workflowGroupBox(step1))
  234. {
  235. std::cerr << "could not access widget for page 1" << std::endl;
  236. return EXIT_FAILURE;
  237. }
  238. if (!pagedWidget->workflowGroupBox(step1)->clientAreaLayout())
  239. {
  240. std::cerr << "could not access client area layout for page 1" << std::endl;
  241. return EXIT_FAILURE;
  242. }
  243. }
  244. else
  245. {
  246. if (!workflowWidget->workflowGroupBox()->clientAreaLayout())
  247. {
  248. std::cerr << "could not access client area layout" << std::endl;
  249. return EXIT_FAILURE;
  250. }
  251. }
  252. QPushButton* backButton = workflowWidget->buttonBoxWidget()->backButton();
  253. QPushButton* nextButton = workflowWidget->buttonBoxWidget()->nextButton();
  254. QPushButton* finishButton = workflowWidget->buttonBoxWidget()->goToButtons().first();
  255. Q_ASSERT(backButton);
  256. Q_ASSERT(nextButton);
  257. Q_ASSERT(finishButton);
  258. QList<signalSlotTestData*> tests;
  259. // we should be in the first step at the start of the workflow
  260. tests << new signalSlotTestData(0, step1, qObject1, step2, qObject2);
  261. // tests with good input (lineEdit value = 100, which passes the
  262. // condition that it be >= 10)
  263. // CurrentStep ButtonPress ExpectedStep Shouldn'tDoAnything
  264. // step1 next step2
  265. // step2 next step3
  266. // step3 back step2
  267. // step2 back step1
  268. // step1 next step2
  269. // step2 next step3
  270. // step3 back step2
  271. tests << new signalSlotTestData(nextButton, step2, qObject2, step1, qObject1)
  272. << new signalSlotTestData(nextButton, step3, qObject3, step2, qObject2, qObject2, "100")
  273. << new signalSlotTestData(backButton, step2, qObject2, step3, qObject3)
  274. << new signalSlotTestData(backButton, step1, qObject1, step2, qObject2)
  275. << new signalSlotTestData(nextButton, step2, qObject2, step1, qObject1)
  276. << new signalSlotTestData(nextButton, step3, qObject3, step2, qObject2)
  277. << new signalSlotTestData(backButton, step2, qObject2, step3, qObject3);
  278. // tests with both good and bad input (lineEdit value may be
  279. // invalid)
  280. // CurrentStep ButtonPress Invalid input ExpectedStep
  281. // step2 next * step2
  282. // step2 next step3
  283. // step3 back * step2
  284. // step2 next * (empty) step2
  285. // step2 next step3
  286. tests << new signalSlotTestData(nextButton, step2, qObject2, step3, qObject3, qObject2, "1")
  287. << new signalSlotTestData(nextButton, step3, qObject3, step2, qObject2, qObject2, "100")
  288. << new signalSlotTestData(backButton, step2, qObject2, step3, qObject3)
  289. << new signalSlotTestData(nextButton, step2, qObject2, step3, qObject3, qObject2, "")
  290. << new signalSlotTestData(nextButton, step3, qObject3, step2, qObject2, qObject2, "100");
  291. // first go back to the beginning
  292. tests << new signalSlotTestData(backButton, step2, qObject2, step3, qObject3, qObject2, "100")
  293. << new signalSlotTestData(backButton, step1, qObject1, step2, qObject2);
  294. // tests going to the finish step
  295. // CurrentStep ButtonPress Invalid input ExpectedStep
  296. // step1 finish step1
  297. // step1 finish step1
  298. // step1 next step2
  299. // step2 finish step2
  300. // step2 next step3
  301. // step3 finish step3
  302. // step3 back step2
  303. // step2 finish step2
  304. // step2 back step1
  305. // step1 finish step1
  306. tests << new signalSlotTestData(finishButton, step1, qObject1, step3, qObject3)
  307. << new signalSlotTestData(finishButton, step1, qObject1, step3, qObject3)
  308. << new signalSlotTestData(nextButton, step2, qObject2, step1, qObject1)
  309. << new signalSlotTestData(finishButton, step2, qObject2, step3, qObject3)
  310. << new signalSlotTestData(nextButton, step3, qObject3, step2, qObject2)
  311. << new signalSlotTestData(finishButton, step3, qObject3, step2, qObject2)
  312. << new signalSlotTestData(backButton, step2, qObject2, step3, qObject3)
  313. << new signalSlotTestData(finishButton, step2, qObject2, step3, qObject3)
  314. << new signalSlotTestData(backButton, step1, qObject1, step2, qObject2)
  315. << new signalSlotTestData(finishButton, step1, qObject1, step3, qObject3);
  316. // tests going to the finish step with invalid input
  317. // CurrentStep ButtonPress Invalid input ExpectedStep
  318. // step1 finish * (step2, qObject2) step2
  319. // step2 next step3
  320. // step3 back step2
  321. // step2 finish * (step2) step2
  322. // step2 back step1
  323. // step1 finish * (step3) step1
  324. tests << new signalSlotTestData(finishButton, step2, qObject2, step1, qObject1, qObject2, "0")
  325. << new signalSlotTestData(nextButton, step3, qObject3, step2, qObject2, qObject2, "100")
  326. << new signalSlotTestData(backButton, step2, qObject2, step3, qObject3)
  327. << new signalSlotTestData(finishButton, step2, qObject2, step3, qObject3, qObject2, "0")
  328. << new signalSlotTestData(backButton, step1, qObject1, step2, qObject2, qObject2, "100") // reset text for step2, qObject2
  329. << new signalSlotTestData(finishButton, step1, qObject1, step3, qObject3, qObject3, "0");
  330. foreach (signalSlotTestData* test, tests)
  331. {
  332. if (!test->runTest(app, defaultTime, workflow, workflowWidget, backButton, nextButton, finishButton))
  333. {
  334. return EXIT_FAILURE;
  335. }
  336. }
  337. // TODO
  338. // // after adding the steps, then the widget's client area should have
  339. // // them as a child
  340. // if (!workflowWidget->clientArea()->isAncestorOf(step3->stepArea()))
  341. // {
  342. // std::cerr << "step3 was incorrectly added to the workflowWidget" << std::endl;
  343. // return EXIT_FAILURE;
  344. // }
  345. return EXIT_SUCCESS;
  346. }
  347. // //-----------------------------------------------------------------------------
  348. // // simulates valid and invalid user interaction for a workflow with
  349. // // three steps and two finish steps
  350. // int userInteractionSimulator3(QApplication& app, ctkWorkflowWidgetStep* step1, ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* qObject1, ctkWorkflowWidgetStep* step2, ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* qObject2, ctkWorkflowWidgetStep* step3, ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* qObject3, ctkWorkflow* workflow, ctkWorkflowWidget* workflowWidget, int defaultTime)
  351. // {
  352. // int BACK_BUTTON_INDEX = 0;
  353. // int NEXT_BUTTON_INDEX = 1;
  354. // int FINISH_BUTTON_INDEX_1 = 2;
  355. // int FINISH_BUTTON_INDEX_2 = 3;
  356. // // get the buttons
  357. // QPushButton* step1BackButton = 0;
  358. // QPushButton* step1NextButton = 0;
  359. // QPushButton* step1FinishButton1 = 0;
  360. // QPushButton* step1FinishButton2 = 0;
  361. // QPushButton* step2BackButton = 0;
  362. // QPushButton* step2NextButton = 0;
  363. // QPushButton* step2FinishButton1 = 0;
  364. // QPushButton* step2FinishButton2 = 0;
  365. // QPushButton* step3BackButton = 0;
  366. // QPushButton* step3NextButton = 0;
  367. // QPushButton* step3FinishButton1 = 0;
  368. // QPushButton* step3FinishButton2 = 0;
  369. // // get the back/next buttons for the first step
  370. // QList<QPushButton*> buttons = step1->stepArea()->findChildren<QPushButton*>();
  371. // // if (buttons.length() != 3)
  372. // // {
  373. // // std::cerr << "incorrect number of buttons for step1" << std::endl;
  374. // // std::cerr << "number of buttons = " << buttons.length() << ", expecting 3" << std::endl;
  375. // // return EXIT_FAILURE;
  376. // // }
  377. // step1NextButton = buttons.at(NEXT_BUTTON_INDEX);
  378. // step1FinishButton1 = buttons.at(FINISH_BUTTON_INDEX_1);
  379. // step1FinishButton2 = buttons.at(FINISH_BUTTON_INDEX_2);
  380. // if (!step1NextButton || !step1FinishButton1 || !step1FinishButton2 || step1NextButton->text() != "Next" || step1FinishButton1->text() != "finish" || step1FinishButton2->text() != "finish")
  381. // {
  382. // std::cerr << "incorrect button assignment for step1" << std::endl;
  383. // return EXIT_FAILURE;
  384. // }
  385. // // we should be in the first step
  386. // if (!buttonClickTestSignalSlot(app, defaultTime, step1, qObject1, step2, qObject2, workflow, workflowWidget, step1BackButton, step1NextButton, step2BackButton, step2NextButton, step1FinishButton1, step2FinishButton1, step1FinishButton2, step2FinishButton2)) {return EXIT_FAILURE;}
  387. // // tests with good input, so that we can get all of the buttons
  388. // // (lineEdit value = 100, which passes the condition that it be >= 10)
  389. // // CurrentStep ButtonPress ExpectedStep Shouldn'tDoAnything
  390. // // step1 next step2
  391. // // step2 next step3
  392. // // normal forwards/backwards transitions
  393. // step1NextButton->click();
  394. // QTimer::singleShot(defaultTime, &app, SLOT(quit()));
  395. // app.exec();
  396. // // get the back/next buttons for the second step
  397. // buttons = step2->stepArea()->findChildren<QPushButton*>();
  398. // // if (buttons.length() != 4)
  399. // // {
  400. // // std::cerr << "incorrect number of buttons for step2" << std::endl;
  401. // // std::cerr << "number of buttons = " << buttons.length() << ", expecting 4" << std::endl;
  402. // // return EXIT_FAILURE;
  403. // // }
  404. // step2BackButton = buttons.at(BACK_BUTTON_INDEX);
  405. // step2NextButton = buttons.at(NEXT_BUTTON_INDEX);
  406. // step2FinishButton1 = buttons.at(FINISH_BUTTON_INDEX_1);
  407. // step2FinishButton2 = buttons.at(FINISH_BUTTON_INDEX_2);
  408. // if (!step2BackButton || !step2NextButton || !step2FinishButton1 || !step2FinishButton2 || step2BackButton->text() != "Back" || step2NextButton->text() != "Next" || step2FinishButton1->text() != "finish" || step2FinishButton2->text() != "finish")
  409. // {
  410. // std::cerr << "incorrect button assignment for step2" << std::endl;
  411. // return EXIT_FAILURE;
  412. // }
  413. // if (!buttonClickTestSignalSlot(app, defaultTime, step2, qObject2, step1, qObject1, workflow, workflowWidget, step2BackButton, step2NextButton, step1BackButton, step1NextButton, step2FinishButton1, step1FinishButton1, step2FinishButton2, step1FinishButton2)) {return EXIT_FAILURE;}
  414. // step2NextButton->click();
  415. // QTimer::singleShot(defaultTime, &app, SLOT(quit()));
  416. // app.exec();
  417. // // get the back/next buttons for the third step
  418. // buttons = step3->stepArea()->findChildren<QPushButton*>();
  419. // // if (buttons.length() != 3)
  420. // // {
  421. // // std::cerr << "incorrect number of buttons for step3" << std::endl;
  422. // // std::cerr << "number of buttons = " << buttons.length() << ", expecting 3" << std::endl;
  423. // // return EXIT_FAILURE;
  424. // // }
  425. // step3BackButton = buttons.at(BACK_BUTTON_INDEX);
  426. // step3FinishButton1 = buttons.at(FINISH_BUTTON_INDEX_1);
  427. // step3FinishButton2 = buttons.at(FINISH_BUTTON_INDEX_2);
  428. // if (!step3BackButton || !step3FinishButton1 || !step3FinishButton2 || step3BackButton->text() != "Back" || step3FinishButton1->text() != "finish" || step3FinishButton2->text() != "finish")
  429. // {
  430. // std::cerr << "incorrect button assignment for step3" << std::endl;
  431. // return EXIT_FAILURE;
  432. // }
  433. // if (!buttonClickTestSignalSlot(app, defaultTime, step3, qObject3, step2, qObject2, workflow, workflowWidget, step3BackButton, step3NextButton, step2BackButton, step2NextButton, step3FinishButton1, step2FinishButton1, step3FinishButton2, step2FinishButton2)) {return EXIT_FAILURE;}
  434. // // tests going to the finish step
  435. // // CurrentStep ButtonPress Invalid input ExpectedStep
  436. // // step3 back step2
  437. // // step2 back step1
  438. // // step1 finish1 step1
  439. // // step1 next step2
  440. // // step2 finish1 step2
  441. // // step2 finish2 step2
  442. // // step2 back step1
  443. // // step1 finish2 step1
  444. // // step1 next step2
  445. // step3BackButton->click();
  446. // if (!buttonClickTestSignalSlot(app, defaultTime, step2, qObject2, step3, qObject3, workflow, workflowWidget, step2BackButton, step2NextButton, step3BackButton, step3NextButton, step2FinishButton1, step3FinishButton1, step2FinishButton2, step3FinishButton2)) {return EXIT_FAILURE;}
  447. // step2BackButton->click();
  448. // if (!buttonClickTestSignalSlot(app, defaultTime, step1, qObject1, step2, qObject2, workflow, workflowWidget, step1BackButton, step1NextButton, step2BackButton, step2NextButton, step1FinishButton1, step2FinishButton1, step1FinishButton2, step2FinishButton2)) {return EXIT_FAILURE;}
  449. // step1FinishButton1->click();
  450. // if (!buttonClickTestSignalSlot(app, defaultTime, step1, qObject1, step3, qObject3, workflow, workflowWidget, step1BackButton, step1NextButton, step3BackButton, step3BackButton, step1FinishButton1, step3FinishButton1, step1FinishButton2, step3FinishButton2)) {return EXIT_FAILURE;}
  451. // step1NextButton->click();
  452. // if (!buttonClickTestSignalSlot(app, defaultTime, step2, qObject2, step1, qObject1, workflow, workflowWidget, step2BackButton, step2NextButton, step1BackButton, step1BackButton, step2FinishButton1, step1FinishButton1, step2FinishButton2, step1FinishButton2)) {return EXIT_FAILURE;}
  453. // step2FinishButton1->click();
  454. // if (!buttonClickTestSignalSlot(app, defaultTime, step2, qObject2, step3, qObject3, workflow, workflowWidget, step2BackButton, step2NextButton, step3BackButton, step3NextButton, step2FinishButton1, step3FinishButton1, step2FinishButton2, step3FinishButton2)) {return EXIT_FAILURE;}
  455. // step2FinishButton2->click();
  456. // if (!buttonClickTestSignalSlot(app, defaultTime, step2, qObject2, step3, qObject3, workflow, workflowWidget, step2BackButton, step2NextButton, step3BackButton, step3NextButton, step2FinishButton1, step3FinishButton1, step2FinishButton2, step3FinishButton2)) {return EXIT_FAILURE;}
  457. // step2BackButton->click();
  458. // if (!buttonClickTestSignalSlot(app, defaultTime, step1, qObject1, step2, qObject2, workflow, workflowWidget, step1BackButton, step1NextButton, step2BackButton, step2NextButton, step1FinishButton1, step2FinishButton1, step1FinishButton2, step2FinishButton2)) {return EXIT_FAILURE;}
  459. // step1FinishButton2->click();
  460. // if (!buttonClickTestSignalSlot(app, defaultTime, step1, qObject1, step2, qObject2, workflow, workflowWidget, step1BackButton, step1NextButton, step2BackButton, step2BackButton, step1FinishButton1, step2FinishButton1, step1FinishButton2, step2FinishButton2)) {return EXIT_FAILURE;}
  461. // step1NextButton->click();
  462. // if (!buttonClickTestSignalSlot(app, defaultTime, step2, qObject2, step1, qObject1, workflow, workflowWidget, step2BackButton, step2NextButton, step1BackButton, step1BackButton, step2FinishButton1, step1FinishButton1, step2FinishButton2, step1FinishButton2)) {return EXIT_FAILURE;}
  463. // return EXIT_SUCCESS;
  464. // }
  465. //-----------------------------------------------------------------------------
  466. int ctkWorkflowWidgetTest2(int argc, char * argv [] )
  467. {
  468. QApplication app(argc, argv);
  469. int defaultTime = 100;
  470. bool hideWidgets = false;
  471. ctkWorkflow* workflow = new ctkWorkflow;
  472. ctkWorkflowWidget* workflowWidget = new ctkWorkflowWidget;
  473. workflowWidget->setWorkflow(workflow);
  474. ctkWorkflowGroupBox* groupBox = workflowWidget->workflowGroupBox();
  475. groupBox->setPreText("I am some pre-text");
  476. groupBox->setPostText("I am some post-text");
  477. groupBox->setHideWidgetsOfNonCurrentSteps(hideWidgets);
  478. // create and add the first workflow step (depends on workflowWidget
  479. // type)
  480. ctkWorkflowWidgetStep* step1 = new ctkWorkflowWidgetStep("Step 1");
  481. step1->setName("Step 1");
  482. step1->setDescription("I am in step 1");
  483. if (ctkWorkflowTabWidget* tabWidget = qobject_cast<ctkWorkflowTabWidget*>(workflowWidget))
  484. {
  485. tabWidget->associateStepWithLabel(step1, "tab1");
  486. }
  487. // step1 is the initial step
  488. workflow->setInitialStep(step1);
  489. // create and add the second workflow step (depends on
  490. // workflowWidget type)
  491. ctkWorkflowWidgetStep* step2 = new ctkWorkflowWidgetStep("Step 2");
  492. step2->setName("Step 2");
  493. step2->setDescription("I am in step 2");
  494. if (ctkWorkflowTabWidget* tabWidget = qobject_cast<ctkWorkflowTabWidget*>(workflowWidget))
  495. {
  496. tabWidget->associateStepWithLabel(step2, "tab2");
  497. }
  498. // add the steps to the workflow
  499. workflow->addTransition(step1, step2);
  500. // create the qObjects that implement the required functions, and
  501. // communicate with the workflow using signals and slots
  502. ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* qObject1 =
  503. new ctkExampleWorkflowWidgetStepUsingSignalsAndSlots(step1);
  504. ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* qObject2 =
  505. new ctkExampleWorkflowWidgetStepUsingSignalsAndSlots(step2);
  506. // set the widget for each qObject
  507. qObject1->setWidget(step1->stepArea());
  508. qObject2->setWidget(step2->stepArea());
  509. // use the qObjects for validation
  510. QObject::connect(step1->ctkWorkflowStepQObject(),
  511. SIGNAL(invokeValidateCommand(QString)),
  512. qObject1, SLOT(validate(QString)));
  513. QObject::connect(step2->ctkWorkflowStepQObject(),
  514. SIGNAL(invokeValidateCommand(QString)),
  515. qObject2, SLOT(validate(QString)));
  516. // use the qObjects for entry processing
  517. QObject::connect(step1->ctkWorkflowStepQObject(),
  518. SIGNAL(invokeOnEntryCommand(const ctkWorkflowStep*,ctkWorkflowInterstepTransition::InterstepTransitionType)),
  519. qObject1, SLOT(onEntry(const ctkWorkflowStep*,ctkWorkflowInterstepTransition::InterstepTransitionType)));
  520. QObject::connect(step2->ctkWorkflowStepQObject(),
  521. SIGNAL(invokeOnEntryCommand(const ctkWorkflowStep*,ctkWorkflowInterstepTransition::InterstepTransitionType)),
  522. qObject2, SLOT(onEntry(const ctkWorkflowStep*,ctkWorkflowInterstepTransition::InterstepTransitionType)));
  523. // use the qObjects for exit processing
  524. QObject::connect(step1->ctkWorkflowStepQObject(),
  525. SIGNAL(invokeOnExitCommand(const ctkWorkflowStep*,ctkWorkflowInterstepTransition::InterstepTransitionType)),
  526. qObject1, SLOT(onExit(const ctkWorkflowStep*,ctkWorkflowInterstepTransition::InterstepTransitionType)));
  527. QObject::connect(step2->ctkWorkflowStepQObject(),
  528. SIGNAL(invokeOnExitCommand(const ctkWorkflowStep*,ctkWorkflowInterstepTransition::InterstepTransitionType)),
  529. qObject2, SLOT(onExit(const ctkWorkflowStep*,ctkWorkflowInterstepTransition::InterstepTransitionType)));
  530. // use the qObjects for populating the stepWidgetsList
  531. QObject::connect(step1->ctkWorkflowStepQObject(),
  532. SIGNAL(invokeCreateUserInterfaceCommand()),
  533. qObject1, SLOT(createUserInterface()));
  534. QObject::connect(step2->ctkWorkflowStepQObject(),
  535. SIGNAL(invokeCreateUserInterfaceCommand()),
  536. qObject2, SLOT(createUserInterface()));
  537. step1->setHasValidateCommand(1);
  538. step2->setHasValidateCommand(1);
  539. step1->setHasOnEntryCommand(1);
  540. step2->setHasOnEntryCommand(1);
  541. step1->setHasOnExitCommand(1);
  542. step2->setHasOnExitCommand(1);
  543. step1->setHasCreateUserInterfaceCommand(1);
  544. step2->setHasCreateUserInterfaceCommand(1);
  545. // start the workflow
  546. workflow->start();
  547. workflowWidget->show();
  548. // first user interaction test
  549. if (userInteractionSimulator1(app, step1, qObject1, step2, qObject2, workflow, workflowWidget, defaultTime) == EXIT_FAILURE)
  550. {
  551. return EXIT_FAILURE;
  552. }
  553. // stop the workflow
  554. workflow->stop();
  555. QTimer::singleShot(defaultTime, &app, SLOT(quit()));
  556. app.exec();
  557. // create and add a third workflow step (depends on workflowWidget
  558. // type)
  559. ctkWorkflowWidgetStep* step3 = new ctkWorkflowWidgetStep("Step 3");
  560. step3->setName("Step 3");
  561. step3->setDescription("I am in step 3");
  562. if (ctkWorkflowStackedWidget* stackedWidget = qobject_cast<ctkWorkflowStackedWidget*>(workflowWidget))
  563. {
  564. stackedWidget->associateStepWithPage(step3, 1);
  565. }
  566. else if (ctkWorkflowTabWidget* tabWidget = qobject_cast<ctkWorkflowTabWidget*>(workflowWidget))
  567. {
  568. tabWidget->associateStepWithPage(step3, 1, "tab2");
  569. }
  570. // icon test - add an icon to step3, should show up as a icon on the finish button
  571. step3->setIcon(step3->stepArea()->style()->standardIcon(QStyle::SP_ArrowUp));
  572. // add the step to the workflow
  573. workflow->addTransition(step2, step3);
  574. // create the qObjects that implement the required functions, and
  575. // communicate with the workflow using signals and slots
  576. ctkExampleWorkflowWidgetStepUsingSignalsAndSlots* qObject3 =
  577. new ctkExampleWorkflowWidgetStepUsingSignalsAndSlots(step3);
  578. qObject3->setWidget(step3->stepArea());
  579. // use the qObjects for validation
  580. QObject::connect(step3->ctkWorkflowStepQObject(), SIGNAL(invokeValidateCommand(QString)),
  581. qObject3, SLOT(validate(QString)));
  582. // use the qObjects for entry processing
  583. QObject::connect(step3->ctkWorkflowStepQObject(), SIGNAL(invokeOnEntryCommand(const ctkWorkflowStep*,ctkWorkflowInterstepTransition::InterstepTransitionType)),
  584. qObject3, SLOT(onEntry(const ctkWorkflowStep*,ctkWorkflowInterstepTransition::InterstepTransitionType)));
  585. // use the qObjects for exit processing
  586. QObject::connect(step3->ctkWorkflowStepQObject(), SIGNAL(invokeOnExitCommand(const ctkWorkflowStep*,ctkWorkflowInterstepTransition::InterstepTransitionType)),
  587. qObject3, SLOT(onExit(const ctkWorkflowStep*,ctkWorkflowInterstepTransition::InterstepTransitionType)));
  588. // use the qObjects for populating the stepWidgetsList
  589. QObject::connect(step3->ctkWorkflowStepQObject(), SIGNAL(invokeCreateUserInterfaceCommand()), qObject3, SLOT(createUserInterface()));
  590. QObject::connect(qObject3, SIGNAL(createUserInterfaceComplete()), step3->ctkWorkflowStepQObject(), SIGNAL(createUserInterfaceComplete()));
  591. step3->setHasValidateCommand(1);
  592. step3->setHasOnEntryCommand(1);
  593. step3->setHasOnExitCommand(1);
  594. step3->setHasCreateUserInterfaceCommand(1);
  595. // restart the workflow
  596. workflow->start();
  597. // second user interaction test
  598. if (userInteractionSimulator2(app, step1, qObject1, step2, qObject2, step3, qObject3, workflow, workflowWidget, defaultTime) == EXIT_FAILURE)
  599. {
  600. return EXIT_FAILURE;
  601. }
  602. // stop the workflow
  603. workflow->stop();
  604. QTimer::singleShot(defaultTime, &app, SLOT(quit()));
  605. app.exec();
  606. // make the second workflow step a finish step as well
  607. // TODO put this back once we can add multiple finish steps
  608. // finishSteps.push_back(step2);
  609. // step1->setFinishStepsToHaveButtonsInStepArea(finishSteps);
  610. // step2->setFinishStepsToHaveButtonsInStepArea(finishSteps);
  611. // step3->setFinishStepsToHaveButtonsInStepArea(finishSteps);
  612. // // workflow->addFinishStep(step2);
  613. // // restart the workflow
  614. // workflow->start();
  615. // QTimer::singleShot(defaultTime, &app, SLOT(quit()));
  616. // app.exec();
  617. // // third user interfaction test
  618. // if (userInteractionSimulator3(app, step1, qObject1, step2, qObject2, step3, qObject3, workflow, workflowWidget, defaultTime) == EXIT_FAILURE)
  619. // {
  620. // return EXIT_FAILURE;
  621. // }
  622. // // stop the workflow
  623. // workflow->stop();
  624. // QTimer::singleShot(defaultTime, &app, SLOT(quit()));
  625. // app.exec();
  626. // handles deletion of the workflowWidget, workflow, steps, states
  627. // and transitions
  628. delete workflowWidget;
  629. return EXIT_SUCCESS;
  630. }