ctkCommandLineParserTest1.cpp 25 KB

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