Skip empty args

This commit is contained in:
Martchus 2016-06-23 22:06:59 +02:00
parent 8bcf8cd008
commit e6dfe28149
2 changed files with 11 additions and 5 deletions

View File

@ -454,6 +454,11 @@ void ArgumentParser::readSpecifiedArgs(ArgumentVector &args, std::size_t &index,
} else { } else {
// determine denotation type // determine denotation type
const char *argDenotation = *argv; const char *argDenotation = *argv;
if(!*argDenotation && (!lastArg || values->size() >= lastArg->requiredValueCount())) {
// skip empty arguments
++index, ++argv;
continue;
}
bool abbreviationFound = false; bool abbreviationFound = false;
unsigned char argDenotationType = Value; unsigned char argDenotationType = Value;
*argDenotation == '-' && (++argDenotation, ++argDenotationType) *argDenotation == '-' && (++argDenotation, ++argDenotationType)

View File

@ -126,10 +126,10 @@ void ArgumentParserTests::testParsing()
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 // define the same arguments in a different way
const char *argv2[] = {"tageditor", "-p", "album", "title", "diskpos", "--file", "somefile"}; const char *argv2[] = {"tageditor", "", "-p", "album", "title", "diskpos", "", "--file", "somefile"};
// reparse the args // reparse the args
displayTagInfoArg.reset(), fieldsArg.reset(), filesArg.reset(); displayTagInfoArg.reset(), fieldsArg.reset(), filesArg.reset();
parser.parseArgs(7, argv2); parser.parseArgs(9, argv2);
// check results again // check results again
CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent()); CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent());
CPPUNIT_ASSERT(!displayFileInfoArg.isPresent()); CPPUNIT_ASSERT(!displayFileInfoArg.isPresent());
@ -139,7 +139,8 @@ void ArgumentParserTests::testParsing()
CPPUNIT_ASSERT(!strcmp(fieldsArg.values().at(0), "album")); CPPUNIT_ASSERT(!strcmp(fieldsArg.values().at(0), "album"));
CPPUNIT_ASSERT(!strcmp(fieldsArg.values().at(1), "title")); CPPUNIT_ASSERT(!strcmp(fieldsArg.values().at(1), "title"));
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(!strcmp(fieldsArg.values().at(3), ""));
CPPUNIT_ASSERT_THROW(fieldsArg.values().at(4), out_of_range);
CPPUNIT_ASSERT(filesArg.isPresent()); CPPUNIT_ASSERT(filesArg.isPresent());
CPPUNIT_ASSERT(!strcmp(filesArg.values().at(0), "somefile")); CPPUNIT_ASSERT(!strcmp(filesArg.values().at(0), "somefile"));
@ -259,7 +260,7 @@ void ArgumentParserTests::testParsing()
qtConfigArgs.qtWidgetsGuiArg().reset(); qtConfigArgs.qtWidgetsGuiArg().reset();
fieldsArg.setRequiredValueCount(3); fieldsArg.setRequiredValueCount(3);
verboseArg.setRequired(false); verboseArg.setRequired(false);
parser.parseArgs(7, argv2); parser.parseArgs(9, argv2);
// this should still work without complaints // this should still work without complaints
CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent()); CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent());
CPPUNIT_ASSERT(!displayFileInfoArg.isPresent()); CPPUNIT_ASSERT(!displayFileInfoArg.isPresent());
@ -269,7 +270,7 @@ void ArgumentParserTests::testParsing()
CPPUNIT_ASSERT(!strcmp(fieldsArg.values().at(0), "album")); CPPUNIT_ASSERT(!strcmp(fieldsArg.values().at(0), "album"));
CPPUNIT_ASSERT(!strcmp(fieldsArg.values().at(1), "title")); CPPUNIT_ASSERT(!strcmp(fieldsArg.values().at(1), "title"));
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(fieldsArg.values().at(3), out_of_range);
CPPUNIT_ASSERT(filesArg.isPresent()); CPPUNIT_ASSERT(filesArg.isPresent());
CPPUNIT_ASSERT(!strcmp(filesArg.values().at(0), "somefile")); CPPUNIT_ASSERT(!strcmp(filesArg.values().at(0), "somefile"));