// Copyright Vladimir Prus 2002-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 #include #include #include using namespace boost::program_options; // We'll use po::value everywhere to workaround vc6 bug. namespace po = boost::program_options; #include using namespace boost; #include using namespace std; #include "minitest.hpp" vector sv(const char* array[], unsigned size) { vector r; for (unsigned i = 0; i < size; ++i) r.push_back(array[i]); return r; } void test_variable_map() { options_description desc; desc.add_options() ("foo,f", new untyped_value) ("bar,b", po::value()) ("biz,z", po::value()) ("baz", new untyped_value()) ("output,o", new untyped_value(), "") ; const char* cmdline3_[] = { "--foo='12'", "--bar=11", "-z3", "-ofoo" }; vector cmdline3 = sv(cmdline3_, sizeof(cmdline3_)/sizeof(const char*)); parsed_options a3 = command_line_parser(cmdline3).options(desc).run(); variables_map vm; store(a3, vm); notify(vm); BOOST_REQUIRE(vm.size() == 4); BOOST_CHECK(vm["foo"].as() == "'12'"); BOOST_CHECK(vm["bar"].as() == "11"); BOOST_CHECK(vm.count("biz") == 1); BOOST_CHECK(vm["biz"].as() == "3"); BOOST_CHECK(vm["output"].as() == "foo"); int i; desc.add_options() ("zee", bool_switch(), "") ("zak", po::value(&i), "") ("opt", bool_switch(), ""); const char* cmdline4_[] = { "--zee", "--zak=13" }; vector cmdline4 = sv(cmdline4_, sizeof(cmdline4_)/sizeof(const char*)); parsed_options a4 = command_line_parser(cmdline4).options(desc).run(); variables_map vm2; store(a4, vm2); notify(vm2); BOOST_REQUIRE(vm2.size() == 3); BOOST_CHECK(vm2["zee"].as() == true); BOOST_CHECK(vm2["zak"].as() == 13); BOOST_CHECK(vm2["opt"].as() == false); BOOST_CHECK(i == 13); options_description desc2; desc2.add_options() ("vee", po::value()->default_value("42")) ("voo", po::value()) ("iii", po::value()->default_value(123)) ; const char* cmdline5_[] = { "--voo=1" }; vector cmdline5 = sv(cmdline5_, sizeof(cmdline5_)/sizeof(const char*)); parsed_options a5 = command_line_parser(cmdline5).options(desc2).run(); variables_map vm3; store(a5, vm3); notify(vm3); BOOST_REQUIRE(vm3.size() == 3); BOOST_CHECK(vm3["vee"].as() == "42"); BOOST_CHECK(vm3["voo"].as() == "1"); BOOST_CHECK(vm3["iii"].as() == 123); options_description desc3; desc3.add_options() ("imp", po::value()->implicit_value(100)) ("iim", po::value()->implicit_value(200)->default_value(201)) ("mmp,m", po::value()->implicit_value(123)->default_value(124)) ("foo", po::value()) ; /* The -m option is implicit. It does not have value in inside the token, and we should not grab the next token. */ const char* cmdline6_[] = { "--imp=1", "-m", "--foo=1" }; vector cmdline6 = sv(cmdline6_, sizeof(cmdline6_)/sizeof(const char*)); parsed_options a6 = command_line_parser(cmdline6).options(desc3).run(); variables_map vm4; store(a6, vm4); notify(vm4); BOOST_REQUIRE(vm4.size() == 4); BOOST_CHECK(vm4["imp"].as() == 1); BOOST_CHECK(vm4["iim"].as() == 201); BOOST_CHECK(vm4["mmp"].as() == 123); } int stored_value; void notifier(const vector& v) { stored_value = v.front(); } void test_semantic_values() { options_description desc; desc.add_options() ("foo", new untyped_value()) ("bar", po::value()) ("biz", po::value< vector >()) ("baz", po::value< vector >()->multitoken()) ("int", po::value< vector >()->notifier(¬ifier)) ; parsed_options parsed(&desc); vector