ctkVTKCommandOptionsTest1.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. /*=========================================================================
  2. Library: CTK
  3. Copyright (c) 2010 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.commontk.org/LICENSE
  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 <QCoreApplication>
  16. #include <QSettings>
  17. #include <QStringList>
  18. #include <QList>
  19. #include <QFile>
  20. #include <QDebug>
  21. // CTK includes
  22. #include "ctkVTKCommandOptions.h"
  23. #include "ctkVisualizationVTKCoreCppTestsConfigure.h"
  24. // STD includes
  25. #include <cstdlib>
  26. #include <iostream>
  27. //-----------------------------------------------------------------------------
  28. namespace
  29. {
  30. class ctkVTKCommandOptionsTest : public ctkVTKCommandOptions
  31. {
  32. public:
  33. typedef ctkVTKCommandOptions Superclass;
  34. ctkVTKCommandOptionsTest(QSettings* _settings):Superclass(_settings)
  35. {
  36. this->AwesomeTestEnabled = false;
  37. this->CurrentSettingsDisabled = false;
  38. this->TestIfCommandLineOverwriteSettings = false;
  39. this->TestIfDisableSettingsFlagWorks = false;
  40. this->GenerateTestData = false;
  41. this->TestIfIgnoreRestFlagWorks = false;
  42. }
  43. virtual ~ctkVTKCommandOptionsTest(){}
  44. // Added as public member for testing purposes ...
  45. bool AwesomeTestEnabled;
  46. bool CurrentSettingsDisabled;
  47. bool TestIfCommandLineOverwriteSettings;
  48. bool TestIfDisableSettingsFlagWorks;
  49. bool TestIfIgnoreRestFlagWorks;
  50. bool GenerateTestData;
  51. QString WrongArgument;
  52. QStringList MyListOfStrings;
  53. QString MyString;
  54. // Convenient method allowing to generate a INI file
  55. void generateIniFile()
  56. {
  57. std::cout << "Saving test data:" << CTKVTKCOMMANDOPTIONSTEST_SETTINGS << std::endl;
  58. QSettings newSettings(CTKVTKCOMMANDOPTIONSTEST_SETTINGS, QSettings::IniFormat);
  59. newSettings.clear();
  60. newSettings.setValue("enable-awesome-test", QVariant(true));
  61. newSettings.setValue("my-string", QVariant("Testing rocks !"));
  62. QStringList mystringlist;
  63. mystringlist << "Testing"; mystringlist << " is "; mystringlist << "awesome !";
  64. newSettings.setValue("my-list-of-strings", QVariant(mystringlist));
  65. }
  66. virtual void printAdditionalInfo()
  67. {
  68. Superclass::printAdditionalInfo();
  69. qDebug() << "ctkVTKCommandOptionsTest:" << this << endl
  70. << " CurrentSettingsDisabled:" << this->CurrentSettingsDisabled << endl
  71. << " WrongArgument:" << this->WrongArgument << endl
  72. << " TestIfCommandLineOverwriteSettings:" << this->TestIfCommandLineOverwriteSettings << endl
  73. << " TestIfDisableSettingsFlagWorks:" << this->TestIfDisableSettingsFlagWorks << endl
  74. << " TestIfIgnoreRestFlagWorks:" << this->TestIfIgnoreRestFlagWorks << endl
  75. << " GenerateTestData:" << this->GenerateTestData << endl
  76. << " SettingsFile:" << CTKVTKCOMMANDOPTIONSTEST_SETTINGS << endl
  77. << " MyListOfStrings:" << this->MyListOfStrings << endl
  78. << " MyString:" << this->MyString << endl;
  79. }
  80. protected:
  81. /// Initialize arguments
  82. virtual void initialize()
  83. {
  84. this->Superclass::initialize();
  85. this->addBooleanArgument("--enable-awesome-test", "-eat", &this->AwesomeTestEnabled,
  86. "Enables awesome test.");
  87. this->addBooleanArgument("--test-if-commandline-overwrite-settings", 0,
  88. &this->TestIfCommandLineOverwriteSettings,
  89. "Should we test if QListString setting is overwriten by the "
  90. "corresponding command line argument.");
  91. this->addBooleanArgument("--test-if-disablesettings-flag-works", 0,
  92. &this->TestIfDisableSettingsFlagWorks,
  93. "Indicates if '--disable-settings' flags should be tested.");
  94. this->addBooleanArgument("--test-if-ignorerest-flag-works", 0,
  95. &this->TestIfIgnoreRestFlagWorks,
  96. "Indicates if '--ignore-rest' flags should be tested.");
  97. this->addBooleanArgument("--generate-test-data", 0, &this->GenerateTestData,
  98. "Generates test data and save it to the file specified using '--settings-file'");
  99. this->addArgument("--my-list-of-strings", "-mlos", &this->MyListOfStrings,
  100. "My list of strings.");
  101. this->addArgument("--my-string", "-ms", &this->MyString,
  102. "My string.");
  103. }
  104. // Disable current settings
  105. virtual void disableCurrentSettings()
  106. {
  107. this->CurrentSettingsDisabled = true;
  108. }
  109. /// This method is called when wrong argument is found. If it returns False, then
  110. /// the parsing will fail.
  111. virtual bool wrongArgument(const char* argument)
  112. {
  113. this->WrongArgument = QLatin1String(argument);
  114. return false;
  115. }
  116. };
  117. }
  118. //-----------------------------------------------------------------------------
  119. int ctkVTKCommandOptionsTest1(int argc, char * argv [] )
  120. {
  121. QCoreApplication app(argc, argv);
  122. app.setOrganizationName("ctkVisualizationVTKCoreCppTests");
  123. app.setApplicationName("ctkVTKCommandOptionsTest1");
  124. // Check if settings file exists
  125. if (!QFile::exists(CTKVTKCOMMANDOPTIONSTEST_SETTINGS))
  126. {
  127. std::cerr << "Problem with configuration of the test - "
  128. << "Settings file doesn't exist: [" << CTKVTKCOMMANDOPTIONSTEST_SETTINGS << "]" << std::endl;
  129. return EXIT_FAILURE;
  130. }
  131. //std::cout << "CTKVTKCOMMANDOPTIONSTEST_SETTINGS:" << CTKVTKCOMMANDOPTIONSTEST_SETTINGS << std::endl;
  132. QSettings setting(CTKVTKCOMMANDOPTIONSTEST_SETTINGS, QSettings::IniFormat);
  133. ctkVTKCommandOptionsTest commandOptions(&setting);
  134. if (!commandOptions.parse(argc, argv))
  135. {
  136. commandOptions.printAdditionalInfo();
  137. std::cerr << "Problem parsing command line arguments. Try with --help." << std::endl;
  138. return EXIT_FAILURE;
  139. }
  140. if (commandOptions.helpSelected())
  141. {
  142. std::cout << commandOptions.help().toStdString() << std::endl;
  143. return EXIT_SUCCESS;
  144. }
  145. // Convenient flags allowing to generate test data
  146. if (commandOptions.GenerateTestData)
  147. {
  148. commandOptions.generateIniFile();
  149. return EXIT_SUCCESS;
  150. }
  151. // Test if '--ignore-rest' flag works
  152. if (commandOptions.TestIfIgnoreRestFlagWorks)
  153. {
  154. if (!commandOptions.ignoreRest())
  155. {
  156. commandOptions.printAdditionalInfo();
  157. std::cerr << "Error with parse() function - ignoreRest() should return True" << std::endl;
  158. return EXIT_FAILURE;
  159. }
  160. QStringList _ignoreArguments = commandOptions.ignoredArguments();
  161. if (_ignoreArguments.size() != 3)
  162. {
  163. commandOptions.printAdditionalInfo();
  164. std::cerr << "Error with parse() function - "
  165. << "ignoredArguments() returns an incorrect QStringList." << std::endl
  166. << " expected size: 3" << std::endl
  167. << " current size: " << _ignoreArguments.size() << std::endl;
  168. return EXIT_FAILURE;
  169. }
  170. if (_ignoreArguments[0] != "--nothing=foo" ||
  171. _ignoreArguments[1] != "extra1" ||
  172. _ignoreArguments[2] != "/?")
  173. {
  174. commandOptions.printAdditionalInfo();
  175. std::cerr << "Error with parse() function - "
  176. << "Content of list returned by ignoredArguments() is incorrect" << std::endl
  177. << "expected[0] => [--nothing=foo]" << std::endl
  178. << "expected[1] => [extra1]" << std::endl
  179. << "expected[2] => [/?]" << std::endl;
  180. for(int i=0; i < _ignoreArguments.size(); ++i)
  181. {
  182. std::cerr << "ignoreArguments[" << i << "] => ["
  183. << qPrintable(_ignoreArguments[i]) << "]" << std::endl;
  184. }
  185. return EXIT_FAILURE;
  186. }
  187. }
  188. else
  189. {
  190. if (commandOptions.ignoreRest())
  191. {
  192. commandOptions.printAdditionalInfo();
  193. std::cerr << "Error with parse() function - ignoreRest() should return False" << std::endl;
  194. return EXIT_FAILURE;
  195. }
  196. QStringList _ignoreArguments = commandOptions.ignoredArguments();
  197. if (_ignoreArguments.size() != 0)
  198. {
  199. commandOptions.printAdditionalInfo();
  200. std::cerr << "Error with parse() function - "
  201. << "ignoredArguments() returns an incorrect QStringList." << std::endl
  202. << " expected size: 0" << std::endl
  203. << " current size: " << _ignoreArguments.size() << std::endl;
  204. return EXIT_FAILURE;
  205. }
  206. }
  207. // Test if '--disable-settings' flag works
  208. if (commandOptions.TestIfDisableSettingsFlagWorks)
  209. {
  210. if (!commandOptions.CurrentSettingsDisabled)
  211. {
  212. commandOptions.printAdditionalInfo();
  213. std::cerr << "Error with parse() function - Settings should be disabled" << std::endl;
  214. return EXIT_FAILURE;
  215. }
  216. return EXIT_SUCCESS;
  217. }
  218. // Test case when a wrong argument is a parsing error
  219. // if (commandOptions.TestIfDisableSettingsFlagWorks)
  220. // {
  221. // if (!commandOptions.CurrentSettingsDisabled)
  222. // {
  223. // std::cerr << "Error with parse() function - Settings should be disabled" << std::endl;
  224. // return EXIT_FAILURE;
  225. // }
  226. // return EXIT_SUCCESS;
  227. // }
  228. // Since MyListOfStringss should have been updated using the settings file,
  229. // let's check if MyListOfStrings has the expected size
  230. if (commandOptions.MyListOfStrings.size() != 3)
  231. {
  232. commandOptions.printAdditionalInfo();
  233. std::cerr << "Error with parse() function - "
  234. << "MyListOfStrings expected size is 3 - Current size: "
  235. << commandOptions.MyListOfStrings.size() << std::endl;
  236. for(int i=0; i < commandOptions.MyListOfStrings.size(); ++i)
  237. {
  238. std::cerr << "MyListOfStrings[" << i << "] => ["
  239. << qPrintable(commandOptions.MyListOfStrings[i]) << "]" << std::endl;
  240. }
  241. return EXIT_FAILURE;
  242. }
  243. // Test if command line argument overwrite settings
  244. if (commandOptions.TestIfCommandLineOverwriteSettings)
  245. {
  246. if (commandOptions.MyListOfStrings[0] != "Testing with" ||
  247. commandOptions.MyListOfStrings[1] != " cmake is " ||
  248. commandOptions.MyListOfStrings[2] != "super awesome !")
  249. {
  250. commandOptions.printAdditionalInfo();
  251. std::cerr << "Error with parse() function - "
  252. << "Content of MyListOfStrings is incorrect" << std::endl
  253. << "expected[0] => [Testing with]" << std::endl
  254. << "expected[1] => [ cmake is ]" << std::endl
  255. << "expected[2] => [super awesome !]" << std::endl;
  256. for(int i=0; i < commandOptions.MyListOfStrings.size(); ++i)
  257. {
  258. std::cerr << "MyListOfStrings[" << i << "] => ["
  259. << qPrintable(commandOptions.MyListOfStrings[i]) << "]" << std::endl;
  260. }
  261. return EXIT_FAILURE;
  262. }
  263. // Check MyString value
  264. if (commandOptions.MyString != "CMake rocks !")
  265. {
  266. commandOptions.printAdditionalInfo();
  267. std::cerr << "Error with parse() function - Content of MyString is incorrect" << std::endl
  268. << "expected value is [CMake rocks !]" << std::endl
  269. << "current value is [" << qPrintable(commandOptions.MyString) << "]" << std::endl;
  270. }
  271. return EXIT_SUCCESS;
  272. }
  273. else
  274. {
  275. if (commandOptions.MyListOfStrings[0] != "Testing" ||
  276. commandOptions.MyListOfStrings[1] != " is " ||
  277. commandOptions.MyListOfStrings[2] != "awesome !")
  278. {
  279. commandOptions.printAdditionalInfo();
  280. std::cerr << "Error with parse() function - "
  281. << "Content of MyListOfStrings is incorrect" << std::endl
  282. << "expected[0] => [Testing]" << std::endl
  283. << "expected[1] => [ is ]" << std::endl
  284. << "expected[2] => [awesome !]" << std::endl;
  285. for(int i=0; i < commandOptions.MyListOfStrings.size(); ++i)
  286. {
  287. std::cerr << "MyListOfStrings[" << i << "] => ["
  288. << qPrintable(commandOptions.MyListOfStrings[i]) << "]" << std::endl;
  289. }
  290. return EXIT_FAILURE;
  291. }
  292. // Check MyString value
  293. if (commandOptions.MyString != "Testing rocks !")
  294. {
  295. commandOptions.printAdditionalInfo();
  296. std::cerr << "Error with parse() function - Content of MyString is incorrect" << std::endl
  297. << "expected value is [Testing rocks !]" << std::endl
  298. << "current value is [" << qPrintable(commandOptions.MyString) << "]" << std::endl;
  299. }
  300. }
  301. if (commandOptions.CurrentSettingsDisabled)
  302. {
  303. commandOptions.printAdditionalInfo();
  304. std::cerr << "Error with parse() function - Settings should *NOT* be disabled" << std::endl;
  305. return EXIT_FAILURE;
  306. }
  307. if (!commandOptions.WrongArgument.isEmpty())
  308. {
  309. commandOptions.printAdditionalInfo();
  310. std::cerr << "Error with parse() function - "
  311. << "WrongArgument should *NOT* be set to ["
  312. << qPrintable(commandOptions.WrongArgument) << "]" << std::endl;
  313. return EXIT_FAILURE;
  314. }
  315. if (!commandOptions.AwesomeTestEnabled)
  316. {
  317. commandOptions.printAdditionalInfo();
  318. std::cerr << "Error with parse() function - AwesomeTestEnabled should be True" << std::endl;
  319. return EXIT_FAILURE;
  320. }
  321. return EXIT_SUCCESS;
  322. }