diff --git a/src/config_file.cpp b/src/config_file.cpp index 434ad10..a12844c 100644 --- a/src/config_file.cpp +++ b/src/config_file.cpp @@ -111,6 +111,9 @@ namespace boost { namespace program_options { namespace detail { this->value().value.clear(); this->value().value.push_back(value); this->value().unregistered = !registered; + this->value().original_tokens.clear(); + this->value().original_tokens.push_back(name); + this->value().original_tokens.push_back(value); break; } else { diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 6c6d4af..83625e9 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -29,6 +29,7 @@ test-suite program_options : [ po-test winmain.cpp ] [ po-test exception_test.cpp ] [ po-test split_test.cpp ] + [ po-test unrecognized_test.cpp ] ; exe test_convert : test_convert.cpp ; diff --git a/test/unrecognized_test.cpp b/test/unrecognized_test.cpp new file mode 100644 index 0000000..7dfb380 --- /dev/null +++ b/test/unrecognized_test.cpp @@ -0,0 +1,88 @@ +// Copyright Sascha Ochsenknecht 2009. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) + + +#include +#include +#include +#include +using namespace boost::program_options; +using boost::program_options::detail::cmdline; + +#include +#include +#include +#include +using namespace std; + +#include "minitest.hpp" + + +// Test free function collect_unrecognized() +// +// it collects the tokens of all not registered options. It can be used +// to pass them to an own parser implementation + + + +void test_unrecognize_cmdline() +{ + options_description desc; + + string content = "prg --input input.txt --optimization 4 --opt option"; + vector< string > tokens = split_unix(content); + + cmdline cmd(tokens); + cmd.set_options_description(desc); + cmd.allow_unregistered(); + + vector< option > opts = cmd.run(); + vector< string > result = collect_unrecognized(opts, include_positional); + + BOOST_CHECK_EQUAL(result.size(), 7); + BOOST_CHECK_EQUAL(result[0], "prg"); + BOOST_CHECK_EQUAL(result[1], "--input"); + BOOST_CHECK_EQUAL(result[2], "input.txt"); + BOOST_CHECK_EQUAL(result[3], "--optimization"); + BOOST_CHECK_EQUAL(result[4], "4"); + BOOST_CHECK_EQUAL(result[5], "--opt"); + BOOST_CHECK_EQUAL(result[6], "option"); +} + + + +void test_unrecognize_config() +{ + + options_description desc; + + string content = + " input = input.txt\n" + " optimization = 4\n" + " opt = option\n" + ; + + stringstream ss(content); + vector< option > opts = parse_config_file(ss, desc, true).options; + vector< string > result = collect_unrecognized(opts, include_positional); + + BOOST_CHECK_EQUAL(result.size(), 6); + BOOST_CHECK_EQUAL(result[0], "input"); + BOOST_CHECK_EQUAL(result[1], "input.txt"); + BOOST_CHECK_EQUAL(result[2], "optimization"); + BOOST_CHECK_EQUAL(result[3], "4"); + BOOST_CHECK_EQUAL(result[4], "opt"); + BOOST_CHECK_EQUAL(result[5], "option"); +} + + + +int main(int /*ac*/, char** /*av*/) +{ + test_unrecognize_cmdline(); + test_unrecognize_config(); + + return 0; +}