ctkMessageBoxDontShowAgainTest.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  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 <QCheckBox>
  17. #include <QSettings>
  18. #include <QStyle>
  19. #include <QTimer>
  20. // CTK includes
  21. #include "ctkMessageBox.h"
  22. #include "ctkTest.h"
  23. // STD includes
  24. #include <cstdlib>
  25. #include <iostream>
  26. Q_DECLARE_METATYPE(QMessageBox::StandardButton);
  27. Q_DECLARE_METATYPE(QMessageBox::ButtonRole);
  28. // ----------------------------------------------------------------------------
  29. class ctkMessageBoxDontShowAgainTester: public QObject
  30. {
  31. Q_OBJECT
  32. void testExecMessageBox(ctkMessageBox& messageBox);
  33. private Q_SLOTS:
  34. void initTestCase();
  35. void init();
  36. void cleanup();
  37. // Check default values of ctkMessageBox
  38. void testDefaults();
  39. // Ensure the "dont's show again" checkbox works correctly with 1 button (Ok)
  40. void testDontShowAgain();
  41. void testDontShowAgain_data();
  42. // Ensure the "dont's show again" checkbox works correctly with 2 buttons
  43. // Ok and Cancel
  44. void testOkCancel();
  45. void testOkCancel_data();
  46. // Test Settings key with 1 button (Ok)
  47. void testDontShowAgainSettingsKey();
  48. void testDontShowAgainSettingsKey_data();
  49. // Test with 2 buttons (Ok and Cancel)
  50. void testDontShowAgainSettingsKeyOkCancel();
  51. void testDontShowAgainSettingsKeyOkCancel_data();
  52. // Check "Don't show again" before the the dialog is shown.
  53. // -> doesn't show the dialog.
  54. void testDontShowAgainSettingsKeySetDontShowAgain();
  55. void testDontShowAgainSettingsKeySetDontShowAgain_data();
  56. // After the dialog is shown, simulate a click on the
  57. // "don't show again" checkbox.
  58. void testDontShowAgainSettingsKeyClickDontShowAgain();
  59. void testDontShowAgainSettingsKeyClickDontShowAgain_data();
  60. // static utility function
  61. void testConfirmExit();
  62. void testConfirmExit_data();
  63. //void testCustomButton();
  64. };
  65. // ----------------------------------------------------------------------------
  66. void ctkMessageBoxDontShowAgainTester::initTestCase()
  67. {
  68. // Setup QApplication for settings
  69. qApp->setOrganizationName("CommonToolKit");
  70. qApp->setOrganizationDomain("www.commontk.org");
  71. qApp->setApplicationName("CTK");
  72. }
  73. // ----------------------------------------------------------------------------
  74. void ctkMessageBoxDontShowAgainTester::init()
  75. {
  76. QSettings settings;
  77. settings.setValue("Show", int(QMessageBox::InvalidRole));
  78. settings.setValue("DontShowWithOkButton", int(QMessageBox::Ok));
  79. settings.setValue("DontShowWithAcceptRole", int(QMessageBox::AcceptRole));
  80. settings.setValue("DontShowWithCancelButton", int(QMessageBox::Cancel));
  81. settings.setValue("DontShowWithRejectRole", int(QMessageBox::RejectRole));
  82. }
  83. // ----------------------------------------------------------------------------
  84. void ctkMessageBoxDontShowAgainTester::cleanup()
  85. {
  86. QSettings settings;
  87. settings.clear();
  88. }
  89. // ----------------------------------------------------------------------------
  90. void ctkMessageBoxDontShowAgainTester::testDefaults()
  91. {
  92. ctkMessageBox messageBox;
  93. QCOMPARE(messageBox.isDontShowAgainVisible(), false);
  94. QCOMPARE(messageBox.dontShowAgain(), false);
  95. QCOMPARE(messageBox.dontShowAgainSettingsKey(), QString());
  96. QCOMPARE(messageBox.buttons().size(), 0);
  97. QCOMPARE(messageBox.standardButtons(), QMessageBox::NoButton);
  98. messageBox.show();
  99. qApp->processEvents();
  100. QCOMPARE(messageBox.buttons().size(), 1);
  101. QCOMPARE(messageBox.standardButtons(), QMessageBox::Ok);
  102. }
  103. // ----------------------------------------------------------------------------
  104. void ctkMessageBoxDontShowAgainTester::testExecMessageBox(ctkMessageBox& messageBox)
  105. {
  106. QFETCH(int, buttonOrRole);
  107. if (buttonOrRole != QMessageBox::InvalidRole)
  108. {
  109. if (messageBox.standardButtons() == QMessageBox::NoButton &&
  110. messageBox.buttons().size() == 0)
  111. {
  112. messageBox.addButton(QMessageBox::Ok);
  113. }
  114. if (messageBox.standardButtons() & buttonOrRole)
  115. {
  116. QAbstractButton* button = messageBox.button(
  117. static_cast<QMessageBox::StandardButton>(buttonOrRole));
  118. QVERIFY(button);
  119. QTimer::singleShot(0, button, SLOT(click()));
  120. }
  121. else
  122. {
  123. const char* slot = 0;
  124. if (buttonOrRole == QMessageBox::AcceptRole)
  125. {
  126. slot = SLOT(accept());
  127. }
  128. else if (buttonOrRole == QMessageBox::RejectRole)
  129. {
  130. slot = SLOT(reject());
  131. }
  132. QTimer::singleShot(0, &messageBox, slot);
  133. }
  134. }
  135. // shouldn't hang
  136. int execResult = messageBox.exec();
  137. QFETCH(int, result);
  138. QCOMPARE(execResult, result);
  139. QFETCH(QMessageBox::ButtonRole, resultRole);
  140. QCOMPARE(messageBox.buttonRole(messageBox.clickedButton()), resultRole);
  141. }
  142. // ----------------------------------------------------------------------------
  143. void ctkMessageBoxDontShowAgainTester::testDontShowAgain()
  144. {
  145. ctkMessageBox messageBox;
  146. QFETCH(bool, visible);
  147. messageBox.setDontShowAgainVisible(visible);
  148. QFETCH(bool, dontShowAgain);
  149. messageBox.setDontShowAgain(dontShowAgain);
  150. this->testExecMessageBox(messageBox);
  151. }
  152. // ----------------------------------------------------------------------------
  153. void ctkMessageBoxDontShowAgainTester::testDontShowAgain_data()
  154. {
  155. QTest::addColumn<bool>("visible");
  156. QTest::addColumn<bool>("dontShowAgain");
  157. QTest::addColumn<int>("buttonOrRole");
  158. QTest::addColumn<int>("result");
  159. QTest::addColumn<QMessageBox::ButtonRole>("resultRole");
  160. QTest::newRow("invisible dont show") << false << true << int(QMessageBox::InvalidRole) << int(QMessageBox::Ok) << QMessageBox::AcceptRole;
  161. QTest::newRow("visible dont show") << true << true << int(QMessageBox::InvalidRole) << int(QMessageBox::Ok) << QMessageBox::AcceptRole;
  162. QTest::newRow("invisible show click ok") << false << false << int(QMessageBox::Ok) << int(QMessageBox::Ok) << QMessageBox::AcceptRole;
  163. QTest::newRow("visible show click ok") << true << false << int(QMessageBox::Ok) << int(QMessageBox::Ok) << QMessageBox::AcceptRole;
  164. QTest::newRow("invisible show accept") << false << false << int(QMessageBox::AcceptRole) << int(QDialog::Accepted) << QMessageBox::InvalidRole;
  165. QTest::newRow("visible show accept") << true << false << int(QMessageBox::AcceptRole) << int(QDialog::Accepted) << QMessageBox::InvalidRole;
  166. }
  167. // ----------------------------------------------------------------------------
  168. void ctkMessageBoxDontShowAgainTester::testOkCancel()
  169. {
  170. ctkMessageBox messageBox;
  171. messageBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
  172. QFETCH(bool, visible);
  173. messageBox.setDontShowAgainVisible(visible);
  174. QFETCH(bool, dontShowAgain);
  175. messageBox.setDontShowAgain(dontShowAgain);
  176. this->testExecMessageBox(messageBox);
  177. }
  178. // ----------------------------------------------------------------------------
  179. void ctkMessageBoxDontShowAgainTester::testOkCancel_data()
  180. {
  181. this->testDontShowAgain_data();
  182. QTest::newRow("invisible show click cancel") << false << false << int(QMessageBox::Cancel) << int(QMessageBox::Cancel) << QMessageBox::RejectRole;
  183. QTest::newRow("visible show click cancel") << true << false << int(QMessageBox::Cancel) << int(QMessageBox::Cancel) << QMessageBox::RejectRole;
  184. QTest::newRow("invisible show reject") << false << false << int(QMessageBox::RejectRole) << int(QMessageBox::Rejected) << QMessageBox::InvalidRole;
  185. QTest::newRow("visible show click cancel") << true << false << int(QMessageBox::RejectRole) << int(QMessageBox::Rejected) << QMessageBox::InvalidRole;
  186. }
  187. // ----------------------------------------------------------------------------
  188. void ctkMessageBoxDontShowAgainTester::testDontShowAgainSettingsKey()
  189. {
  190. ctkMessageBox messageBox;
  191. QFETCH(bool, visible);
  192. messageBox.setDontShowAgain(visible);
  193. QFETCH(QString, key);
  194. messageBox.setDontShowAgainSettingsKey(key);
  195. QCOMPARE(messageBox.dontShowAgainSettingsKey(), key);
  196. QFETCH(bool, dontShowAgain);
  197. QCOMPARE(messageBox.dontShowAgain(), dontShowAgain);
  198. this->testExecMessageBox(messageBox);
  199. QSettings settings;
  200. QFETCH(int, keyValue);
  201. QCOMPARE(settings.value(key).toInt(), keyValue);
  202. }
  203. // ----------------------------------------------------------------------------
  204. void ctkMessageBoxDontShowAgainTester::testDontShowAgainSettingsKey_data()
  205. {
  206. QTest::addColumn<bool>("visible");
  207. QTest::addColumn<QString>("key");
  208. QTest::addColumn<bool>("dontShowAgain");
  209. QTest::addColumn<int>("buttonOrRole");
  210. QTest::addColumn<int>("result");
  211. QTest::addColumn<QMessageBox::ButtonRole>("resultRole");
  212. QTest::addColumn<int>("keyValue");
  213. QTest::newRow("invisible NonExistingKey")
  214. << false << "NonExistingKey" << false << int(QMessageBox::Ok)
  215. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  216. << int(QMessageBox::InvalidRole);
  217. QTest::newRow("visible NonExistingKey")
  218. << true << "NonExistingKey" << false << int(QMessageBox::Ok)
  219. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  220. << int(QMessageBox::InvalidRole);
  221. QTest::newRow("invisible Show")
  222. << false << "Show" << false << int(QMessageBox::Ok)
  223. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  224. << int(QMessageBox::InvalidRole);
  225. QTest::newRow("visible Show")
  226. << true << "Show" << false << int(QMessageBox::Ok)
  227. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  228. << int(QMessageBox::InvalidRole);
  229. QTest::newRow("invisible DontShow Ok")
  230. << false << "DontShowWithOkButton" << true << int(QMessageBox::InvalidRole)
  231. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  232. << int(QMessageBox::Ok);
  233. QTest::newRow("visible DontShow Ok")
  234. << true << "DontShowWithOkButton" << true << int(QMessageBox::InvalidRole)
  235. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  236. << int(QMessageBox::Ok);
  237. QTest::newRow("invisible DontShow Accept")
  238. << false << "DontShowWithAcceptRole" << true << int(QMessageBox::InvalidRole)
  239. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  240. << int(QMessageBox::Ok);
  241. QTest::newRow("visible DontShow Accept")
  242. << true << "DontShowWithAcceptRole" << true << int(QMessageBox::InvalidRole)
  243. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  244. << int(QMessageBox::Ok);
  245. }
  246. // ----------------------------------------------------------------------------
  247. void ctkMessageBoxDontShowAgainTester::testDontShowAgainSettingsKeyOkCancel()
  248. {
  249. ctkMessageBox messageBox;
  250. messageBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
  251. QFETCH(bool, visible);
  252. messageBox.setDontShowAgain(visible);
  253. QFETCH(QString, key);
  254. messageBox.setDontShowAgainSettingsKey(key);
  255. QCOMPARE(messageBox.dontShowAgainSettingsKey(), key);
  256. QFETCH(bool, dontShowAgain);
  257. QCOMPARE(messageBox.dontShowAgain(), dontShowAgain);
  258. this->testExecMessageBox(messageBox);
  259. QSettings settings;
  260. QFETCH(int, keyValue);
  261. QCOMPARE(settings.value(key).toInt(), keyValue);
  262. }
  263. // ----------------------------------------------------------------------------
  264. void ctkMessageBoxDontShowAgainTester::testDontShowAgainSettingsKeyOkCancel_data()
  265. {
  266. this->testDontShowAgainSettingsKey_data();
  267. QTest::newRow("invisible DontShow Cancel")
  268. << false << "DontShowWithCancelButton" << true << int(QMessageBox::InvalidRole)
  269. << int(QMessageBox::Cancel) << QMessageBox::RejectRole
  270. << int(QMessageBox::Cancel);
  271. QTest::newRow("visible DontShow Cancel")
  272. << true << "DontShowWithCancelButton" << true << int(QMessageBox::InvalidRole)
  273. << int(QMessageBox::Cancel) << QMessageBox::RejectRole
  274. << int(QMessageBox::Cancel);
  275. QTest::newRow("invisible DontShow Reject")
  276. << false << "DontShowWithRejectRole" << true << int(QMessageBox::InvalidRole)
  277. << int(QMessageBox::Cancel) << QMessageBox::RejectRole
  278. << int(QMessageBox::RejectRole);
  279. QTest::newRow("visible DontShow Reject")
  280. << true << "DontShowWithRejectRole" << true << int(QMessageBox::InvalidRole)
  281. << int(QMessageBox::Cancel) << QMessageBox::RejectRole
  282. << int(QMessageBox::RejectRole);
  283. }
  284. // ----------------------------------------------------------------------------
  285. void ctkMessageBoxDontShowAgainTester::testDontShowAgainSettingsKeySetDontShowAgain()
  286. {
  287. ctkMessageBox messageBox;
  288. messageBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
  289. QFETCH(QString, key);
  290. messageBox.setDontShowAgainSettingsKey(key);
  291. QCOMPARE(messageBox.dontShowAgainSettingsKey(), key);
  292. QFETCH(bool, dontShowAgain);
  293. messageBox.setDontShowAgain(dontShowAgain);
  294. this->testExecMessageBox(messageBox);
  295. QSettings settings;
  296. QFETCH(int, keyValue);
  297. QCOMPARE(settings.value(key).toInt(), keyValue);
  298. }
  299. // ----------------------------------------------------------------------------
  300. void ctkMessageBoxDontShowAgainTester::testDontShowAgainSettingsKeySetDontShowAgain_data()
  301. {
  302. QTest::addColumn<QString>("key");
  303. QTest::addColumn<bool>("dontShowAgain");
  304. QTest::addColumn<int>("buttonOrRole");
  305. QTest::addColumn<int>("result");
  306. QTest::addColumn<QMessageBox::ButtonRole>("resultRole");
  307. QTest::addColumn<int>("keyValue");
  308. // Doesn't have time to click on anything, the dialog is already skipped
  309. QTest::newRow("NonExistingKey dont show again")
  310. << "NonExistingKey" << true << int(QMessageBox::InvalidRole)
  311. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  312. << int(QMessageBox::Ok);
  313. QTest::newRow("Show dont show again accept")
  314. << "Show" << true << int(QMessageBox::InvalidRole)
  315. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  316. << int(QMessageBox::Ok);
  317. QTest::newRow("NonExistingKey show again accept")
  318. << "NonExistingKey" << false << int(QMessageBox::Ok)
  319. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  320. << int(QMessageBox::InvalidRole);
  321. // ctkMessageBox never write the settings.
  322. QTest::newRow("NonExistingKey show again reject")
  323. << "NonExistingKey" << false << int(QMessageBox::Cancel)
  324. << int(QMessageBox::Cancel) << QMessageBox::RejectRole
  325. << QVariant().toInt();
  326. QTest::newRow("Show show again accept")
  327. << "Show" << false << int(QMessageBox::Ok)
  328. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  329. << int(QMessageBox::InvalidRole);
  330. // ctkMessageBox never write the settings but the settings exists.
  331. QTest::newRow("Show dont show reject")
  332. << "Show" << false << int(QMessageBox::Cancel)
  333. << int(QMessageBox::Cancel) << QMessageBox::RejectRole
  334. << int(QMessageBox::InvalidRole);
  335. QTest::newRow("Show show again accept")
  336. << "DontShowWithOkButton" << false << int(QMessageBox::Ok)
  337. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  338. << int(QMessageBox::InvalidRole);
  339. QTest::newRow("Show dont show reject")
  340. << "DontShowWithOkButton" << false << int(QMessageBox::Cancel)
  341. << int(QMessageBox::Cancel) << QMessageBox::RejectRole
  342. << int(QMessageBox::Ok);
  343. }
  344. // ----------------------------------------------------------------------------
  345. void ctkMessageBoxDontShowAgainTester::testDontShowAgainSettingsKeyClickDontShowAgain()
  346. {
  347. ctkMessageBox messageBox;
  348. messageBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
  349. QFETCH(QString, key);
  350. messageBox.setDontShowAgainSettingsKey(key);
  351. QCOMPARE(messageBox.dontShowAgainSettingsKey(), key);
  352. QFETCH(bool, dontShowAgain);
  353. QCheckBox* checkBox =
  354. messageBox.findChild<QCheckBox*>("ctk_msgbox_dontshowcheckbox");
  355. QMetaObject::invokeMethod(checkBox, "setChecked", Qt::QueuedConnection,
  356. Q_ARG(bool, dontShowAgain));
  357. this->testExecMessageBox(messageBox);
  358. QSettings settings;
  359. QFETCH(int, keyValue);
  360. QCOMPARE(settings.value(key).toInt(), keyValue);
  361. }
  362. // ----------------------------------------------------------------------------
  363. void ctkMessageBoxDontShowAgainTester::testDontShowAgainSettingsKeyClickDontShowAgain_data()
  364. {
  365. QTest::addColumn<QString>("key");
  366. QTest::addColumn<bool>("dontShowAgain");
  367. QTest::addColumn<int>("buttonOrRole");
  368. QTest::addColumn<int>("result");
  369. QTest::addColumn<QMessageBox::ButtonRole>("resultRole");
  370. QTest::addColumn<int>("keyValue");
  371. QTest::newRow("NonExistingKey dont show again ok")
  372. << "NonExistingKey" << true << int(QMessageBox::Ok)
  373. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  374. << int(QMessageBox::Ok);
  375. QTest::newRow("NonExistingKey dont show again cancel")
  376. << "NonExistingKey" << true << int(QMessageBox::Cancel)
  377. << int(QMessageBox::Cancel) << QMessageBox::RejectRole
  378. << QVariant().toInt();
  379. QTest::newRow("Show dont show again accept")
  380. << "Show" << true << int(QMessageBox::Ok)
  381. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  382. << int(QMessageBox::Ok);
  383. QTest::newRow("Show dont show again cancel")
  384. << "Show" << true << int(QMessageBox::Cancel)
  385. << int(QMessageBox::Cancel) << QMessageBox::RejectRole
  386. << int(QMessageBox::InvalidRole);
  387. QTest::newRow("NonExistingKey show again accept")
  388. << "NonExistingKey" << false << int(QMessageBox::Ok)
  389. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  390. << int(QMessageBox::InvalidRole);
  391. QTest::newRow("NonExistingKey show again reject")
  392. << "NonExistingKey" << false << int(QMessageBox::Cancel)
  393. << int(QMessageBox::Cancel) << QMessageBox::RejectRole
  394. << QVariant().toInt();
  395. QTest::newRow("Show show again accept")
  396. << "Show" << false << int(QMessageBox::Ok)
  397. << int(QMessageBox::Ok) << QMessageBox::AcceptRole
  398. << int(QMessageBox::InvalidRole);
  399. QTest::newRow("Show dont show reject")
  400. << "Show" << false << int(QMessageBox::Cancel)
  401. << int(QMessageBox::Cancel) << QMessageBox::RejectRole
  402. << int(QMessageBox::InvalidRole);
  403. }
  404. // ----------------------------------------------------------------------------
  405. void ctkMessageBoxDontShowAgainTester::testConfirmExit()
  406. {
  407. QFETCH(QString, key);
  408. bool res = ctkMessageBox::confirmExit(key);
  409. QFETCH(bool, expectedRes);
  410. QCOMPARE(res, expectedRes);
  411. }
  412. // ----------------------------------------------------------------------------
  413. void ctkMessageBoxDontShowAgainTester::testConfirmExit_data()
  414. {
  415. QTest::addColumn<QString>("key");
  416. QTest::addColumn<bool>("expectedRes");
  417. QTest::newRow("DontShowWithOkButton") << "DontShowWithOkButton" << true;
  418. QTest::newRow("DontShowWithAcceptRole") << "DontShowWithAcceptRole" << true;
  419. QTest::newRow("DontShowWithCancelButton") << "DontShowWithCancelButton" << false;
  420. QTest::newRow("DontShowWithRejectRole") << "DontShowWithRejectRole" << false;
  421. }
  422. // ----------------------------------------------------------------------------
  423. CTK_TEST_MAIN(ctkMessageBoxDontShowAgainTest)
  424. #include "moc_ctkMessageBoxDontShowAgainTest.cpp"