ctkCommandLineParserTest1.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. // Qt includes
  2. #include <QDebug>
  3. // CTK includes
  4. #include "ctkCommandLineParser.h"
  5. // STD includes
  6. #include <cstdlib>
  7. int ctkCommandLineParserTest1(int, char*[])
  8. {
  9. // Test1 - Check if unparsedArguments() worked as expected
  10. QStringList arguments1;
  11. arguments1 << "ctkCommandLineParserTest1";
  12. arguments1 << "--test-bool";
  13. arguments1 << "--test-string";
  14. arguments1 << "ctkrocks";
  15. ctkCommandLineParser parser1;
  16. bool ok = false;
  17. parser1.parseArguments(arguments1, &ok);
  18. if (!ok)
  19. {
  20. qCritical() << "Test1 - Failed to parse arguments";
  21. return EXIT_FAILURE;
  22. }
  23. QStringList expectedUnparsedArguments1;
  24. expectedUnparsedArguments1 << "--test-bool" << "--test-string" << "ctkrocks";
  25. if (parser1.unparsedArguments() != expectedUnparsedArguments1)
  26. {
  27. qCritical() << "unparsedArguments:" << parser1.unparsedArguments();
  28. qCritical() << "expectedUnparsedArguments1:" << expectedUnparsedArguments1;
  29. return EXIT_FAILURE;
  30. }
  31. // Test2 - Check if addArgument() for a boolean workes as expected
  32. QStringList arguments2;
  33. arguments2 << "ctkCommandLineParserTest1";
  34. arguments2 << "--test-bool";
  35. arguments2 << "--test-string";
  36. arguments2 << "ctkrocks";
  37. ctkCommandLineParser parser2;
  38. parser2.addArgument("--test-bool", "", QVariant::Bool, "This is a test bool", false);
  39. ok = false;
  40. QHash<QString, QVariant> parsedArgs = parser2.parseArguments(arguments2, &ok);
  41. if (!ok)
  42. {
  43. qCritical() << "Test2 - Failed to parse arguments";
  44. return EXIT_FAILURE;
  45. }
  46. QStringList expectedUnparsedArguments2;
  47. expectedUnparsedArguments2 << "--test-string" << "ctkrocks";
  48. if (parser2.unparsedArguments() != expectedUnparsedArguments2)
  49. {
  50. qCritical() << "Test2 - Failed - unparsedArguments:" << parser2.unparsedArguments()
  51. << ", expectedUnparsedArguments2:" << expectedUnparsedArguments2;
  52. return EXIT_FAILURE;
  53. }
  54. if (parsedArgs["--test-bool"].isNull() || !parsedArgs["--test-bool"].toBool())
  55. {
  56. qCritical() << "Test2 - Failed to parse --test-bool";
  57. return EXIT_FAILURE;
  58. }
  59. // Test3 - check if adding QString, int, and QStringList arguments works
  60. QStringList arguments3;
  61. arguments3 << "ctkCommandLineParserTest1";
  62. arguments3 << "--test-string" << "TestingIsGood";
  63. arguments3 << "--test-string2"<< "CTKSuperRocks";
  64. arguments3 << "--test-integer"<< "-3";
  65. arguments3 << "--test-stringlist"<< "item1" << "item2" << "item3";
  66. ctkCommandLineParser parser3;
  67. parser3.addArgument("--test-string", "", QVariant::String, "This is a test string");
  68. parser3.addArgument("--test-string2", "", QVariant::String, "This is a test string2", "CTKGood");
  69. parser3.addArgument("--test-integer", "", QVariant::Int, "This is a test integer");
  70. parser3.addArgument("--test-stringlist", "", QVariant::StringList,
  71. "This is a test stringlist");
  72. ok = false;
  73. parsedArgs = parser3.parseArguments(arguments3, &ok);
  74. if (!ok)
  75. {
  76. qCritical() << "Test3 - Failed to parse arguments";
  77. return EXIT_FAILURE;
  78. }
  79. QString expectedTestString = "TestingIsGood";
  80. if (parsedArgs["--test-string"].toString() != expectedTestString)
  81. {
  82. qCritical() << "Test3 - Failed - testString" << parsedArgs["--test-string"].toString()
  83. << ", expectedTestString" << expectedTestString;
  84. return EXIT_FAILURE;
  85. }
  86. QString expectedTestString2 = "CTKSuperRocks";
  87. if (parsedArgs["--test-string2"].toString() != expectedTestString2)
  88. {
  89. qCritical() << "Test3 - Failed - testString2" << parsedArgs["--test-string2"].toString()
  90. << ", expectedTestString2" << expectedTestString2;
  91. return EXIT_FAILURE;
  92. }
  93. int expectedTestInteger = -3;
  94. if (parsedArgs["--test-integer"].toInt() != expectedTestInteger)
  95. {
  96. qCritical() << "Test3 - Failed - testInteger" << parsedArgs["--test-integer"].toInt()
  97. << ", expectedTestInteger" << expectedTestInteger;
  98. return EXIT_FAILURE;
  99. }
  100. QStringList expectedTestStringlist;
  101. expectedTestStringlist << "item1" << "item2" << "item3";
  102. if (parsedArgs["--test-stringlist"].toStringList() != expectedTestStringlist)
  103. {
  104. qCritical() << "Test3 - Failed - testStringlist" << parsedArgs["--test-stringlist"].toStringList()
  105. << ", expectedTestStringlist" << expectedTestStringlist;
  106. return EXIT_FAILURE;
  107. }
  108. // Test4 - check if helpText() works as expected
  109. ctkCommandLineParser parser4;
  110. parser4.addArgument("--help-string", "", QVariant::String, "This is an help string");
  111. parser4.addArgument("--help-string-med", "", QVariant::String, "");
  112. parser4.addArgument("--help-string-long", "-hs2", QVariant::String, "This is an help string too !");
  113. parser4.addArgument("", "-hs3", QVariant::String, "This is an help string too for sure !?");
  114. QString expectedHelpString;
  115. QTextStream streamExpectedHelpString(&expectedHelpString);
  116. streamExpectedHelpString << " --help-string..........This is an help string\n"
  117. << " --help-string-med\n"
  118. << " -hs2\n"
  119. << " --help-string-long.....This is an help string too !\n"
  120. << " -hs3...................This is an help string too for sure !?\n";
  121. if (expectedHelpString != parser4.helpText('.'))
  122. {
  123. qCritical() << "Test4 - Problem with helpText('.') - helpText:\n" << parser4.helpText('.')
  124. << ", expectedHelpString:\n" << expectedHelpString;
  125. return EXIT_FAILURE;
  126. }
  127. QString expectedHelpString2;
  128. QTextStream streamExpectedHelpString2(&expectedHelpString2);
  129. streamExpectedHelpString2 << " --help-string This is an help string\n"
  130. << " --help-string-med\n"
  131. << " -hs2\n"
  132. << " --help-string-long This is an help string too !\n"
  133. << " -hs3 This is an help string too for sure !?\n";
  134. if (expectedHelpString2 != parser4.helpText())
  135. {
  136. qCritical() << "Test4 - Problem with helpText() - helpText:\n" << parser4.helpText()
  137. << ", expectedHelpString2:\n" << expectedHelpString2;
  138. return EXIT_FAILURE;
  139. }
  140. // Test5 - check if setExactMatchRegularExpression() works as expected
  141. ctkCommandLineParser parser5;
  142. if (parser5.setExactMatchRegularExpression("--unknown",".*", "invalid"))
  143. {
  144. qCritical() << "Test5 - Problem with setExactMatchRegularExpression(shortOrLongArg) - "
  145. "The function should return false if an invalid argument is passed";
  146. return EXIT_FAILURE;
  147. }
  148. parser5.addArgument("--list", "", QVariant::StringList, "Test5 list");
  149. if (!parser5.setExactMatchRegularExpression("--list","item[0-9]",
  150. "Element of the form item[0-9] are expected."))
  151. {
  152. qCritical() << "Test5 - Problem with setExactMatchRegularExpression(StringListArg)";
  153. return EXIT_FAILURE;
  154. }
  155. parser5.addArgument("--string", "", QVariant::String, "Test5 string");
  156. if (!parser5.setExactMatchRegularExpression("--string","ctkStop|ctkStart",
  157. "ctkStop or ctkStart is expected."))
  158. {
  159. qCritical() << "Test5 - Problem with setExactMatchRegularExpression(StringArg)";
  160. return EXIT_FAILURE;
  161. }
  162. parser5.addArgument("--bool", "", QVariant::Bool, "Test5 bool");
  163. if (parser5.setExactMatchRegularExpression("--bool",".*", "invalid"))
  164. {
  165. qCritical() << "Test5 - Problem with setExactMatchRegularExpression(BooleanArg) - "
  166. "The function should return false if a boolean argument is passed";
  167. return EXIT_FAILURE;
  168. }
  169. parser5.addArgument("--int", "", QVariant::Int, "Test5 int");
  170. if (!parser5.setExactMatchRegularExpression("--int","[1-3]",
  171. "Value 1, 2 or 3 is expected."))
  172. {
  173. qCritical() << "Test5 - Problem with setExactMatchRegularExpression(IntegerArg)";
  174. return EXIT_FAILURE;
  175. }
  176. QStringList arguments5;
  177. arguments5 << "ctkCommandLineParserTest1";
  178. arguments5 << "--string"<< "ctkStop";
  179. arguments5 << "--int"<< "2";
  180. arguments5 << "--list"<< "item2" << "item3";
  181. ok = false;
  182. parser5.parseArguments(arguments5, &ok);
  183. if (!ok)
  184. {
  185. qCritical() << "Test5 - Failed to parse arguments";
  186. return EXIT_FAILURE;
  187. }
  188. arguments5.clear();
  189. arguments5 << "ctkCommandLineParserTest1";
  190. arguments5 << "--string"<< "ctkStopp";
  191. arguments5 << "--int"<< "2";
  192. arguments5 << "--list"<< "item2" << "item3";
  193. ok = false;
  194. parser5.parseArguments(arguments5, &ok);
  195. if (ok)
  196. {
  197. qCritical() << "Test5 - parseArguments() should return False - 'ctkStopp' isn't a valid string";
  198. return EXIT_FAILURE;
  199. }
  200. QString expectedErrorString =
  201. "Value(s) associated with argument --string are incorrect."
  202. " ctkStop or ctkStart is expected.";
  203. if(expectedErrorString != parser5.errorString())
  204. {
  205. qCritical() << "Test5 - Failed - expectedErrorString" << expectedErrorString
  206. << ", parser5.errorString()" << parser5.errorString();
  207. return EXIT_FAILURE;
  208. }
  209. arguments5.clear();
  210. arguments5 << "ctkCommandLineParserTest1";
  211. arguments5 << "--string"<< "ctkStop";
  212. arguments5 << "--int"<< "4";
  213. arguments5 << "--list"<< "item2" << "item3";
  214. ok = false;
  215. parser5.parseArguments(arguments5, &ok);
  216. if (ok)
  217. {
  218. qCritical() << "Test5 - parseArguments() should return False - '4' isn't a valid int";
  219. return EXIT_FAILURE;
  220. }
  221. QString expectedErrorString2 =
  222. "Value(s) associated with argument --int are incorrect."
  223. " Value 1, 2 or 3 is expected.";
  224. if(expectedErrorString2 != parser5.errorString())
  225. {
  226. qCritical() << "Test5 - Failed - expectedErrorString2" << expectedErrorString2
  227. << ", parser5.errorString()" << parser5.errorString();
  228. return EXIT_FAILURE;
  229. }
  230. arguments5.clear();
  231. arguments5 << "ctkCommandLineParserTest1";
  232. arguments5 << "--string"<< "ctkStop";
  233. arguments5 << "--int"<< "2";
  234. arguments5 << "--list"<< "item2" << "item10";
  235. ok = false;
  236. parser5.parseArguments(arguments5, &ok);
  237. if (ok)
  238. {
  239. qCritical() << "Test5 - parseArguments() should return False "
  240. "- 'item10' isn't a valid list element";
  241. return EXIT_FAILURE;
  242. }
  243. QString expectedErrorString3 =
  244. "Value(s) associated with argument --list are incorrect."
  245. " Element of the form item[0-9] are expected.";
  246. if(expectedErrorString3 != parser5.errorString())
  247. {
  248. qCritical() << "Test5 - Failed - expectedErrorString3" << expectedErrorString3
  249. << ", parser5.errorString()" << parser5.errorString();
  250. return EXIT_FAILURE;
  251. }
  252. // Test6 - Check if the parser handle the case when value of parameter is omitted
  253. ctkCommandLineParser parser6;
  254. parser6.addArgument("--string", "", QVariant::String, "This is a string");
  255. parser6.addArgument("--bool", "", QVariant::Bool, "This is a bool");
  256. QStringList arguments6;
  257. arguments6 << "ctkCommandLineParserTest1"
  258. << "--string";
  259. // since --string is missing a parameter, parseArgument is expected to fail
  260. ok = false;
  261. parser6.parseArguments(arguments6, &ok);
  262. if (ok)
  263. {
  264. qCritical() << "Test6 - Problem with parseArguments()";
  265. return EXIT_FAILURE;
  266. }
  267. // Expected ignore argument for Test7, 8. 9 and 10
  268. QStringList expectedUnparsedArguments;
  269. expectedUnparsedArguments << "--ignoreint"<< "2" << "--ignorelist"<< "item1" << "item2";
  270. // Test7 - Check if addBooleanArgument and ignore_rest=true works as expected
  271. ctkCommandLineParser parser7;
  272. bool test7Bool = false;
  273. parser7.addArgument("--bool", "", QVariant::Bool, "This is a boolean",
  274. false /*defaultValue*/, true /* ignoreRest*/);
  275. QStringList arguments7;
  276. arguments7 << "ctkCommandLineParserTest1";
  277. arguments7 << "--bool";
  278. arguments7 << expectedUnparsedArguments;
  279. ok = false;
  280. parsedArgs = parser7.parseArguments(arguments7, &ok);
  281. if (!ok)
  282. {
  283. qCritical() << "Test7 - Failed to parse arguments";
  284. return EXIT_FAILURE;
  285. }
  286. bool expectedTest7Bool = true;
  287. if (parsedArgs["--bool"].toBool() != expectedTest7Bool)
  288. {
  289. qCritical() << "Test7 - Failed - test7Bool" << test7Bool
  290. << ", expectedTest7Bool" << expectedTest7Bool;
  291. return EXIT_FAILURE;
  292. }
  293. if (parser7.unparsedArguments() != expectedUnparsedArguments)
  294. {
  295. qCritical() << "Test7 - Failed - expectedUnparsedArguments " << expectedUnparsedArguments
  296. << ", parser7.unparsedArguments" << parser7.unparsedArguments();
  297. return EXIT_FAILURE;
  298. }
  299. // Test8 - Check if addStringArgument and ignore_rest=true works as expected
  300. ctkCommandLineParser parser8;
  301. parser8.addArgument("--string", "", QVariant::String, "This is a string",
  302. QString() /*defaultValue*/, true /* ignoreRest*/);
  303. QStringList arguments8;
  304. arguments8 << "ctkCommandLineParserTest1";
  305. arguments8 << "--string" << "ctk";
  306. arguments8 << expectedUnparsedArguments;
  307. ok = false;
  308. parsedArgs = parser8.parseArguments(arguments8, &ok);
  309. if (!ok)
  310. {
  311. qCritical() << "Test8 - Failed to parse arguments";
  312. return EXIT_FAILURE;
  313. }
  314. QString expectedTest8String = "ctk";
  315. if (parsedArgs["--string"].toString() != expectedTest8String)
  316. {
  317. qCritical() << "Test8 - Failed - test8String" << parsedArgs["--string"].toString()
  318. << ", expectedTest8String" << expectedTest8String;
  319. return EXIT_FAILURE;
  320. }
  321. if (parser8.unparsedArguments() != expectedUnparsedArguments)
  322. {
  323. qCritical() << "Test8 - Failed - expectedUnparsedArguments " << expectedUnparsedArguments
  324. << ", parser8.unparsedArguments" << parser8.unparsedArguments();
  325. return EXIT_FAILURE;
  326. }
  327. // Test9 - Check if addArgument for int and ignore_rest=true works as expected
  328. ctkCommandLineParser parser9;
  329. parser9.addArgument("--integer", "", QVariant::Int, "This is an integer",
  330. 0 /*defaultValue*/, true /* ignoreRest*/);
  331. QStringList arguments9;
  332. arguments9 << "ctkCommandLineParserTest1";
  333. arguments9 << "--integer" << "74";
  334. arguments9 << expectedUnparsedArguments;
  335. ok = false;
  336. parsedArgs = parser9.parseArguments(arguments9, &ok);
  337. if (!ok)
  338. {
  339. qCritical() << "Test9 - Failed to parse arguments";
  340. return EXIT_FAILURE;
  341. }
  342. int expectedTest9Int = 74;
  343. if (parsedArgs["--integer"].toInt() != expectedTest9Int)
  344. {
  345. qCritical() << "Test9 - Failed - test9Int" << parsedArgs["--integer"].toInt()
  346. << ", expectedTest9Int" << expectedTest9Int;
  347. return EXIT_FAILURE;
  348. }
  349. if (parser9.unparsedArguments() != expectedUnparsedArguments)
  350. {
  351. qCritical() << "Test9 - Failed - expectedUnparsedArguments " << expectedUnparsedArguments
  352. << ", parser9.unparsedArguments" << parser9.unparsedArguments();
  353. return EXIT_FAILURE;
  354. }
  355. // Test10 - Check if argumentParsed works as expected
  356. ctkCommandLineParser parser10;
  357. parser10.addArgument("--bool", "", QVariant::Bool, "This is a boolean");
  358. // Since parseArguments hasn't been called, argumentParsed should return False
  359. if(parser10.argumentParsed("--bool"))
  360. {
  361. qCritical() << "Test10 - Problem with argumentParsed() - Should return False";
  362. return EXIT_FAILURE;
  363. }
  364. QStringList arguments10;
  365. arguments10 << "ctkCommandLineParserTest1";
  366. arguments10 << "--bool";
  367. ok = false;
  368. parser10.parseArguments(arguments10, &ok);
  369. if (!ok)
  370. {
  371. qCritical() << "Test10 - Failed to parse arguments.";
  372. return EXIT_FAILURE;
  373. }
  374. if(parser10.argumentParsed("--bool-notadded"))
  375. {
  376. qCritical() << "Test10 - Problem with argumentParsed() - "
  377. "Should return False since argument '--bool-notadded' hasn't been added.";
  378. return EXIT_FAILURE;
  379. }
  380. if(!parser10.argumentParsed("--bool"))
  381. {
  382. qCritical() << "Test10 - Problem with argumentParsed() - Should return True";
  383. return EXIT_FAILURE;
  384. }
  385. return EXIT_SUCCESS;
  386. }