Boost logo

Boost Users :

Subject: [Boost-users] [test] Parsing command-line arguments on Windows
From: Mateusz Loskot (mateusz_at_[hidden])
Date: 2015-11-26 11:57:17


Hi,

Here is table with four example of command-line input on Windows
and expected values of 'argv' elements, according to the rules when
interpreting arguments, escape sequences etc.:
https://msdn.microsoft.com/en-us/library/17w5ykft.aspx

Double-checking this actually works:

///////// Windows console program //////////////////////////////////
#include <cstdio>
int main(int argc, char* argv[])
{
    for (int i = 0; i < argc; ++i) std::printf("%d: %s\n", i, argv[i]);
}

F:\test_cpp2015\Debug>test_cpp2015.exe "abc" d e
0: test_cpp2015.exe
1: abc
2: d
3: e

F:\test_cpp2015\Debug>test_cpp2015.exe a\\b d"e f"g h
0: test_cpp2015.exe
1: a\\b
2: de fg
3: h

F:\test_cpp2015\Debug>test_cpp2015.exe a\\\"b c d
0: test_cpp2015.exe
1: a\"b
2: c
3: d

F:\test_cpp2015\Debug>test_cpp2015.exe a\\\\"b c" d e
0: test_cpp2015.exe
1: a\\b c
2: d
3: e
//////////////////////////////////

Now, the same test but with values of framework::master_test_suite().argv

///////// Boost.Test program ///////////////////////////////////////
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_CASE(argv_parsing)
{
    auto argc = boost::unit_test::framework::master_test_suite().argc;
    auto argv = boost::unit_test::framework::master_test_suite().argv;
    for (int i = 0; i < argc; ++i) std::printf("%d: %s\n", i, argv[i]);
}

F:\workshop\test_boost\Debug>test_boost.exe "abc" d e
Running 1 test case...
0: test_boost.exe
1: abc
2: d
3: e

F:\workshop\test_boost\Debug>test_boost.exe a\\b d"e f"g h
Running 1 test case...
0: test_boost.exe
1: a\\b
2: de
3: fg
4: h

F:\workshop\test_boost\Debug>test_boost.exe a\\\"b c d
Running 1 test case...
0: test_boost.exe
1: a\"b
2: c
3: d

F:\workshop\test_boost\Debug>test_boost.exe a\\\\"b c" d e
Running 1 test case...
0: test_boost.exe
1: a\\b
2: c
3: d
4: e
//////////////////////////////////

Why Boost test gives different arguments in the runs
#2 (input: a\\b d"e f"g h) and
#4 (input: a\\\\"b c" d e)
?

I can't see any caveats mentioned in the documentation
http://www.boost.org/doc/libs/1_59_0/libs/test/doc/html/boost_test/tests_organization/test_suite/master_test_suite.html

Best regards,

-- 
Mateusz Loskot, http://mateusz.loskot.net

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net