From 4c0a1d1169a53cb289d611b87d2088960143ddf6 Mon Sep 17 00:00:00 2001 From: Martchus Date: Mon, 14 Nov 2016 22:38:21 +0100 Subject: [PATCH] Fix minor mistake in argument parser --- application/argumentparser.cpp | 2 ++ tests/argumentparsertests.cpp | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/application/argumentparser.cpp b/application/argumentparser.cpp index ca05999..d33309a 100644 --- a/application/argumentparser.cpp +++ b/application/argumentparser.cpp @@ -577,6 +577,7 @@ void ArgumentParser::readSpecifiedArgs(ArgumentVector &args, std::size_t &index, if(argDenotationType != Abbreviation || !*argDenotation) { // no further abbreviations follow -> read sub args for next argv readSpecifiedArgs(lastArg->m_subArgs, index, ++argv, end, lastArg, argDenotation = nullptr, completionMode); + argDenotation = nullptr; } else { // further abbreviations follow -> don't increment argv, keep processing outstanding chars of argDenotation readSpecifiedArgs(lastArg->m_subArgs, index, argv, end, lastArg, argDenotation, completionMode); @@ -647,6 +648,7 @@ void ArgumentParser::readSpecifiedArgs(ArgumentVector &args, std::size_t &index, // read sub arguments ++m_actualArgc, lastArg = lastArgInLevel = matchingArg; readSpecifiedArgs(lastArg->m_subArgs, index, argv, end, lastArg, argDenotation = nullptr, completionMode); + argDenotation = nullptr; continue; } diff --git a/tests/argumentparsertests.cpp b/tests/argumentparsertests.cpp index b0605c4..140b5b2 100644 --- a/tests/argumentparsertests.cpp +++ b/tests/argumentparsertests.cpp @@ -107,10 +107,11 @@ void ArgumentParserTests::testParsing() fieldsArg.setRequiredValueCount(-1); fieldsArg.setValueNames({"title", "album", "artist", "trackpos"}); fieldsArg.setImplicit(true); + Argument notAlbumArg("album", 'a', "should not be confused with album value"); Argument displayTagInfoArg("get", 'p', "displays the values of all specified tag fields (displays all fields if none specified)"); displayTagInfoArg.setDenotesOperation(true); - displayTagInfoArg.setSubArguments({&fieldsArg, &filesArg, &verboseArg}); - parser.setMainArguments({&qtConfigArgs.qtWidgetsGuiArg(), &printFieldNamesArg, &displayTagInfoArg, &displayFileInfoArg, &helpArg}); + displayTagInfoArg.setSubArguments({&fieldsArg, &filesArg, &verboseArg, ¬AlbumArg}); + parser.setMainArguments({&qtConfigArgs.qtWidgetsGuiArg(), &printFieldNamesArg, &displayTagInfoArg, &displayFileInfoArg, &helpArg, ¬AlbumArg}); // define some argument values const char *argv[] = {"tageditor", "get", "album", "title", "diskpos", "-f", "somefile"}; @@ -306,22 +307,24 @@ void ArgumentParserTests::testParsing() } // test required value count constraint with sufficient number of provided parameters + const char *argv13[] = {"tageditor", "get", "--fields", "album=test", "title", "diskpos", "--files", "somefile"}; qtConfigArgs.qtWidgetsGuiArg().reset(); fieldsArg.setRequiredValueCount(3); verboseArg.setRequired(false); - parser.parseArgs(9, argv2); + parser.parseArgs(8, argv13); // this should still work without complaints CPPUNIT_ASSERT(!qtConfigArgs.qtWidgetsGuiArg().isPresent()); CPPUNIT_ASSERT(!displayFileInfoArg.isPresent()); CPPUNIT_ASSERT(!verboseArg.isPresent()); CPPUNIT_ASSERT(displayTagInfoArg.isPresent()); CPPUNIT_ASSERT(fieldsArg.isPresent()); - CPPUNIT_ASSERT(!strcmp(fieldsArg.values().at(0), "album")); + CPPUNIT_ASSERT(!strcmp(fieldsArg.values().at(0), "album=test")); CPPUNIT_ASSERT(!strcmp(fieldsArg.values().at(1), "title")); CPPUNIT_ASSERT(!strcmp(fieldsArg.values().at(2), "diskpos")); CPPUNIT_ASSERT_THROW(fieldsArg.values().at(3), out_of_range); CPPUNIT_ASSERT(filesArg.isPresent()); CPPUNIT_ASSERT(!strcmp(filesArg.values().at(0), "somefile")); + CPPUNIT_ASSERT(!notAlbumArg.isPresent()); // test required value count constraint with insufficient number of provided parameters displayTagInfoArg.reset(), fieldsArg.reset(), filesArg.reset();