ctkCommandLineParserTest1.cpp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831
  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 <QDebug>
  16. #include <QSettings>
  17. // CTK includes
  18. #include "ctkCommandLineParser.h"
  19. // STD includes
  20. #include <cstdlib>
  21. int ctkCommandLineParserTest1(int, char*[])
  22. {
  23. // Test1 - Check if unparsedArguments() worked as expected
  24. QStringList arguments1;
  25. arguments1 << "ctkCommandLineParserTest1";
  26. arguments1 << "--test-bool";
  27. arguments1 << "--test-string";
  28. arguments1 << "ctkrocks";
  29. ctkCommandLineParser parser1;
  30. bool ok = false;
  31. parser1.parseArguments(arguments1, &ok);
  32. if (!ok)
  33. {
  34. qCritical() << "Test1 - Failed to parse arguments";
  35. return EXIT_FAILURE;
  36. }
  37. QStringList expectedUnparsedArguments1;
  38. expectedUnparsedArguments1 << "--test-bool" << "--test-string" << "ctkrocks";
  39. if (parser1.unparsedArguments() != expectedUnparsedArguments1)
  40. {
  41. qCritical() << "unparsedArguments:" << parser1.unparsedArguments();
  42. qCritical() << "expectedUnparsedArguments1:" << expectedUnparsedArguments1;
  43. return EXIT_FAILURE;
  44. }
  45. // Test2 - Check if addArgument() for a boolean workes as expected
  46. QStringList arguments2;
  47. arguments2 << "ctkCommandLineParserTest1";
  48. arguments2 << "--test-bool";
  49. arguments2 << "--test-string";
  50. arguments2 << "ctkrocks";
  51. ctkCommandLineParser parser2;
  52. parser2.addArgument("--test-bool", "", QVariant::Bool, "This is a test bool", false);
  53. ok = false;
  54. QHash<QString, QVariant> parsedArgs = parser2.parseArguments(arguments2, &ok);
  55. if (!ok)
  56. {
  57. qCritical() << "Test2 - Failed to parse arguments";
  58. return EXIT_FAILURE;
  59. }
  60. QStringList expectedUnparsedArguments2;
  61. expectedUnparsedArguments2 << "--test-string" << "ctkrocks";
  62. if (parser2.unparsedArguments() != expectedUnparsedArguments2)
  63. {
  64. qCritical() << "Test2 - Failed - unparsedArguments:" << parser2.unparsedArguments()
  65. << ", expectedUnparsedArguments2:" << expectedUnparsedArguments2;
  66. return EXIT_FAILURE;
  67. }
  68. if (parsedArgs["--test-bool"].isNull() || !parsedArgs["--test-bool"].toBool())
  69. {
  70. qCritical() << "Test2 - Failed to parse --test-bool";
  71. return EXIT_FAILURE;
  72. }
  73. // Test3 - check if adding QString, int, double, and QStringList arguments works
  74. QStringList arguments3;
  75. arguments3 << "ctkCommandLineParserTest1";
  76. arguments3 << "--test-string" << "TestingIsGood";
  77. arguments3 << "--test-string2"<< "CTKSuperRocks";
  78. arguments3 << "--test-integer"<< "-3";
  79. // arguments3 << "--test-double"<< "-3.14";
  80. arguments3 << "--test-stringlist"<< "item1" << "item2" << "item3";
  81. ctkCommandLineParser parser3;
  82. parser3.addArgument("--test-string", "", QVariant::String, "This is a test string");
  83. parser3.addArgument("--test-string2", "", QVariant::String, "This is a test string2", "CTKGood");
  84. parser3.addArgument("--test-integer", "", QVariant::Int, "This is a test integer");
  85. // parser3.addArgument("--test-double", "", QVariant::Double, "This is a test double");
  86. parser3.addArgument("--test-stringlist", "", QVariant::StringList,
  87. "This is a test stringlist");
  88. ok = false;
  89. parsedArgs = parser3.parseArguments(arguments3, &ok);
  90. if (!ok)
  91. {
  92. qCritical() << "Test3 - Failed to parse arguments";
  93. return EXIT_FAILURE;
  94. }
  95. QString expectedTestString = "TestingIsGood";
  96. if (parsedArgs["--test-string"].toString() != expectedTestString)
  97. {
  98. qCritical() << "Test3 - Failed - testString" << parsedArgs["--test-string"].toString()
  99. << ", expectedTestString" << expectedTestString;
  100. return EXIT_FAILURE;
  101. }
  102. QString expectedTestString2 = "CTKSuperRocks";
  103. if (parsedArgs["--test-string2"].toString() != expectedTestString2)
  104. {
  105. qCritical() << "Test3 - Failed - testString2" << parsedArgs["--test-string2"].toString()
  106. << ", expectedTestString2" << expectedTestString2;
  107. return EXIT_FAILURE;
  108. }
  109. int expectedTestInteger = -3;
  110. if (parsedArgs["--test-integer"].toInt() != expectedTestInteger)
  111. {
  112. qCritical() << "Test3 - Failed - testInteger" << parsedArgs["--test-integer"].toInt()
  113. << ", expectedTestInteger" << expectedTestInteger;
  114. return EXIT_FAILURE;
  115. }
  116. //double expectedTestDouble = -3.14;
  117. //if (parsedArgs["--test-double"].toDouble() != expectedTestDouble)
  118. // {
  119. // qCritical() << "Test3 - Failed - testDouble" << parsedArgs["--test-double"].toDouble()
  120. // << ", expectedTestDouble" << expectedTestDouble;
  121. // return EXIT_FAILURE;
  122. // }
  123. QStringList expectedTestStringlist;
  124. expectedTestStringlist << "item1" << "item2" << "item3";
  125. if (parsedArgs["--test-stringlist"].toStringList() != expectedTestStringlist)
  126. {
  127. qCritical() << "Test3 - Failed - testStringlist" << parsedArgs["--test-stringlist"].toStringList()
  128. << ", expectedTestStringlist" << expectedTestStringlist;
  129. return EXIT_FAILURE;
  130. }
  131. // Test4 - check if helpText() works as expected
  132. ctkCommandLineParser parser4;
  133. parser4.addArgument("--help-string", "", QVariant::String, "This is an help string");
  134. parser4.addArgument("--help-string-med", "", QVariant::String, "");
  135. parser4.addArgument("--help-string-long", "-hs2", QVariant::String, "This is an help string too !");
  136. parser4.addArgument("", "-hs3", QVariant::String, "This is an help string too for sure !?");
  137. QString expectedHelpString;
  138. QTextStream streamExpectedHelpString(&expectedHelpString);
  139. streamExpectedHelpString << " --help-string..............This is an help string\n"
  140. << " --help-string-med\n"
  141. << " -hs2, --help-string-long...This is an help string too !\n"
  142. << " -hs3.......................This is an help string too for sure !?\n";
  143. if (expectedHelpString != parser4.helpText('.'))
  144. {
  145. qCritical() << "Test4 - Problem with helpText('.') - helpText:\n" << parser4.helpText('.')
  146. << ", expectedHelpString:\n" << expectedHelpString;
  147. return EXIT_FAILURE;
  148. }
  149. QString expectedHelpString2;
  150. QTextStream streamExpectedHelpString2(&expectedHelpString2);
  151. streamExpectedHelpString2 << " --help-string This is an help string\n"
  152. << " --help-string-med\n"
  153. << " -hs2, --help-string-long This is an help string too !\n"
  154. << " -hs3 This is an help string too for sure !?\n";
  155. if (expectedHelpString2 != parser4.helpText())
  156. {
  157. qCritical() << "Test4 - Problem with helpText() - helpText:\n" << parser4.helpText()
  158. << ", expectedHelpString2:\n" << expectedHelpString2;
  159. return EXIT_FAILURE;
  160. }
  161. // Test5 - check if setExactMatchRegularExpression() works as expected
  162. ctkCommandLineParser parser5;
  163. if (parser5.setExactMatchRegularExpression("--unknown",".*", "invalid"))
  164. {
  165. qCritical() << "Test5 - Problem with setExactMatchRegularExpression(shortOrLongArg) - "
  166. "The function should return false if an invalid argument is passed";
  167. return EXIT_FAILURE;
  168. }
  169. parser5.addArgument("--list", "", QVariant::StringList, "Test5 list");
  170. if (!parser5.setExactMatchRegularExpression("--list","item[0-9]",
  171. "Element of the form item[0-9] are expected."))
  172. {
  173. qCritical() << "Test5 - Problem with setExactMatchRegularExpression(StringListArg)";
  174. return EXIT_FAILURE;
  175. }
  176. parser5.addArgument("--string", "", QVariant::String, "Test5 string");
  177. if (!parser5.setExactMatchRegularExpression("--string","ctkStop|ctkStart",
  178. "ctkStop or ctkStart is expected."))
  179. {
  180. qCritical() << "Test5 - Problem with setExactMatchRegularExpression(StringArg)";
  181. return EXIT_FAILURE;
  182. }
  183. parser5.addArgument("--bool", "", QVariant::Bool, "Test5 bool");
  184. if (parser5.setExactMatchRegularExpression("--bool",".*", "invalid"))
  185. {
  186. qCritical() << "Test5 - Problem with setExactMatchRegularExpression(BooleanArg) - "
  187. "The function should return false if a boolean argument is passed";
  188. return EXIT_FAILURE;
  189. }
  190. parser5.addArgument("--int", "", QVariant::Int, "Test5 int");
  191. if (!parser5.setExactMatchRegularExpression("--int","[1-3]",
  192. "Value 1, 2 or 3 is expected."))
  193. {
  194. qCritical() << "Test5 - Problem with setExactMatchRegularExpression(IntegerArg)";
  195. return EXIT_FAILURE;
  196. }
  197. QStringList arguments5;
  198. arguments5 << "ctkCommandLineParserTest1";
  199. arguments5 << "--string"<< "ctkStop";
  200. arguments5 << "--int"<< "2";
  201. arguments5 << "--list"<< "item2" << "item3";
  202. ok = false;
  203. parser5.parseArguments(arguments5, &ok);
  204. if (!ok)
  205. {
  206. qCritical() << "Test5 - Failed to parse arguments";
  207. return EXIT_FAILURE;
  208. }
  209. arguments5.clear();
  210. arguments5 << "ctkCommandLineParserTest1";
  211. arguments5 << "--string"<< "ctkStopp";
  212. arguments5 << "--int"<< "2";
  213. arguments5 << "--list"<< "item2" << "item3";
  214. ok = false;
  215. parser5.parseArguments(arguments5, &ok);
  216. if (ok)
  217. {
  218. qCritical() << "Test5 - parseArguments() should return False - 'ctkStopp' isn't a valid string";
  219. return EXIT_FAILURE;
  220. }
  221. QString expectedErrorString =
  222. "Value(s) associated with argument --string are incorrect."
  223. " ctkStop or ctkStart is expected.";
  224. if(expectedErrorString != parser5.errorString())
  225. {
  226. qCritical() << "Test5 - Failed - expectedErrorString" << expectedErrorString
  227. << ", parser5.errorString()" << parser5.errorString();
  228. return EXIT_FAILURE;
  229. }
  230. arguments5.clear();
  231. arguments5 << "ctkCommandLineParserTest1";
  232. arguments5 << "--string"<< "ctkStop";
  233. arguments5 << "--int"<< "4";
  234. arguments5 << "--list"<< "item2" << "item3";
  235. ok = false;
  236. parser5.parseArguments(arguments5, &ok);
  237. if (ok)
  238. {
  239. qCritical() << "Test5 - parseArguments() should return False - '4' isn't a valid int";
  240. return EXIT_FAILURE;
  241. }
  242. QString expectedErrorString2 =
  243. "Value(s) associated with argument --int are incorrect."
  244. " Value 1, 2 or 3 is expected.";
  245. if(expectedErrorString2 != parser5.errorString())
  246. {
  247. qCritical() << "Test5 - Failed - expectedErrorString2" << expectedErrorString2
  248. << ", parser5.errorString()" << parser5.errorString();
  249. return EXIT_FAILURE;
  250. }
  251. arguments5.clear();
  252. arguments5 << "ctkCommandLineParserTest1";
  253. arguments5 << "--string"<< "ctkStop";
  254. arguments5 << "--int"<< "2";
  255. arguments5 << "--list"<< "item2" << "item10";
  256. ok = false;
  257. parser5.parseArguments(arguments5, &ok);
  258. if (ok)
  259. {
  260. qCritical() << "Test5 - parseArguments() should return False "
  261. "- 'item10' isn't a valid list element";
  262. return EXIT_FAILURE;
  263. }
  264. QString expectedErrorString3 =
  265. "Value(s) associated with argument --list are incorrect."
  266. " Element of the form item[0-9] are expected.";
  267. if(expectedErrorString3 != parser5.errorString())
  268. {
  269. qCritical() << "Test5 - Failed - expectedErrorString3" << expectedErrorString3
  270. << ", parser5.errorString()" << parser5.errorString();
  271. return EXIT_FAILURE;
  272. }
  273. // Test6 - Check if the parser handle the case when value of parameter is omitted
  274. ctkCommandLineParser parser6;
  275. parser6.addArgument("--string", "", QVariant::String, "This is a string");
  276. parser6.addArgument("--bool", "", QVariant::Bool, "This is a bool");
  277. QStringList arguments6;
  278. arguments6 << "ctkCommandLineParserTest1"
  279. << "--string";
  280. // since --string is missing a parameter, parseArgument is expected to fail
  281. ok = false;
  282. parser6.parseArguments(arguments6, &ok);
  283. if (ok)
  284. {
  285. qCritical() << "Test6 - Problem with parseArguments()";
  286. return EXIT_FAILURE;
  287. }
  288. // Expected ignore argument for Test7, 8. 9 and 10
  289. QStringList expectedUnparsedArguments;
  290. expectedUnparsedArguments << "--ignoreint"<< "2" << "--ignorelist"<< "item1" << "item2";
  291. // Test7 - Check if addBooleanArgument and ignore_rest=true works as expected
  292. ctkCommandLineParser parser7;
  293. bool test7Bool = false;
  294. parser7.addArgument("--bool", "", QVariant::Bool, "This is a boolean",
  295. false /*defaultValue*/, true /* ignoreRest*/);
  296. QStringList arguments7;
  297. arguments7 << "ctkCommandLineParserTest1";
  298. arguments7 << "--bool";
  299. arguments7 << expectedUnparsedArguments;
  300. ok = false;
  301. parsedArgs = parser7.parseArguments(arguments7, &ok);
  302. if (!ok)
  303. {
  304. qCritical() << "Test7 - Failed to parse arguments";
  305. return EXIT_FAILURE;
  306. }
  307. bool expectedTest7Bool = true;
  308. if (parsedArgs["--bool"].toBool() != expectedTest7Bool)
  309. {
  310. qCritical() << "Test7 - Failed - test7Bool" << test7Bool
  311. << ", expectedTest7Bool" << expectedTest7Bool;
  312. return EXIT_FAILURE;
  313. }
  314. if (parser7.unparsedArguments() != expectedUnparsedArguments)
  315. {
  316. qCritical() << "Test7 - Failed - expectedUnparsedArguments " << expectedUnparsedArguments
  317. << ", parser7.unparsedArguments" << parser7.unparsedArguments();
  318. return EXIT_FAILURE;
  319. }
  320. // Test7b - Same as Test7 using
  321. ctkCommandLineParser parser7b;
  322. parser7b.setArgumentPrefix("--", "-");
  323. parser7b.addArgument("--bool", "-", QVariant::Bool, "This is a boolean",
  324. false /*defaultValue*/, true /* ignoreRest*/);
  325. QStringList arguments7b;
  326. arguments7b << "ctkCommandLineParserTest1";
  327. arguments7b << "--";
  328. arguments7b << expectedUnparsedArguments;
  329. ok = false;
  330. parsedArgs = parser7b.parseArguments(arguments7b, &ok);
  331. if (!ok)
  332. {
  333. qCritical() << "Test7b - Failed to parse arguments";
  334. return EXIT_FAILURE;
  335. }
  336. bool expectedTest7bBool = true;
  337. bool test7bBool = parsedArgs["--bool"].toBool();
  338. if (test7bBool != expectedTest7bBool)
  339. {
  340. qCritical() << "Test7b - Failed - test7bBool" << test7bBool
  341. << ", expectedTest7bBool" << expectedTest7bBool;
  342. return EXIT_FAILURE;
  343. }
  344. if (parser7b.unparsedArguments() != expectedUnparsedArguments)
  345. {
  346. qCritical() << "Test7b - Failed - expectedUnparsedArguments " << expectedUnparsedArguments
  347. << ", parser7b.unparsedArguments" << parser7b.unparsedArguments();
  348. return EXIT_FAILURE;
  349. }
  350. // Test8 - Check if addStringArgument and ignore_rest=true works as expected
  351. ctkCommandLineParser parser8;
  352. parser8.addArgument("--string", "", QVariant::String, "This is a string",
  353. QString() /*defaultValue*/, true /* ignoreRest*/);
  354. QStringList arguments8;
  355. arguments8 << "ctkCommandLineParserTest1";
  356. arguments8 << "--string" << "ctk";
  357. arguments8 << expectedUnparsedArguments;
  358. ok = false;
  359. parsedArgs = parser8.parseArguments(arguments8, &ok);
  360. if (!ok)
  361. {
  362. qCritical() << "Test8 - Failed to parse arguments";
  363. return EXIT_FAILURE;
  364. }
  365. QString expectedTest8String = "ctk";
  366. if (parsedArgs["--string"].toString() != expectedTest8String)
  367. {
  368. qCritical() << "Test8 - Failed - test8String" << parsedArgs["--string"].toString()
  369. << ", expectedTest8String" << expectedTest8String;
  370. return EXIT_FAILURE;
  371. }
  372. if (parser8.unparsedArguments() != expectedUnparsedArguments)
  373. {
  374. qCritical() << "Test8 - Failed - expectedUnparsedArguments " << expectedUnparsedArguments
  375. << ", parser8.unparsedArguments" << parser8.unparsedArguments();
  376. return EXIT_FAILURE;
  377. }
  378. // Test9 - Check if addArgument for int and ignore_rest=true works as expected
  379. ctkCommandLineParser parser9;
  380. parser9.addArgument("--integer", "", QVariant::Int, "This is an integer",
  381. 0 /*defaultValue*/, true /* ignoreRest*/);
  382. QStringList arguments9;
  383. arguments9 << "ctkCommandLineParserTest1";
  384. arguments9 << "--integer" << "74";
  385. arguments9 << expectedUnparsedArguments;
  386. ok = false;
  387. parsedArgs = parser9.parseArguments(arguments9, &ok);
  388. if (!ok)
  389. {
  390. qCritical() << "Test9 - Failed to parse arguments";
  391. return EXIT_FAILURE;
  392. }
  393. int expectedTest9Int = 74;
  394. if (parsedArgs["--integer"].toInt() != expectedTest9Int)
  395. {
  396. qCritical() << "Test9 - Failed - test9Int" << parsedArgs["--integer"].toInt()
  397. << ", expectedTest9Int" << expectedTest9Int;
  398. return EXIT_FAILURE;
  399. }
  400. if (parser9.unparsedArguments() != expectedUnparsedArguments)
  401. {
  402. qCritical() << "Test9 - Failed - expectedUnparsedArguments " << expectedUnparsedArguments
  403. << ", parser9.unparsedArguments" << parser9.unparsedArguments();
  404. return EXIT_FAILURE;
  405. }
  406. // Test10 - Check if argumentParsed works as expected
  407. ctkCommandLineParser parser10;
  408. parser10.addArgument("--bool", "", QVariant::Bool, "This is a boolean");
  409. // Since parseArguments hasn't been called, argumentParsed should return False
  410. if(parser10.argumentParsed("--bool"))
  411. {
  412. qCritical() << "Test10 - Problem with argumentParsed() - Should return False";
  413. return EXIT_FAILURE;
  414. }
  415. QStringList arguments10;
  416. arguments10 << "ctkCommandLineParserTest1";
  417. arguments10 << "--bool";
  418. ok = false;
  419. parser10.parseArguments(arguments10, &ok);
  420. if (!ok)
  421. {
  422. qCritical() << "Test10 - Failed to parse arguments.";
  423. return EXIT_FAILURE;
  424. }
  425. if(parser10.argumentParsed("--bool-notadded"))
  426. {
  427. qCritical() << "Test10 - Problem with argumentParsed() - "
  428. "Should return False since argument '--bool-notadded' hasn't been added.";
  429. return EXIT_FAILURE;
  430. }
  431. if(!parser10.argumentParsed("--bool"))
  432. {
  433. qCritical() << "Test10 - Problem with argumentParsed() - Should return True";
  434. return EXIT_FAILURE;
  435. }
  436. // Test11 - Check if setArgumentPrefix works as expected
  437. ctkCommandLineParser parser11;
  438. parser11.setArgumentPrefix("--", "/");
  439. parser11.addArgument("test-string", "", QVariant::String);
  440. parser11.addArgument("", "i", QVariant::Int);
  441. QStringList arguments11;
  442. arguments11 << "ctkCommandLineParserTest1";
  443. arguments11 << "--test-string" << "Unix-style";
  444. arguments11 << "test-string"; // unknown argument
  445. arguments11 << "/i" << "5";
  446. ok = false;
  447. parsedArgs = parser11.parseArguments(arguments11, &ok);
  448. if (!ok)
  449. {
  450. qCritical() << "Test11 - Failed to parse arguments: " << parser11.errorString();
  451. return EXIT_FAILURE;
  452. }
  453. if (!parser11.unparsedArguments().contains("test-string"))
  454. {
  455. qCritical() << "Test11 - argument test-string should be unknown.";
  456. return EXIT_FAILURE;
  457. }
  458. if (!parser11.argumentParsed("test-string") || !parser11.argumentParsed("i"))
  459. {
  460. qCritical() << "Test11 - Problem with argumentParsed().";
  461. return EXIT_FAILURE;
  462. }
  463. if (parsedArgs["test-string"].toString() != "Unix-style")
  464. {
  465. qCritical() << "Test11 - Failed argument: test-string, got: " << parsedArgs["test-string"].toString()
  466. << ", expected: " << "Unix-style";
  467. return EXIT_FAILURE;
  468. }
  469. if (parsedArgs["i"].toInt() != 5)
  470. {
  471. qCritical() << "Test11 - Failed argument: i, got: " << parsedArgs["i"].toInt()
  472. << ", expected: " << 5;
  473. return EXIT_FAILURE;
  474. }
  475. // Test12 - Check if the returned hash map contains the correct entries
  476. ctkCommandLineParser parser12;
  477. parser12.addArgument("--test-list", "-l", QVariant::StringList);
  478. QStringList arguments12;
  479. arguments12 << "ctkCommandLineParserTest1";
  480. parsedArgs = parser12.parseArguments(arguments12);
  481. if (!parsedArgs.isEmpty())
  482. {
  483. qCritical() << "Test12 - Returned hash map should be empty.";
  484. return EXIT_FAILURE;
  485. }
  486. arguments12 << "--test-list" << "--test-list2";
  487. parsedArgs = parser12.parseArguments(arguments12);
  488. if (parsedArgs.size() != 1 || !parsedArgs.contains("--test-list"))
  489. {
  490. qCritical() << "Test12 - Returned hash map contains wrong elements.";
  491. return EXIT_FAILURE;
  492. }
  493. // Test13 - Check that supplying a default value works
  494. ctkCommandLineParser parser13;
  495. parser13.addArgument("", "-d", QVariant::Int, "Argument with default value", 3);
  496. parsedArgs = parser13.parseArguments(QStringList(), &ok);
  497. if (!parsedArgs.contains("-d"))
  498. {
  499. qCritical() << "Test13 - Returned hash map does not contain argument with default value.";
  500. return EXIT_FAILURE;
  501. }
  502. if (parsedArgs["-d"].toInt() != 3)
  503. {
  504. qCritical() << "Test13 - Returned hash map contains wrong argument parameter.";
  505. return EXIT_FAILURE;
  506. }
  507. // ==================== QSettings tests ====================
  508. QSettings settings("CommonTK","ctkCommandLineParserTest1");
  509. settings.setValue("long-settings-argument", 5);
  510. settings.setValue("s", "settings-short");
  511. settings.setValue("invalid", QVariant());
  512. // Check that QSettings worked
  513. if(settings.status() != QSettings::NoError)
  514. {
  515. qCritical() << "QSettings tests setup - QSettings::status() returned "
  516. << static_cast<int>(settings.status()) << ".";
  517. return EXIT_FAILURE;
  518. return EXIT_FAILURE;
  519. }
  520. if (settings.value("long-settings-argument") != 5)
  521. {
  522. qCritical() << "QSettings tests setup - Could not store long-settings-argument in QSettings.";
  523. return EXIT_FAILURE;
  524. }
  525. // Test14 - Check that QSettings are used
  526. ctkCommandLineParser parser14(&settings);
  527. parser14.setArgumentPrefix("--", "-");
  528. parser14.addArgument("long-settings-argument", "", QVariant::Int);
  529. parser14.addArgument("", "s", QVariant::String, "A short argument", "my-short");
  530. QStringList arguments14;
  531. arguments14 << "ctkCommandLineParserTest1";
  532. arguments14 << "-s" << "short";
  533. arguments14 << "unknown";
  534. parsedArgs = parser14.parseArguments(arguments14);
  535. // Check that QSettings are ignored
  536. if (parsedArgs.size() != 1 || parsedArgs["s"] != "short")
  537. {
  538. qCritical() << "Test14 - Parsed arguments must only contain -s short.";
  539. return EXIT_FAILURE;
  540. }
  541. // Now use QSettings
  542. parser14.enableSettings("disable-settings");
  543. parser14.addArgument("disable-settings", "", QVariant::Bool);
  544. parsedArgs = parser14.parseArguments(arguments14);
  545. if (!parser14.settingsEnabled())
  546. {
  547. qCritical() << "Test14 - Disabling settings failed.";
  548. return EXIT_FAILURE;
  549. }
  550. if (parser14.unparsedArguments().size() != 1 ||
  551. !parser14.unparsedArguments().contains("unknown"))
  552. {
  553. qCritical() << "Test14 - Parsing unknown arguments failed.";
  554. return EXIT_FAILURE;
  555. }
  556. if (parsedArgs.contains("invalid"))
  557. {
  558. qCritical() << "Test14 - Invalid QSettings value found.";
  559. return EXIT_FAILURE;
  560. }
  561. if (parsedArgs.size() != 2)
  562. {
  563. qCritical() << "Test14 - Wrong number of parsed arguments.";
  564. return EXIT_FAILURE;
  565. }
  566. if (parsedArgs["s"] != "short")
  567. {
  568. qCritical() << "Test14 - QSettings values must not overwrite user values.";
  569. return EXIT_FAILURE;
  570. }
  571. if (parsedArgs["long-settings-argument"].toInt() != 5)
  572. {
  573. qCritical() << "Test14 - Missing value from QSettings.";
  574. return EXIT_FAILURE;
  575. }
  576. arguments14.clear();
  577. arguments14 << "ctkCommandLineParserTest1";
  578. parsedArgs = parser14.parseArguments(arguments14);
  579. if (parsedArgs.size() != 2)
  580. {
  581. qCritical() << "Test14 - Only QSettings values corresponding to arguments must be included.";
  582. return EXIT_FAILURE;
  583. }
  584. if (parsedArgs["s"] != "settings-short")
  585. {
  586. qCritical() << "Test14 - QSettings value should be used as default parameter.";
  587. return EXIT_FAILURE;
  588. }
  589. // Disable QSettings via command line argument
  590. arguments14.clear();
  591. arguments14 << "ctkCommandLineParserTest1";
  592. arguments14 << "--disable-settings";
  593. arguments14 << "--long-settings-argument" << "12";
  594. parsedArgs = parser14.parseArguments(arguments14);
  595. if (parsedArgs["long-settings-argument"].toInt() != 12)
  596. {
  597. qCritical() << "Test14 - Wrong parameter for argument: long-settings-argument.";
  598. return EXIT_FAILURE;
  599. }
  600. if (parsedArgs["s"] != "my-short")
  601. {
  602. qCritical() << parsedArgs;
  603. qCritical() << "Test14 - Default value for argument -s not used.";
  604. return EXIT_FAILURE;
  605. }
  606. // Test15 - Check that merging with QSettings works
  607. settings.clear();
  608. settings.setValue("--list-argument", "z");
  609. ctkCommandLineParser parser15(&settings);
  610. parser15.enableSettings();
  611. parser15.addArgument("--list-argument", "", QVariant::StringList);
  612. QStringList arguments15;
  613. arguments15 << "ctkCommandLineParserTest1";
  614. arguments15 << "--list-argument" << "a" << "b";
  615. // Test with enabled merging
  616. ok = false;
  617. parsedArgs = parser15.parseArguments(arguments15, &ok);
  618. if (!ok)
  619. {
  620. qCritical() << "Test15 - parsing arguments failed.";
  621. return EXIT_FAILURE;
  622. }
  623. if (parsedArgs.contains("--list-argument"))
  624. {
  625. QStringList list = parsedArgs["--list-argument"].toStringList();
  626. if (list.size() != 3)
  627. {
  628. qCritical() << "Test15 - Parameter merging failed.";
  629. return EXIT_FAILURE;
  630. }
  631. if (!list.contains("a") || !list.contains("b") || !list.contains("z"))
  632. {
  633. qCritical() << "Test15 - Merged list contains wrong elements.";
  634. return EXIT_FAILURE;
  635. }
  636. }
  637. else
  638. {
  639. qCritical() << "Test15 - --list-argument was not parsed.";
  640. return EXIT_FAILURE;
  641. }
  642. // Test with disabled merging
  643. parser15.mergeSettings(false);
  644. ok = false;
  645. parsedArgs = parser15.parseArguments(arguments15, &ok);
  646. if (!ok)
  647. {
  648. qCritical() << "Test15 - parsing arguments failed.";
  649. return EXIT_FAILURE;
  650. }
  651. if (parsedArgs.contains("--list-argument"))
  652. {
  653. QStringList list = parsedArgs["--list-argument"].toStringList();
  654. if (list.size() != 2)
  655. {
  656. qCritical() << "Test15 - Disabling merging failed.";
  657. return EXIT_FAILURE;
  658. }
  659. if (!list.contains("a") || !list.contains("b"))
  660. {
  661. qCritical() << "Test15 - List contains wrong elements.";
  662. return EXIT_FAILURE;
  663. }
  664. }
  665. else
  666. {
  667. qCritical() << "Test15 - --list-argument was not parsed.";
  668. return EXIT_FAILURE;
  669. }
  670. // Test16 - Check if strictMode works
  671. settings.clear();
  672. ctkCommandLineParser parser16(&settings);
  673. parser16.enableSettings();
  674. parser16.addArgument("--test-bool", "", QVariant::Bool);
  675. parser16.setStrictModeEnabled(true);
  676. QStringList arguments16;
  677. arguments16 << "ctkCommandLineParserTest1";
  678. arguments16 << "--test-bool";
  679. // parseArguments should NOT fail
  680. ok = false;
  681. parsedArgs = parser16.parseArguments(arguments16, &ok);
  682. if (!ok)
  683. {
  684. qCritical() << "Test16-1 - parsing arguments failed.";
  685. return EXIT_FAILURE;
  686. }
  687. // Since two identical arguments are provided, parseArguments should fail
  688. arguments16.clear();
  689. arguments16 << "ctkCommandLineParserTest1";
  690. arguments16 << "--test-bool";
  691. arguments16 << "--test-bool";
  692. ok = false;
  693. parsedArgs = parser16.parseArguments(arguments16, &ok);
  694. if (ok)
  695. {
  696. qCritical() << "Test16-2 - parsing arguments should fail.";
  697. return EXIT_FAILURE;
  698. }
  699. // Since an unknown argument is provided, parseArguments should fail
  700. arguments16.clear();
  701. arguments16 << "ctkCommandLineParserTest1";
  702. arguments16 << "--test-bool";
  703. arguments16 << "test-bool";
  704. ok = false;
  705. parsedArgs = parser16.parseArguments(arguments16, &ok);
  706. if (ok)
  707. {
  708. qCritical() << "Test16-3 - parsing arguments should fail.";
  709. return EXIT_FAILURE;
  710. }
  711. return EXIT_SUCCESS;
  712. }