diff options
author | David Faure <david.faure@kdab.com> | 2013-09-07 18:17:12 -0400 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-10 19:05:19 +0200 |
commit | 4ff6951550cb6e39c3b31895c3af57037e90c9ac (patch) | |
tree | 5161e3cd21c69474409575acc2356faf3c59235b /tests/auto/corelib | |
parent | ad46d5b82b1bc4ce931b62907cd41356de294f5a (diff) |
Fix escape handling in qWinCmdArgs
-DKEY="VALUE" was correctly turned into -DKEY=VALUE,
but -DKEY=\"VALUE\" was turned into -DKEY=\VALUE"
due to the erroneous check ('quote' is still 0 when
encountering the first '\' character).
This fixes QCoreApplication::arguments() as used by
moc.exe after porting to QCommandLineParser.
Further investigation shows that double-quotes and single-quotes
are handled differently. The tests now ensure that this parser
respects what Windows sends in argv, and in particular that
QTBUG-15379 doesn't regress, as well as fixing QTBUG-30628.
Task-number: QTBUG-15379, QTBUG-30628
Change-Id: I95062c9a6022632b321b2f6fae3089f07be7b5c6
Reviewed-by: Richard J. Moore <rich@kde.org>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'tests/auto/corelib')
-rw-r--r-- | tests/auto/corelib/tools/qcommandlineparser/testhelper/qcommandlineparser_test_helper.cpp | 8 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.cpp | 20 |
2 files changed, 28 insertions, 0 deletions
diff --git a/tests/auto/corelib/tools/qcommandlineparser/testhelper/qcommandlineparser_test_helper.cpp b/tests/auto/corelib/tools/qcommandlineparser/testhelper/qcommandlineparser_test_helper.cpp index c7bd2a5dc9..07f8ddfc8e 100644 --- a/tests/auto/corelib/tools/qcommandlineparser/testhelper/qcommandlineparser_test_helper.cpp +++ b/tests/auto/corelib/tools/qcommandlineparser/testhelper/qcommandlineparser_test_helper.cpp @@ -50,6 +50,13 @@ int main(int argc, char *argv[]) QCoreApplication app(argc, argv); app.setApplicationVersion("1.0"); + // Test for QCoreApplication::arguments() + const QStringList incomingArgs = QCoreApplication::arguments(); + for (int i = 0; i < argc; ++i) { + if (incomingArgs.at(i) != QLatin1String(argv[i])) + qDebug() << "ERROR: arguments[" << i << "] was" << incomingArgs.at(i) << "expected" << argv[i]; + } + QCommandLineParser parser; parser.setApplicationDescription("Test helper"); parser.addHelpOption(); @@ -87,6 +94,7 @@ int main(int argc, char *argv[]) } printf("Positional arguments: %s\n", qPrintable(parser.positionalArguments().join(","))); + printf("Macros: %s\n", qPrintable(parser.values("D").join(","))); return 0; } diff --git a/tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.cpp b/tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.cpp index 3ee5b3fcce..bf9c8a6464 100644 --- a/tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.cpp +++ b/tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.cpp @@ -78,6 +78,7 @@ private slots: void testVersionOption(); void testHelpOption_data(); void testHelpOption(); + void testQuoteEscaping(); }; static char *empty_argv[] = { const_cast<char*>("tst_qcommandlineparser") }; @@ -534,6 +535,25 @@ void tst_QCommandLineParser::testHelpOption() #endif // !QT_NO_PROCESS } +void tst_QCommandLineParser::testQuoteEscaping() +{ + QCoreApplication app(empty_argc, empty_argv); + QProcess process; + process.start("testhelper/qcommandlineparser_test_helper", QStringList() << + QString::number(QCommandLineParser::ParseAsCompactedShortOptions) << + "-DKEY1=\"VALUE1\"" << "-DKEY2=\\\"VALUE2\\\"" << + "-DQTBUG-15379=C:\\path\\'file.ext" << + "-DQTBUG-30628=C:\\temp\\'file'.ext"); + QVERIFY(process.waitForFinished(5000)); + QCOMPARE(process.exitStatus(), QProcess::NormalExit); + QString output = process.readAll(); + QVERIFY2(!output.contains("ERROR"), qPrintable(output)); + QVERIFY2(output.contains("KEY1=\"VALUE1\""), qPrintable(output)); + QVERIFY2(output.contains("KEY2=\\\"VALUE2\\\""), qPrintable(output)); + QVERIFY2(output.contains("QTBUG-15379=C:\\path\\'file.ext"), qPrintable(output)); + QVERIFY2(output.contains("QTBUG-30628=C:\\temp\\'file'.ext"), qPrintable(output)); +} + QTEST_APPLESS_MAIN(tst_QCommandLineParser) #include "tst_qcommandlineparser.moc" |