Improve SyncthingProcess::splitArguments() parser

This commit is contained in:
Martchus 2018-04-18 23:46:17 +02:00
parent 2d6ca44aa5
commit b0dc9c861d
2 changed files with 25 additions and 7 deletions

View File

@ -54,7 +54,9 @@ QStringList SyncthingProcess::splitArguments(const QString &arguments)
case ' ': case ' ':
switch (lastInput) { switch (lastInput) {
case Slash: case Slash:
currentArg += c; if (!currentArg.isEmpty()) {
currentArg += c;
}
lastInput = Any; lastInput = Any;
break; break;
case Space: case Space:
@ -68,8 +70,10 @@ QStringList SyncthingProcess::splitArguments(const QString &arguments)
currentArg += c; currentArg += c;
lastInput = Any; lastInput = Any;
} else { } else {
result << currentArg; if (!currentArg.isEmpty()) {
currentArg.clear(); result << currentArg;
currentArg.clear();
}
lastInput = Space; lastInput = Space;
} }
} }

View File

@ -102,12 +102,26 @@ void MiscTests::testParsingConfig()
*/ */
void MiscTests::testSplittingArguments() void MiscTests::testSplittingArguments()
{ {
CPPUNIT_ASSERT_EQUAL(QStringList(), SyncthingProcess::splitArguments(QString())); CPPUNIT_ASSERT_EQUAL_MESSAGE("empty arguments", QStringList(), SyncthingProcess::splitArguments(QString()));
CPPUNIT_ASSERT_EQUAL(QStringList({ QStringLiteral("-simple") }), SyncthingProcess::splitArguments(QStringLiteral("-simple"))); CPPUNIT_ASSERT_EQUAL_MESSAGE("one argument without special characters", QStringList({ QStringLiteral("-simple") }),
CPPUNIT_ASSERT_EQUAL(QStringList({ QStringLiteral("-home"), QStringLiteral("some dir"), QStringLiteral("-no-restart") }), SyncthingProcess::splitArguments(QStringLiteral("-simple")));
CPPUNIT_ASSERT_EQUAL_MESSAGE("multiple arguments without special characters",
QStringList({ QStringLiteral("-home"), QStringLiteral("some dir"), QStringLiteral("-no-restart") }),
SyncthingProcess::splitArguments(QStringLiteral("-home \"some dir\" -no-restart"))); SyncthingProcess::splitArguments(QStringLiteral("-home \"some dir\" -no-restart")));
CPPUNIT_ASSERT_EQUAL(QStringList({ QStringLiteral("-home"), QStringLiteral("\"some"), QStringLiteral("dir\""), QStringLiteral("-no-restart") }), CPPUNIT_ASSERT_EQUAL_MESSAGE("quotation", QStringList({ QStringLiteral("-home"), QStringLiteral("some dir"), QStringLiteral("-no-restart") }),
SyncthingProcess::splitArguments(QStringLiteral(" -home \"some dir\" -no-restart ")));
CPPUNIT_ASSERT_EQUAL_MESSAGE("escaped quotation",
QStringList({ QStringLiteral("-home"), QStringLiteral("\"some"), QStringLiteral("dir\""), QStringLiteral("-no-restart") }),
SyncthingProcess::splitArguments(QStringLiteral("-home \\\"some dir\\\" -no-restart"))); SyncthingProcess::splitArguments(QStringLiteral("-home \\\"some dir\\\" -no-restart")));
CPPUNIT_ASSERT_EQUAL_MESSAGE("escaped spaces",
QStringList({ QStringLiteral("-home"), QStringLiteral("some dir"), QStringLiteral("-no-restart") }),
SyncthingProcess::splitArguments(QStringLiteral("-home \\ some\\ dir -no-restart")));
CPPUNIT_ASSERT_EQUAL_MESSAGE("spaces at the beginning through quotes", QStringList({ QStringLiteral("foo"), QStringLiteral(" bar") }),
SyncthingProcess::splitArguments(QStringLiteral("foo \" bar\"")));
CPPUNIT_ASSERT_EQUAL_MESSAGE("spaces at the end through quotes", QStringList({ QStringLiteral("-home"), QStringLiteral("-no-restart ") }),
SyncthingProcess::splitArguments(QStringLiteral("-home \"-no-restart \"")));
CPPUNIT_ASSERT_EQUAL_MESSAGE("don't care about missing quote at the end", QStringList({ QStringLiteral("foo"), QStringLiteral(" bar") }),
SyncthingProcess::splitArguments(QStringLiteral("foo \" bar")));
} }
/*! /*!