Clean argument parser tests

This commit is contained in:
Martchus 2016-12-07 21:06:21 +01:00
parent 416008da1a
commit 939a43e348
1 changed files with 57 additions and 49 deletions

View File

@ -113,7 +113,7 @@ void ArgumentParserTests::testParsing()
displayTagInfoArg.setSubArguments({&fieldsArg, &filesArg, &verboseArg, &notAlbumArg}); displayTagInfoArg.setSubArguments({&fieldsArg, &filesArg, &verboseArg, &notAlbumArg});
parser.setMainArguments({&qtConfigArgs.qtWidgetsGuiArg(), &printFieldNamesArg, &displayTagInfoArg, &displayFileInfoArg, &helpArg}); parser.setMainArguments({&qtConfigArgs.qtWidgetsGuiArg(), &printFieldNamesArg, &displayTagInfoArg, &displayFileInfoArg, &helpArg});
// define some argument values // error about uncombinable arguments
const char *argv[] = {"tageditor", "get", "album", "title", "diskpos", "-f", "somefile"}; const char *argv[] = {"tageditor", "get", "album", "title", "diskpos", "-f", "somefile"};
// try to parse, this should fail // try to parse, this should fail
try { try {
@ -123,9 +123,9 @@ void ArgumentParserTests::testParsing()
CPPUNIT_ASSERT(!strcmp(e.what(), "The argument \"files\" can not be combined with \"fields\".")); CPPUNIT_ASSERT(!strcmp(e.what(), "The argument \"files\" can not be combined with \"fields\"."));
} }
// try to parse again, but adjust the configuration for a successful parse // arguments read correctly after successful parse
displayTagInfoArg.reset(), fieldsArg.reset(), filesArg.reset();
filesArg.setCombinable(true); filesArg.setCombinable(true);
parser.resetArgs();
parser.parseArgs(7, argv); parser.parseArgs(7, argv);
// check results // check results
CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent()); CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent());
@ -139,10 +139,10 @@ void ArgumentParserTests::testParsing()
CPPUNIT_ASSERT(!strcmp(fieldsArg.values().at(2), "diskpos")); CPPUNIT_ASSERT(!strcmp(fieldsArg.values().at(2), "diskpos"));
CPPUNIT_ASSERT_THROW(displayTagInfoArg.values().at(3), out_of_range); CPPUNIT_ASSERT_THROW(displayTagInfoArg.values().at(3), out_of_range);
// define the same arguments in a different way // skip empty args
const char *argv2[] = {"tageditor", "", "-p", "album", "title", "diskpos", "", "--files", "somefile"}; const char *argv2[] = {"tageditor", "", "-p", "album", "title", "diskpos", "", "--files", "somefile"};
// reparse the args // reparse the args
displayTagInfoArg.reset(), fieldsArg.reset(), filesArg.reset(); parser.resetArgs();
parser.parseArgs(9, argv2); parser.parseArgs(9, argv2);
// check results again // check results again
CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent()); CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent());
@ -158,31 +158,29 @@ void ArgumentParserTests::testParsing()
CPPUNIT_ASSERT(filesArg.isPresent()); CPPUNIT_ASSERT(filesArg.isPresent());
CPPUNIT_ASSERT(!strcmp(filesArg.values().at(0), "somefile")); CPPUNIT_ASSERT(!strcmp(filesArg.values().at(0), "somefile"));
// forget "get"/"-p" // error about unknown argument: forget get/-p
const char *argv3[] = {"tageditor", "album", "title", "diskpos", "--files", "somefile"}; const char *argv3[] = {"tageditor", "album", "title", "diskpos", "--files", "somefile"};
displayTagInfoArg.reset(), fieldsArg.reset(), filesArg.reset();
// a parsing error should occur because the argument "album" is not defined
try { try {
parser.resetArgs();
parser.parseArgs(6, argv3); parser.parseArgs(6, argv3);
CPPUNIT_FAIL("Exception expected."); CPPUNIT_FAIL("Exception expected.");
} catch(const Failure &e) { } catch(const Failure &e) {
CPPUNIT_ASSERT(!strcmp(e.what(), "The specified argument \"album\" is unknown and will be ignored.")); CPPUNIT_ASSERT(!strcmp(e.what(), "The specified argument \"album\" is unknown and will be ignored."));
} }
// repeat the test, but this time just ignore the undefined argument printing a warning // warning about unknown argument
displayTagInfoArg.reset(), fieldsArg.reset(), filesArg.reset();
parser.setUnknownArgumentBehavior(UnknownArgumentBehavior::Warn); parser.setUnknownArgumentBehavior(UnknownArgumentBehavior::Warn);
// redirect stderr to check whether warnings are printed correctly // redirect stderr to check whether warnings are printed correctly
stringstream buffer; stringstream buffer;
streambuf *regularCerrBuffer = cerr.rdbuf(buffer.rdbuf()); streambuf *regularCerrBuffer = cerr.rdbuf(buffer.rdbuf());
parser.resetArgs();
try { try {
parser.parseArgs(6, argv3); parser.parseArgs(6, argv3);
cerr.rdbuf(regularCerrBuffer);
} catch(...) { } catch(...) {
cerr.rdbuf(regularCerrBuffer); cerr.rdbuf(regularCerrBuffer);
throw; throw;
} }
cerr.rdbuf(regularCerrBuffer);
CPPUNIT_ASSERT(!strcmp(buffer.str().data(), "The specified argument \"album\" is unknown and will be ignored.\n" CPPUNIT_ASSERT(!strcmp(buffer.str().data(), "The specified argument \"album\" is unknown and will be ignored.\n"
"The specified argument \"title\" is unknown and will be ignored.\n" "The specified argument \"title\" is unknown and will be ignored.\n"
"The specified argument \"diskpos\" is unknown and will be ignored.\n" "The specified argument \"diskpos\" is unknown and will be ignored.\n"
@ -195,10 +193,10 @@ void ArgumentParserTests::testParsing()
CPPUNIT_ASSERT(!fieldsArg.isPresent()); CPPUNIT_ASSERT(!fieldsArg.isPresent());
CPPUNIT_ASSERT(!filesArg.isPresent()); CPPUNIT_ASSERT(!filesArg.isPresent());
// test abbreviations like "-vf" // combined abbreviations like "-vf"
const char *argv4[] = {"tageditor", "-i", "-vf", "test"}; const char *argv4[] = {"tageditor", "-i", "-vf", "test"};
displayTagInfoArg.reset(), fieldsArg.reset(), filesArg.reset();
parser.setUnknownArgumentBehavior(UnknownArgumentBehavior::Fail); parser.setUnknownArgumentBehavior(UnknownArgumentBehavior::Fail);
parser.resetArgs();
parser.parseArgs(4, argv4); parser.parseArgs(4, argv4);
CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent()); CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent());
CPPUNIT_ASSERT(displayFileInfoArg.isPresent()); CPPUNIT_ASSERT(displayFileInfoArg.isPresent());
@ -209,7 +207,7 @@ void ArgumentParserTests::testParsing()
CPPUNIT_ASSERT(!strcmp(fileArg.values().at(0), "test")); CPPUNIT_ASSERT(!strcmp(fileArg.values().at(0), "test"));
CPPUNIT_ASSERT_THROW(fileArg.values().at(1), out_of_range); CPPUNIT_ASSERT_THROW(fileArg.values().at(1), out_of_range);
// don't reset verbose argument to test constraint checking // constraint checking: no multiple occurrences (not resetting verboseArg on purpose)
displayFileInfoArg.reset(), fileArg.reset(); displayFileInfoArg.reset(), fileArg.reset();
try { try {
parser.parseArgs(4, argv4); parser.parseArgs(4, argv4);
@ -219,19 +217,19 @@ void ArgumentParserTests::testParsing()
CPPUNIT_ASSERT(!strcmp(e.what(), "The argument \"verbose\" mustn't be specified more than 1 time.")); CPPUNIT_ASSERT(!strcmp(e.what(), "The argument \"verbose\" mustn't be specified more than 1 time."));
} }
// relax constraint // constraint checking: no contraint (not resetting verboseArg on purpose)
displayFileInfoArg.reset(), fileArg.reset(), verboseArg.reset(); displayFileInfoArg.reset(), fileArg.reset();
verboseArg.setConstraints(0, -1); verboseArg.setConstraints(0, -1);
parser.parseArgs(4, argv4); parser.parseArgs(4, argv4);
CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent()); CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent());
// make verbose mandatory // constraint checking: mandatory argument
verboseArg.setRequired(true); verboseArg.setRequired(true);
displayFileInfoArg.reset(), fileArg.reset(), verboseArg.reset(); parser.resetArgs();
parser.parseArgs(4, argv4); parser.parseArgs(4, argv4);
CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent()); CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent());
// make it complain about missing argument // contraint checking: error about missing mandatory argument
const char *argv5[] = {"tageditor", "-i", "-f", "test"}; const char *argv5[] = {"tageditor", "-i", "-f", "test"};
displayFileInfoArg.reset(), fileArg.reset(), verboseArg.reset(); displayFileInfoArg.reset(), fileArg.reset(), verboseArg.reset();
try { try {
@ -241,10 +239,11 @@ void ArgumentParserTests::testParsing()
CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent()); CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent());
CPPUNIT_ASSERT(!strcmp(e.what(), "The argument \"verbose\" must be specified at least 1 time.")); CPPUNIT_ASSERT(!strcmp(e.what(), "The argument \"verbose\" must be specified at least 1 time."));
} }
verboseArg.setRequired(false);
// test abbreviation combination with nesting "-pf" // combined abbreviation with nesting "-pf"
const char *argv10[] = {"tageditor", "-pf", "test"}; const char *argv10[] = {"tageditor", "-pf", "test"};
displayFileInfoArg.reset(), fileArg.reset(), verboseArg.reset(), verboseArg.setRequired(false); parser.resetArgs();
parser.parseArgs(3, argv10); parser.parseArgs(3, argv10);
CPPUNIT_ASSERT(displayTagInfoArg.isPresent()); CPPUNIT_ASSERT(displayTagInfoArg.isPresent());
CPPUNIT_ASSERT(!displayFileInfoArg.isPresent()); CPPUNIT_ASSERT(!displayFileInfoArg.isPresent());
@ -254,15 +253,15 @@ void ArgumentParserTests::testParsing()
CPPUNIT_ASSERT(!strcmp(filesArg.values(0).front(), "test")); CPPUNIT_ASSERT(!strcmp(filesArg.values(0).front(), "test"));
CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent()); CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent());
// it should not complain if -i is not present // constraint checking: no complains about missing -i
const char *argv6[] = {"tageditor", "-g"}; const char *argv6[] = {"tageditor", "-g"};
displayTagInfoArg.reset(), fileArg.reset(), verboseArg.reset(), filesArg.reset(); parser.resetArgs();
parser.parseArgs(2, argv6); parser.parseArgs(2, argv6);
CPPUNIT_ASSERT(qtConfigArgs.qtWidgetsGuiArg().isPresent()); CPPUNIT_ASSERT(qtConfigArgs.qtWidgetsGuiArg().isPresent());
// it should not be possible to specify -f without -i or -p // constraint checking: dependend arguments (-f requires -i or -p)
const char *argv7[] = {"tageditor", "-f", "test"}; const char *argv7[] = {"tageditor", "-f", "test"};
displayFileInfoArg.reset(), fileArg.reset(), filesArg.reset(), verboseArg.reset(), qtConfigArgs.qtWidgetsGuiArg().reset(); parser.resetArgs();
try { try {
parser.parseArgs(3, argv7); parser.parseArgs(3, argv7);
CPPUNIT_FAIL("Exception expected."); CPPUNIT_FAIL("Exception expected.");
@ -271,27 +270,27 @@ void ArgumentParserTests::testParsing()
CPPUNIT_ASSERT(!strcmp(e.what(), "The specified argument \"-f\" is unknown and will be ignored.")); CPPUNIT_ASSERT(!strcmp(e.what(), "The specified argument \"-f\" is unknown and will be ignored."));
} }
// test equation sign syntax // equation sign syntax
const char *argv11[] = {"tageditor", "-if=test"}; const char *argv11[] = {"tageditor", "-if=test"};
fileArg.reset(); parser.resetArgs();
parser.parseArgs(2, argv11); parser.parseArgs(2, argv11);
CPPUNIT_ASSERT(!filesArg.isPresent()); CPPUNIT_ASSERT(!filesArg.isPresent());
CPPUNIT_ASSERT(fileArg.isPresent()); CPPUNIT_ASSERT(fileArg.isPresent());
CPPUNIT_ASSERT_EQUAL(fileArg.values(0).size(), static_cast<vector<const char *>::size_type>(1)); CPPUNIT_ASSERT_EQUAL(fileArg.values(0).size(), static_cast<vector<const char *>::size_type>(1));
CPPUNIT_ASSERT(!strcmp(fileArg.values(0).front(), "test")); CPPUNIT_ASSERT(!strcmp(fileArg.values(0).front(), "test"));
// test specifying value directly after abbreviation // specifying value directly after abbreviation
const char *argv12[] = {"tageditor", "-iftest"}; const char *argv12[] = {"tageditor", "-iftest"};
displayFileInfoArg.reset(), fileArg.reset(); parser.resetArgs();
parser.parseArgs(2, argv12); parser.parseArgs(2, argv12);
CPPUNIT_ASSERT(!filesArg.isPresent()); CPPUNIT_ASSERT(!filesArg.isPresent());
CPPUNIT_ASSERT(fileArg.isPresent()); CPPUNIT_ASSERT(fileArg.isPresent());
CPPUNIT_ASSERT_EQUAL(fileArg.values(0).size(), static_cast<vector<const char *>::size_type>(1)); CPPUNIT_ASSERT_EQUAL(fileArg.values(0).size(), static_cast<vector<const char *>::size_type>(1));
CPPUNIT_ASSERT(!strcmp(fileArg.values(0).front(), "test")); CPPUNIT_ASSERT(!strcmp(fileArg.values(0).front(), "test"));
// test default argument // default argument
const char *argv8[] = {"tageditor"}; const char *argv8[] = {"tageditor"};
displayFileInfoArg.reset(), fileArg.reset(), verboseArg.reset(); parser.resetArgs();
parser.parseArgs(1, argv8); parser.parseArgs(1, argv8);
CPPUNIT_ASSERT(qtConfigArgs.qtWidgetsGuiArg().isPresent()); CPPUNIT_ASSERT(qtConfigArgs.qtWidgetsGuiArg().isPresent());
CPPUNIT_ASSERT(!displayFileInfoArg.isPresent()); CPPUNIT_ASSERT(!displayFileInfoArg.isPresent());
@ -306,11 +305,10 @@ void ArgumentParserTests::testParsing()
CPPUNIT_ASSERT(!fileArg.firstValue()); CPPUNIT_ASSERT(!fileArg.firstValue());
} }
// test required value count constraint with sufficient number of provided parameters // constraint checking: required value count with sufficient number of provided parameters
const char *argv13[] = {"tageditor", "get", "--fields", "album=test", "title", "diskpos", "--files", "somefile"}; const char *argv13[] = {"tageditor", "get", "--fields", "album=test", "title", "diskpos", "--files", "somefile"};
qtConfigArgs.qtWidgetsGuiArg().reset();
fieldsArg.setRequiredValueCount(3);
verboseArg.setRequired(false); verboseArg.setRequired(false);
parser.resetArgs();
parser.parseArgs(8, argv13); parser.parseArgs(8, argv13);
// this should still work without complaints // this should still work without complaints
CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent()); CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent());
@ -326,10 +324,10 @@ void ArgumentParserTests::testParsing()
CPPUNIT_ASSERT(!strcmp(filesArg.values().at(0), "somefile")); CPPUNIT_ASSERT(!strcmp(filesArg.values().at(0), "somefile"));
CPPUNIT_ASSERT(!notAlbumArg.isPresent()); CPPUNIT_ASSERT(!notAlbumArg.isPresent());
// test required value count constraint with insufficient number of provided parameters // constraint checking: required value count with insufficient number of provided parameters
displayTagInfoArg.reset(), fieldsArg.reset(), filesArg.reset();
fieldsArg.setRequiredValueCount(4);
const char *argv9[] = {"tageditor", "-p", "album", "title", "diskpos"}; const char *argv9[] = {"tageditor", "-p", "album", "title", "diskpos"};
fieldsArg.setRequiredValueCount(4);
parser.resetArgs();
try { try {
parser.parseArgs(5, argv9); parser.parseArgs(5, argv9);
CPPUNIT_FAIL("Exception expected."); CPPUNIT_FAIL("Exception expected.");
@ -418,7 +416,7 @@ void ArgumentParserTests::testBashCompletion()
streambuf *regularCoutBuffer = cout.rdbuf(buffer.rdbuf()); streambuf *regularCoutBuffer = cout.rdbuf(buffer.rdbuf());
try { try {
// should fail because operation flags are not set // fail due to operation flags not set
const char *const argv1[] = {"se"}; const char *const argv1[] = {"se"};
const char *const *argv = argv1; const char *const *argv = argv1;
parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv1 + 1, lastDetectedArg, argDenotation = nullptr, true); parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv1 + 1, lastDetectedArg, argDenotation = nullptr, true);
@ -426,39 +424,43 @@ void ArgumentParserTests::testBashCompletion()
cout.rdbuf(regularCoutBuffer); cout.rdbuf(regularCoutBuffer);
CPPUNIT_ASSERT_EQUAL(string("COMPREPLY=()\n"), buffer.str()); CPPUNIT_ASSERT_EQUAL(string("COMPREPLY=()\n"), buffer.str());
// with correct operation arg flags // correct operation arg flags
index = 0, lastDetectedArg = nullptr, buffer.str(string()); index = 0, lastDetectedArg = nullptr, buffer.str(string());
cout.rdbuf(buffer.rdbuf()); cout.rdbuf(buffer.rdbuf());
getArg.setDenotesOperation(true), setArg.setDenotesOperation(true); getArg.setDenotesOperation(true), setArg.setDenotesOperation(true);
argv = argv1; argv = argv1;
parser.resetArgs();
parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv1 + 1, lastDetectedArg, argDenotation = nullptr, true); parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv1 + 1, lastDetectedArg, argDenotation = nullptr, true);
parser.printBashCompletion(1, argv1, 0, lastDetectedArg); parser.printBashCompletion(1, argv1, 0, lastDetectedArg);
cout.rdbuf(regularCoutBuffer); cout.rdbuf(regularCoutBuffer);
CPPUNIT_ASSERT_EQUAL(string("COMPREPLY=('set' )\n"), buffer.str()); CPPUNIT_ASSERT_EQUAL(string("COMPREPLY=('set' )\n"), buffer.str());
// argument is already specified // argument at current cursor position already specified -> the completion should just return the argument
const char *const argv2[] = {"set"}; const char *const argv2[] = {"set"};
index = 0, lastDetectedArg = nullptr, buffer.str(string()); index = 0, lastDetectedArg = nullptr, buffer.str(string());
cout.rdbuf(buffer.rdbuf()); cout.rdbuf(buffer.rdbuf());
argv = argv2; argv = argv2;
parser.resetArgs();
parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv2 + 1, lastDetectedArg, argDenotation = nullptr, true); parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv2 + 1, lastDetectedArg, argDenotation = nullptr, true);
parser.printBashCompletion(1, argv2, 0, lastDetectedArg); parser.printBashCompletion(1, argv2, 0, lastDetectedArg);
cout.rdbuf(regularCoutBuffer); cout.rdbuf(regularCoutBuffer);
CPPUNIT_ASSERT_EQUAL(string("COMPREPLY=('set' )\n"), buffer.str()); CPPUNIT_ASSERT_EQUAL(string("COMPREPLY=('set' )\n"), buffer.str());
// advance the cursor position -> the completion should propose the next argument // advance the cursor position -> the completion should propose the next argument
index = 0, lastDetectedArg = nullptr, buffer.str(string()), setArg.reset(); index = 0, lastDetectedArg = nullptr, buffer.str(string());
cout.rdbuf(buffer.rdbuf()); cout.rdbuf(buffer.rdbuf());
argv = argv2; argv = argv2;
parser.resetArgs();
parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv2 + 1, lastDetectedArg, argDenotation = nullptr, true); parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv2 + 1, lastDetectedArg, argDenotation = nullptr, true);
parser.printBashCompletion(1, argv2, 1, lastDetectedArg); parser.printBashCompletion(1, argv2, 1, lastDetectedArg);
cout.rdbuf(regularCoutBuffer); cout.rdbuf(regularCoutBuffer);
CPPUNIT_ASSERT_EQUAL(string("COMPREPLY=('--files' '--values' )\n"), buffer.str()); CPPUNIT_ASSERT_EQUAL(string("COMPREPLY=('--files' '--values' )\n"), buffer.str());
// specifying no args should propose all main arguments // specifying no args should propose all main arguments
index = 0, lastDetectedArg = nullptr, buffer.str(string()), getArg.reset(), setArg.reset(); index = 0, lastDetectedArg = nullptr, buffer.str(string());
cout.rdbuf(buffer.rdbuf()); cout.rdbuf(buffer.rdbuf());
argv = nullptr; argv = nullptr;
parser.resetArgs();
parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, nullptr, lastDetectedArg, argDenotation = nullptr, true); parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, nullptr, lastDetectedArg, argDenotation = nullptr, true);
parser.printBashCompletion(0, nullptr, 0, lastDetectedArg); parser.printBashCompletion(0, nullptr, 0, lastDetectedArg);
cout.rdbuf(regularCoutBuffer); cout.rdbuf(regularCoutBuffer);
@ -466,9 +468,10 @@ void ArgumentParserTests::testBashCompletion()
// pre-defined values // pre-defined values
const char *const argv3[] = {"get", "--fields"}; const char *const argv3[] = {"get", "--fields"};
index = 0, lastDetectedArg = nullptr, buffer.str(string()), getArg.reset(), setArg.reset(); index = 0, lastDetectedArg = nullptr, buffer.str(string());
cout.rdbuf(buffer.rdbuf()); cout.rdbuf(buffer.rdbuf());
argv = argv3; argv = argv3;
parser.resetArgs();
parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv3 + 2, lastDetectedArg, argDenotation = nullptr, true); parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv3 + 2, lastDetectedArg, argDenotation = nullptr, true);
parser.printBashCompletion(2, argv3, 2, lastDetectedArg); parser.printBashCompletion(2, argv3, 2, lastDetectedArg);
cout.rdbuf(regularCoutBuffer); cout.rdbuf(regularCoutBuffer);
@ -476,9 +479,10 @@ void ArgumentParserTests::testBashCompletion()
// pre-defined values with equation sign, one letter already present // pre-defined values with equation sign, one letter already present
const char *const argv4[] = {"set", "--values", "a"}; const char *const argv4[] = {"set", "--values", "a"};
index = 0, lastDetectedArg = nullptr, buffer.str(string()), getArg.reset(), setArg.reset(); index = 0, lastDetectedArg = nullptr, buffer.str(string());
cout.rdbuf(buffer.rdbuf()); cout.rdbuf(buffer.rdbuf());
argv = argv4; argv = argv4;
parser.resetArgs();
parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv4 + 3, lastDetectedArg, argDenotation = nullptr, true); parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv4 + 3, lastDetectedArg, argDenotation = nullptr, true);
parser.printBashCompletion(3, argv4, 2, lastDetectedArg); parser.printBashCompletion(3, argv4, 2, lastDetectedArg);
cout.rdbuf(regularCoutBuffer); cout.rdbuf(regularCoutBuffer);
@ -491,9 +495,10 @@ void ArgumentParserTests::testBashCompletion()
mkvFilePath.resize(mkvFilePath.size() - 17); mkvFilePath.resize(mkvFilePath.size() - 17);
TestUtilities::testFilePath("t.aac"); TestUtilities::testFilePath("t.aac");
const char *const argv5[] = {"get", "--files", iniFilePath.c_str()}; const char *const argv5[] = {"get", "--files", iniFilePath.c_str()};
index = 0, lastDetectedArg = nullptr, buffer.str(string()), getArg.reset(), setArg.reset(); index = 0, lastDetectedArg = nullptr, buffer.str(string());
cout.rdbuf(buffer.rdbuf()); cout.rdbuf(buffer.rdbuf());
argv = argv5; argv = argv5;
parser.resetArgs();
parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv5 + 3, lastDetectedArg, argDenotation = nullptr, true); parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv5 + 3, lastDetectedArg, argDenotation = nullptr, true);
parser.printBashCompletion(3, argv5, 2, lastDetectedArg); parser.printBashCompletion(3, argv5, 2, lastDetectedArg);
cout.rdbuf(regularCoutBuffer); cout.rdbuf(regularCoutBuffer);
@ -507,9 +512,10 @@ void ArgumentParserTests::testBashCompletion()
// sub arguments // sub arguments
const char *const argv6[] = {"set", "--"}; const char *const argv6[] = {"set", "--"};
index = 0, lastDetectedArg = nullptr, buffer.str(string()), setArg.reset(), valuesArg.reset(), filesArg.reset(); index = 0, lastDetectedArg = nullptr, buffer.str(string());
cout.rdbuf(buffer.rdbuf()); cout.rdbuf(buffer.rdbuf());
argv = argv6; argv = argv6;
parser.resetArgs();
parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv6 + 2, lastDetectedArg, argDenotation = nullptr, true); parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv6 + 2, lastDetectedArg, argDenotation = nullptr, true);
parser.printBashCompletion(2, argv6, 1, lastDetectedArg); parser.printBashCompletion(2, argv6, 1, lastDetectedArg);
cout.rdbuf(regularCoutBuffer); cout.rdbuf(regularCoutBuffer);
@ -517,9 +523,10 @@ void ArgumentParserTests::testBashCompletion()
// nested sub arguments // nested sub arguments
const char *const argv7[] = {"-i", "--sub", "--"}; const char *const argv7[] = {"-i", "--sub", "--"};
index = 0, lastDetectedArg = nullptr, buffer.str(string()), setArg.reset(), valuesArg.reset(), filesArg.reset(); index = 0, lastDetectedArg = nullptr, buffer.str(string());
cout.rdbuf(buffer.rdbuf()); cout.rdbuf(buffer.rdbuf());
argv = argv7; argv = argv7;
parser.resetArgs();
parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv7 + 3, lastDetectedArg, argDenotation = nullptr, true); parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv7 + 3, lastDetectedArg, argDenotation = nullptr, true);
parser.printBashCompletion(3, argv7, 2, lastDetectedArg); parser.printBashCompletion(3, argv7, 2, lastDetectedArg);
cout.rdbuf(regularCoutBuffer); cout.rdbuf(regularCoutBuffer);
@ -527,9 +534,10 @@ void ArgumentParserTests::testBashCompletion()
// started pre-defined values with equation sign, one letter already present, last value matches // started pre-defined values with equation sign, one letter already present, last value matches
const char *const argv8[] = {"set", "--values", "t"}; const char *const argv8[] = {"set", "--values", "t"};
index = 0, lastDetectedArg = nullptr, buffer.str(string()), parser.resetArgs(); index = 0, lastDetectedArg = nullptr, buffer.str(string());
cout.rdbuf(buffer.rdbuf()); cout.rdbuf(buffer.rdbuf());
argv = argv8; argv = argv8;
parser.resetArgs();
parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv8 + 3, lastDetectedArg, argDenotation = nullptr, true); parser.readSpecifiedArgs(parser.m_mainArgs, index, argv, argv8 + 3, lastDetectedArg, argDenotation = nullptr, true);
parser.printBashCompletion(3, argv8, 2, lastDetectedArg); parser.printBashCompletion(3, argv8, 2, lastDetectedArg);
cout.rdbuf(regularCoutBuffer); cout.rdbuf(regularCoutBuffer);