ctkSettingsPanelTest1.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  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 <QLineEdit>
  18. #include <QSettings>
  19. #include <QTimer>
  20. #include <QVariant>
  21. // CTK includes
  22. #include "ctkBooleanMapper.h"
  23. #include "ctkCoreTestingMacros.h"
  24. #include "ctkSettingsPanel.h"
  25. #include "ctkSettingsPanelTest2Helper.h"
  26. // STD includes
  27. #include <cstdlib>
  28. #include <iostream>
  29. namespace
  30. {
  31. //-----------------------------------------------------------------------------
  32. class ctkSettingsPanelForTest : public ctkSettingsPanel
  33. {
  34. public:
  35. QVariant myDefaultPropertyValue(const QString& key) const
  36. {
  37. return this->defaultPropertyValue(key);
  38. }
  39. QVariant myPreviousPropertyValue(const QString& key) const
  40. {
  41. return this->previousPropertyValue(key);
  42. }
  43. QVariant myPropertyValue(const QString& key) const
  44. {
  45. return this->propertyValue(key);
  46. }
  47. };
  48. } // end of anonymous namespace
  49. //-----------------------------------------------------------------------------
  50. int ctkSettingsPanelTest1(int argc, char * argv [] )
  51. {
  52. QApplication app(argc, argv);
  53. QSettings settings(QSettings::IniFormat, QSettings::UserScope, "Common ToolKit", "CTK");
  54. settings.clear();
  55. ctkSettingsPanelForTest settingsPanel;
  56. settingsPanel.setSettings(&settings);
  57. //
  58. // QCheckBox
  59. //
  60. QCheckBox* box = new QCheckBox(&settingsPanel);
  61. settingsPanel.registerProperty("key 1", box, "checked",
  62. SIGNAL(toggled(bool)));
  63. // Check settings value after a property is registered
  64. QVariant boxVal = settings.value("key 1");
  65. CHECK_BOOL(boxVal.isValid(), true);
  66. CHECK_QVARIANT(boxVal, QVariant(false));
  67. CHECK_BOOL(boxVal.toBool(), false);
  68. CHECK_BOOL(settingsPanel.myPreviousPropertyValue("key 1").toBool(), false);
  69. CHECK_BOOL(settingsPanel.myPropertyValue("key 1").toBool(), false);
  70. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList());
  71. // Update value using the object/widget API
  72. box->setChecked(true);
  73. // Check settings value after it has been updated using object/widget API
  74. boxVal = settings.value("key 1");
  75. CHECK_BOOL(boxVal.isValid(), true);
  76. CHECK_QVARIANT(boxVal, QVariant(true));
  77. CHECK_BOOL(boxVal.toBool(), true);
  78. CHECK_BOOL(settingsPanel.myPreviousPropertyValue("key 1").toBool(), false);
  79. CHECK_BOOL(settingsPanel.myPropertyValue("key 1").toBool(), true);
  80. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList() << "key 1");
  81. // Check settings value after applySettings() has been called
  82. settingsPanel.applySettings();
  83. boxVal = settings.value("key 1");
  84. CHECK_BOOL(boxVal.isValid(), true);
  85. CHECK_QVARIANT(boxVal, QVariant(true));
  86. CHECK_BOOL(boxVal.toBool(), true);
  87. CHECK_BOOL(settingsPanel.myPreviousPropertyValue("key 1").toBool(), true);
  88. CHECK_BOOL(settingsPanel.myDefaultPropertyValue("key 1").toBool(), false);
  89. CHECK_BOOL(settingsPanel.myPropertyValue("key 1").toBool(), true);
  90. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList());
  91. //
  92. // QLineEdit
  93. //
  94. QLineEdit* lineEdit = new QLineEdit("default", &settingsPanel);
  95. settingsPanel.registerProperty("key 2", lineEdit, "text",
  96. SIGNAL(textChanged(QString)));
  97. // Check value after a property is registered
  98. QVariant lineEditVal = settings.value("key 2");
  99. CHECK_BOOL(lineEditVal.isValid(), true);
  100. CHECK_QVARIANT(lineEditVal, QVariant("default"));
  101. CHECK_QSTRING(lineEditVal.toString(), QString("default"));
  102. CHECK_QSTRING(settingsPanel.myPreviousPropertyValue("key 2").toString(), QString("default"));
  103. CHECK_QSTRING(settingsPanel.myDefaultPropertyValue("key 2").toString(), QString("default"));
  104. CHECK_QSTRING(settingsPanel.myPropertyValue("key 2").toString(), QString("default"));
  105. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList());
  106. // Update value using the object/widget API
  107. lineEdit->setText("first edit");
  108. // Check settings value after it has been updated using object/widget API
  109. lineEditVal = settings.value("key 2");
  110. CHECK_BOOL(lineEditVal.isValid(), true);
  111. CHECK_QVARIANT(lineEditVal, QVariant("first edit"));
  112. CHECK_QSTRING(lineEditVal.toString(), QString("first edit"));
  113. CHECK_QSTRING(settingsPanel.myPreviousPropertyValue("key 2").toString(), QString("default"));
  114. CHECK_QSTRING(settingsPanel.myDefaultPropertyValue("key 2").toString(), QString("default"));
  115. CHECK_QSTRING(settingsPanel.myPropertyValue("key 2").toString(), QString("first edit"));
  116. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList() << "key 2");
  117. // Check settings value after applySettings() has been called
  118. settingsPanel.applySettings();
  119. lineEditVal = settings.value("key 2");
  120. CHECK_BOOL(lineEditVal.isValid(), true);
  121. CHECK_QVARIANT(lineEditVal, QVariant("first edit"));
  122. CHECK_QSTRING(lineEditVal.toString(), QString("first edit"));
  123. CHECK_QSTRING(settingsPanel.myPreviousPropertyValue("key 2").toString(), QString("first edit"));
  124. CHECK_QSTRING(settingsPanel.myDefaultPropertyValue("key 2").toString(), QString("default"));
  125. CHECK_QSTRING(settingsPanel.myPropertyValue("key 2").toString(), QString("first edit"));
  126. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList());
  127. // Update value using the object/widget API
  128. lineEdit->setText("second edit");
  129. // Check settings value after it has been updated using object/widget API
  130. lineEditVal = settings.value("key 2");
  131. CHECK_BOOL(lineEditVal.isValid(), true);
  132. CHECK_QVARIANT(lineEditVal, QVariant("second edit"));
  133. CHECK_QSTRING(lineEditVal.toString(), QString("second edit"));
  134. CHECK_QSTRING(settingsPanel.myPreviousPropertyValue("key 2").toString(), QString("first edit"));
  135. CHECK_QSTRING(settingsPanel.myDefaultPropertyValue("key 2").toString(), QString("default"));
  136. CHECK_QSTRING(settingsPanel.myPropertyValue("key 2").toString(), QString("second edit"));
  137. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList() << "key 2");
  138. // Check settings value after applySettings() has been called
  139. settingsPanel.applySettings();
  140. lineEditVal = settings.value("key 2");
  141. CHECK_BOOL(lineEditVal.isValid(), true);
  142. CHECK_QVARIANT(lineEditVal, QVariant("second edit"));
  143. CHECK_QSTRING(lineEditVal.toString(), QString("second edit"));
  144. CHECK_QSTRING(settingsPanel.myPreviousPropertyValue("key 2").toString(), QString("second edit"));
  145. CHECK_QSTRING(settingsPanel.myDefaultPropertyValue("key 2").toString(), QString("default"));
  146. CHECK_QSTRING(settingsPanel.myPropertyValue("key 2").toString(), QString("second edit"));
  147. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList());
  148. //
  149. // QCheckBox + ctkBooleanMapper
  150. //
  151. box = new QCheckBox(&settingsPanel);
  152. settingsPanel.registerProperty("key complement",
  153. new ctkBooleanMapper(box, "checked", SIGNAL(toggled(bool))),
  154. "complement",
  155. SIGNAL(complementChanged(bool)));
  156. // Check settings value after a property is registered
  157. boxVal = settings.value("key complement");
  158. CHECK_BOOL(boxVal.isValid(), true);
  159. CHECK_QVARIANT(boxVal, QVariant(true));
  160. CHECK_BOOL(boxVal.toBool(), true);
  161. CHECK_BOOL(settingsPanel.myPreviousPropertyValue("key complement").toBool(), true);
  162. CHECK_BOOL(settingsPanel.myPropertyValue("key complement").toBool(), true);
  163. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList());
  164. // Update value using the object/widget API
  165. box->setChecked(true);
  166. // Check settings value after it has been updated using object/widget API
  167. boxVal = settings.value("key complement");
  168. CHECK_BOOL(boxVal.isValid(), true);
  169. CHECK_QVARIANT(boxVal, QVariant(false));
  170. CHECK_BOOL(boxVal.toBool(), false);
  171. CHECK_BOOL(settingsPanel.myPreviousPropertyValue("key complement").toBool(), true);
  172. CHECK_BOOL(settingsPanel.myPropertyValue("key complement").toBool(), false);
  173. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList() << "key complement");
  174. // Check settings value after applySettings() has been called
  175. settingsPanel.applySettings();
  176. boxVal = settings.value("key complement");
  177. CHECK_BOOL(boxVal.isValid(), true);
  178. CHECK_QVARIANT(boxVal, QVariant(false));
  179. CHECK_BOOL(boxVal.toBool(), false);
  180. CHECK_BOOL(settingsPanel.myPreviousPropertyValue("key complement").toBool(), false);
  181. CHECK_BOOL(settingsPanel.myDefaultPropertyValue("key complement").toBool(), true);
  182. CHECK_BOOL(settingsPanel.myPropertyValue("key complement").toBool(), false);
  183. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList());
  184. //
  185. // ctkSettingsPanelTest2Helper: Test QStringList property
  186. //
  187. ctkSettingsPanelTest2Helper* list = new ctkSettingsPanelTest2Helper(&settingsPanel);
  188. settingsPanel.registerProperty("key list", list, "list",
  189. SIGNAL(listChanged()));
  190. // Check value after a property is registered
  191. QVariant listVal = settings.value("key list");
  192. CHECK_BOOL(listVal.isValid(), true);
  193. CHECK_QVARIANT(listVal, QVariant(QStringList()));
  194. CHECK_QSTRINGLIST(listVal.toStringList(), QStringList());
  195. CHECK_QSTRINGLIST(settingsPanel.myPreviousPropertyValue("key list").toStringList(), QStringList());
  196. CHECK_QSTRINGLIST(settingsPanel.myDefaultPropertyValue("key list").toStringList(), QStringList());
  197. CHECK_QSTRINGLIST(settingsPanel.myPropertyValue("key list").toStringList(), QStringList());
  198. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList());
  199. // Update value using the object/widget API: Add one item
  200. list->setList(QStringList() << "first item");
  201. // Check settings value after it has been updated using object/widget API
  202. listVal = settings.value("key list");
  203. CHECK_BOOL(listVal.isValid(), true);
  204. CHECK_QVARIANT(listVal, QVariant(QStringList() << "first item"));
  205. CHECK_QSTRINGLIST(listVal.toStringList(), QStringList() << "first item");
  206. CHECK_QSTRINGLIST(settingsPanel.myPreviousPropertyValue("key list").toStringList(), QStringList());
  207. CHECK_QSTRINGLIST(settingsPanel.myDefaultPropertyValue("key list").toStringList(), QStringList());
  208. CHECK_QSTRINGLIST(settingsPanel.myPropertyValue("key list").toStringList(), QStringList() << "first item");
  209. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList() << "key list");
  210. // Check settings value after applySettings() has been called
  211. settingsPanel.applySettings();
  212. listVal = settings.value("key list");
  213. CHECK_BOOL(listVal.isValid(), true);
  214. CHECK_QVARIANT(listVal, QVariant(QStringList() << "first item"));
  215. CHECK_QSTRINGLIST(listVal.toStringList(), QStringList() << "first item");
  216. CHECK_QSTRINGLIST(settingsPanel.myPreviousPropertyValue("key list").toStringList(), QStringList() << "first item");
  217. CHECK_QSTRINGLIST(settingsPanel.myDefaultPropertyValue("key list").toStringList(), QStringList());
  218. CHECK_QSTRINGLIST(settingsPanel.myPropertyValue("key list").toStringList(), QStringList() << "first item");
  219. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList());
  220. // Update value using the object/widget API: Add one other item
  221. list->setList(QStringList() << "first item" << "second item");
  222. // Check settings value after it has been updated using object/widget API
  223. listVal = settings.value("key list");
  224. CHECK_BOOL(listVal.isValid(), true);
  225. CHECK_QVARIANT(listVal, QVariant(QStringList() << "first item" << "second item"));
  226. CHECK_QSTRINGLIST(listVal.toStringList(), QStringList() << "first item" << "second item");
  227. CHECK_QSTRINGLIST(settingsPanel.myPreviousPropertyValue("key list").toStringList(), QStringList() << "first item");
  228. CHECK_QSTRINGLIST(settingsPanel.myDefaultPropertyValue("key list").toStringList(), QStringList());
  229. CHECK_QSTRINGLIST(settingsPanel.myPropertyValue("key list").toStringList(), QStringList() << "first item" << "second item");
  230. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList() << "key list");
  231. // Check settings value after applySettings() has been called
  232. settingsPanel.applySettings();
  233. listVal = settings.value("key list");
  234. CHECK_BOOL(listVal.isValid(), true);
  235. CHECK_QVARIANT(listVal, QVariant(QStringList() << "first item" << "second item"));
  236. CHECK_QSTRINGLIST(listVal.toStringList(), QStringList() << "first item" << "second item");
  237. CHECK_QSTRINGLIST(settingsPanel.myPreviousPropertyValue("key list").toStringList(), QStringList() << "first item" << "second item");
  238. CHECK_QSTRINGLIST(settingsPanel.myDefaultPropertyValue("key list").toStringList(), QStringList());
  239. CHECK_QSTRINGLIST(settingsPanel.myPropertyValue("key list").toStringList(), QStringList() << "first item" << "second item");
  240. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList());
  241. // Update value using the object/widget API: Remove items
  242. list->setList(QStringList());
  243. // Check settings value after it has been updated using object/widget API
  244. listVal = settings.value("key list");
  245. CHECK_BOOL(listVal.isValid(), true);
  246. CHECK_QVARIANT(listVal, QVariant(QStringList()));
  247. CHECK_QSTRINGLIST(listVal.toStringList(), QStringList());
  248. CHECK_QSTRINGLIST(settingsPanel.myPreviousPropertyValue("key list").toStringList(), QStringList() << "first item" << "second item");
  249. CHECK_QSTRINGLIST(settingsPanel.myDefaultPropertyValue("key list").toStringList(), QStringList());
  250. CHECK_QSTRINGLIST(settingsPanel.myPropertyValue("key list").toStringList(), QStringList());
  251. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList() << "key list");
  252. // Check settings value after applySettings() has been called
  253. settingsPanel.applySettings();
  254. listVal = settings.value("key list");
  255. CHECK_BOOL(listVal.isValid(), true);
  256. CHECK_QVARIANT(listVal, QVariant(QStringList()));
  257. CHECK_QSTRINGLIST(listVal.toStringList(), QStringList());
  258. CHECK_QSTRINGLIST(settingsPanel.myPreviousPropertyValue("key list").toStringList(), QStringList());
  259. CHECK_QSTRINGLIST(settingsPanel.myDefaultPropertyValue("key list").toStringList(), QStringList());
  260. CHECK_QSTRINGLIST(settingsPanel.myPropertyValue("key list").toStringList(), QStringList());
  261. CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList());
  262. settingsPanel.show();
  263. if (argc < 2 || QString(argv[1]) != "-I" )
  264. {
  265. QTimer::singleShot(200, &app, SLOT(quit()));
  266. }
  267. return app.exec();
  268. }