// 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; #define BOOST_INCLUDE_MAIN // for testing, include rather than link #include #include using namespace std; #define TEST_CHECK_THROW(expression, exception, description) \ try \ { \ expression; \ BOOST_ERROR(description);\ throw 10; \ } \ catch(exception &) \ { \ } vector sv(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(), "") ; char* cmdline3_[] = { "--foo='12'", "--bar=11", "-z3", "-ofoo" }; vector cmdline3 = sv(cmdline3_, sizeof(cmdline3_)/sizeof(cmdline3_[0])); 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(), ""); char* cmdline4_[] = { "--zee", "--zak=13" }; vector cmdline4 = sv(cmdline4_, sizeof(cmdline4_)/sizeof(cmdline4_[0])); 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)) ; char* cmdline5_[] = { "--voo=1" }; vector cmdline5 = sv(cmdline5_, sizeof(cmdline5_)/sizeof(cmdline5_[0])); 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); } 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