Fix bug with parsing concatenated switches in wxCmdLineParser.
The constructs such as "-abcd" were not parsed correctly, i.e. the same as "-a -b -c -d" because the code tried to parse a non-existent option "abcd" even if it was supposed to not do this -- fix this. Closes #11180. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61851 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
48284cc7c4
commit
758f356c53
@ -374,6 +374,7 @@ All:
|
||||
- Fix output buffer overflow in wxBase64Decode() (Eric W. Savage).
|
||||
- Added bilinear image resizing algorithm to wxImage (bishop).
|
||||
- Fix bug with position argument in wxImage::Size() (Byron Sorgdrager).
|
||||
- Fix bug with parsing concatenated switches in wxCmdLineParser (Mike Funduc).
|
||||
|
||||
All (GUI):
|
||||
|
||||
|
@ -729,6 +729,10 @@ int wxCmdLineParser::Parse(bool showUsage)
|
||||
m_data->m_arguments.insert
|
||||
(m_data->m_arguments.begin() + n + 1, arg2);
|
||||
count++;
|
||||
|
||||
// only leave the part which wasn't extracted into the
|
||||
// next argument in this one
|
||||
arg = arg.Left(len + 1);
|
||||
}
|
||||
//else: it's our value, we'll deal with it below
|
||||
}
|
||||
|
@ -21,6 +21,8 @@
|
||||
#endif // WX_PRECOMP
|
||||
|
||||
#include "wx/cmdline.h"
|
||||
#include "wx/msgout.h"
|
||||
#include "wx/scopeguard.h"
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// test class
|
||||
@ -34,10 +36,12 @@ public:
|
||||
private:
|
||||
CPPUNIT_TEST_SUITE( CmdLineTestCase );
|
||||
CPPUNIT_TEST( ConvertStringTestCase );
|
||||
CPPUNIT_TEST( ParseSwitches );
|
||||
CPPUNIT_TEST( Usage );
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
|
||||
void ConvertStringTestCase();
|
||||
void ParseSwitches();
|
||||
void Usage();
|
||||
|
||||
DECLARE_NO_COPY_CLASS(CmdLineTestCase)
|
||||
@ -117,6 +121,69 @@ void CmdLineTestCase::ConvertStringTestCase()
|
||||
#undef WX_ASSERT_ARGS_EQUAL
|
||||
}
|
||||
|
||||
void CmdLineTestCase::ParseSwitches()
|
||||
{
|
||||
// install a dummy message output object just suppress error messages from
|
||||
// wxCmdLineParser::Parse()
|
||||
class NoMessageOutput : public wxMessageOutput
|
||||
{
|
||||
public:
|
||||
virtual void Output(const wxString& WXUNUSED(str)) { }
|
||||
} noMessages;
|
||||
|
||||
wxMessageOutput * const old = wxMessageOutput::Set(&noMessages);
|
||||
wxON_BLOCK_EXIT1( wxMessageOutput::Set, old );
|
||||
|
||||
wxCmdLineParser p;
|
||||
p.AddSwitch("a");
|
||||
p.AddSwitch("b");
|
||||
p.AddSwitch("c");
|
||||
p.AddSwitch("d");
|
||||
|
||||
p.SetCmdLine("");
|
||||
CPPUNIT_ASSERT_EQUAL(0, p.Parse(false) );
|
||||
CPPUNIT_ASSERT( !p.Found("a") );
|
||||
|
||||
p.SetCmdLine("-z");
|
||||
CPPUNIT_ASSERT( p.Parse(false) != 0 );
|
||||
|
||||
p.SetCmdLine("-a");
|
||||
CPPUNIT_ASSERT_EQUAL(0, p.Parse(false) );
|
||||
CPPUNIT_ASSERT( p.Found("a") );
|
||||
CPPUNIT_ASSERT( !p.Found("b") );
|
||||
|
||||
p.SetCmdLine("-a -d");
|
||||
CPPUNIT_ASSERT_EQUAL(0, p.Parse(false) );
|
||||
CPPUNIT_ASSERT( p.Found("a") );
|
||||
CPPUNIT_ASSERT( !p.Found("b") );
|
||||
CPPUNIT_ASSERT( !p.Found("c") );
|
||||
CPPUNIT_ASSERT( p.Found("d") );
|
||||
|
||||
p.SetCmdLine("-abd");
|
||||
CPPUNIT_ASSERT_EQUAL(0, p.Parse(false) );
|
||||
CPPUNIT_ASSERT( p.Found("a") );
|
||||
CPPUNIT_ASSERT( p.Found("b") );
|
||||
CPPUNIT_ASSERT( !p.Found("c") );
|
||||
CPPUNIT_ASSERT( p.Found("d") );
|
||||
|
||||
p.SetCmdLine("-abdz");
|
||||
CPPUNIT_ASSERT( p.Parse(false) != 0 );
|
||||
|
||||
p.SetCmdLine("-ab -cd");
|
||||
CPPUNIT_ASSERT_EQUAL(0, p.Parse(false) );
|
||||
CPPUNIT_ASSERT( p.Found("a") );
|
||||
CPPUNIT_ASSERT( p.Found("b") );
|
||||
CPPUNIT_ASSERT( p.Found("c") );
|
||||
CPPUNIT_ASSERT( p.Found("d") );
|
||||
|
||||
p.SetCmdLine("-da");
|
||||
CPPUNIT_ASSERT_EQUAL(0, p.Parse(false) );
|
||||
CPPUNIT_ASSERT( p.Found("a") );
|
||||
CPPUNIT_ASSERT( !p.Found("b") );
|
||||
CPPUNIT_ASSERT( !p.Found("c") );
|
||||
CPPUNIT_ASSERT( p.Found("d") );
|
||||
}
|
||||
|
||||
void CmdLineTestCase::Usage()
|
||||
{
|
||||
// check that Usage() returns roughly what we expect (don't check all the
|
||||
|
Loading…
Reference in New Issue
Block a user