ctkVTKCommandOptionsTest1.cpp 13 KB

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