summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/program_options/test/positional_options_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/program_options/test/positional_options_test.cpp')
-rw-r--r--src/boost/libs/program_options/test/positional_options_test.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/boost/libs/program_options/test/positional_options_test.cpp b/src/boost/libs/program_options/test/positional_options_test.cpp
new file mode 100644
index 000000000..2c1dfd66c
--- /dev/null
+++ b/src/boost/libs/program_options/test/positional_options_test.cpp
@@ -0,0 +1,91 @@
+// Copyright Vladimir Prus 2004.
+// 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 <boost/program_options/positional_options.hpp>
+#include <boost/program_options/options_description.hpp>
+#include <boost/program_options/parsers.hpp>
+using namespace boost::program_options;
+// We'll use po::value everywhere to workaround vc6 bug.
+namespace po = boost::program_options;
+
+
+#include <boost/limits.hpp>
+
+#include "minitest.hpp"
+
+#include <vector>
+using namespace std;
+
+void test_positional_options()
+{
+ positional_options_description p;
+ p.add("first", 1);
+
+ BOOST_CHECK_EQUAL(p.max_total_count(), 1u);
+ BOOST_CHECK_EQUAL(p.name_for_position(0), "first");
+
+ p.add("second", 2);
+
+ BOOST_CHECK_EQUAL(p.max_total_count(), 3u);
+ BOOST_CHECK_EQUAL(p.name_for_position(0), "first");
+ BOOST_CHECK_EQUAL(p.name_for_position(1), "second");
+ BOOST_CHECK_EQUAL(p.name_for_position(2), "second");
+
+ p.add("third", -1);
+
+ BOOST_CHECK_EQUAL(p.max_total_count(), (std::numeric_limits<unsigned>::max)());
+ BOOST_CHECK_EQUAL(p.name_for_position(0), "first");
+ BOOST_CHECK_EQUAL(p.name_for_position(1), "second");
+ BOOST_CHECK_EQUAL(p.name_for_position(2), "second");
+ BOOST_CHECK_EQUAL(p.name_for_position(3), "third");
+ BOOST_CHECK_EQUAL(p.name_for_position(10000), "third");
+}
+
+void test_parsing()
+{
+ options_description desc;
+ desc.add_options()
+ ("first", po::value<int>())
+ ("second", po::value<int>())
+ ("input-file", po::value< vector<string> >())
+ ("some-other", po::value<string>())
+ ;
+
+ positional_options_description p;
+ p.add("input-file", 2).add("some-other", 1);
+
+ vector<string> args;
+ args.push_back("--first=10");
+ args.push_back("file1");
+ args.push_back("--second=10");
+ args.push_back("file2");
+ args.push_back("file3");
+
+ // Check that positional options are handled.
+ parsed_options parsed =
+ command_line_parser(args).options(desc).positional(p).run();
+
+ BOOST_REQUIRE(parsed.options.size() == 5);
+ BOOST_CHECK_EQUAL(parsed.options[1].string_key, "input-file");
+ BOOST_CHECK_EQUAL(parsed.options[1].value[0], "file1");
+ BOOST_CHECK_EQUAL(parsed.options[3].string_key, "input-file");
+ BOOST_CHECK_EQUAL(parsed.options[3].value[0], "file2");
+ BOOST_CHECK_EQUAL(parsed.options[4].value[0], "file3");
+
+ args.push_back("file4");
+
+ // Check that excessive number of positional options is detected.
+ BOOST_CHECK_THROW(command_line_parser(args).options(desc).positional(p)
+ .run(),
+ too_many_positional_options_error);
+}
+
+int main(int, char* [])
+{
+ test_positional_options();
+ test_parsing();
+ return 0;
+}
+