| // 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 <boost/program_options/options_description.hpp> |
| using namespace boost::program_options; |
| |
| #include <boost/function.hpp> |
| using namespace boost; |
| |
| #include <utility> |
| #include <string> |
| #include <sstream> |
| using namespace std; |
| |
| #include "minitest.hpp" |
| |
| void test_type() |
| { |
| options_description desc; |
| desc.add_options() |
| ("foo", value<int>(), "") |
| ("bar", value<string>(), "") |
| ; |
| |
| const typed_value_base* b = dynamic_cast<const typed_value_base*> |
| (desc.find("foo", false).semantic().get()); |
| BOOST_CHECK(b); |
| BOOST_CHECK(b->value_type() == typeid(int)); |
| |
| const typed_value_base* b2 = dynamic_cast<const typed_value_base*> |
| (desc.find("bar", false).semantic().get()); |
| BOOST_CHECK(b2); |
| BOOST_CHECK(b2->value_type() == typeid(string)); |
| } |
| |
| void test_approximation() |
| { |
| options_description desc; |
| desc.add_options() |
| ("foo", new untyped_value()) |
| ("fee", new untyped_value()) |
| ("baz", new untyped_value()) |
| ("all-chroots", new untyped_value()) |
| ("all-sessions", new untyped_value()) |
| ("all", new untyped_value()) |
| ; |
| |
| BOOST_CHECK_EQUAL(desc.find("fo", true).long_name(), "foo"); |
| |
| BOOST_CHECK_EQUAL(desc.find("all", true).long_name(), "all"); |
| BOOST_CHECK_EQUAL(desc.find("all-ch", true).long_name(), "all-chroots"); |
| |
| options_description desc2; |
| desc2.add_options() |
| ("help", "display this message") |
| ("config", value<string>(), "config file name") |
| ("config-value", value<string>(), "single config value") |
| ; |
| |
| BOOST_CHECK_EQUAL(desc2.find("config", true).long_name(), "config"); |
| BOOST_CHECK_EQUAL(desc2.find("config-value", true).long_name(), |
| "config-value"); |
| |
| |
| // BOOST_CHECK(desc.count_approx("foo") == 1); |
| // set<string> a = desc.approximations("f"); |
| // BOOST_CHECK(a.size() == 2); |
| // BOOST_CHECK(*a.begin() == "fee"); |
| // BOOST_CHECK(*(++a.begin()) == "foo"); |
| } |
| |
| void test_formatting() |
| { |
| // Long option descriptions used to crash on MSVC-8.0. |
| options_description desc; |
| desc.add_options()( |
| "test", new untyped_value(), |
| "foo foo foo foo foo foo foo foo foo foo foo foo foo foo" |
| "foo foo foo foo foo foo foo foo foo foo foo foo foo foo" |
| "foo foo foo foo foo foo foo foo foo foo foo foo foo foo" |
| "foo foo foo foo foo foo foo foo foo foo foo foo foo foo") |
| ("list", new untyped_value(), |
| "a list:\n \t" |
| "item1, item2, item3, item4, item5, item6, item7, item8, item9, " |
| "item10, item11, item12, item13, item14, item15, item16, item17, item18") |
| ("well_formated", new untyped_value(), |
| "As you can see this is a very well formatted option description.\n" |
| "You can do this for example:\n\n" |
| "Values:\n" |
| " Value1: \tdoes this and that, bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla\n" |
| " Value2: \tdoes something else, bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla\n\n" |
| " This paragraph has a first line indent only, bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla") |
| ; |
| |
| stringstream ss; |
| ss << desc; |
| BOOST_CHECK_EQUAL(ss.str(), |
| " --test arg foo foo foo foo foo foo foo foo foo foo foo foo foo \n" |
| " foofoo foo foo foo foo foo foo foo foo foo foo foo foo \n" |
| " foofoo foo foo foo foo foo foo foo foo foo foo foo foo \n" |
| " foofoo foo foo foo foo foo foo foo foo foo foo foo foo \n" |
| " foo\n" |
| " --list arg a list:\n" |
| " item1, item2, item3, item4, item5, item6, item7, \n" |
| " item8, item9, item10, item11, item12, item13, \n" |
| " item14, item15, item16, item17, item18\n" |
| " --well_formated arg As you can see this is a very well formatted option \n" |
| " description.\n" |
| " You can do this for example:\n" |
| " \n" |
| " Values:\n" |
| " Value1: does this and that, bla bla bla bla bla bla \n" |
| " bla bla bla bla bla bla bla bla bla\n" |
| " Value2: does something else, bla bla bla bla bla bla \n" |
| " bla bla bla bla bla bla bla bla bla\n" |
| " \n" |
| " This paragraph has a first line indent only, bla \n" |
| " bla bla bla bla bla bla bla bla bla bla bla bla bla bla\n" |
| ); |
| } |
| |
| void test_formatting_description_length() |
| { |
| { |
| options_description desc("", |
| options_description::m_default_line_length, |
| options_description::m_default_line_length / 2U); |
| desc.add_options() |
| ("an-option-that-sets-the-max", new untyped_value(), // > 40 available for desc |
| "this description sits on the same line, but wrapping should still work correctly") |
| ("a-long-option-that-would-leave-very-little-space-for-description", new untyped_value(), |
| "the description of the long opt, but placed on the next line\n" |
| " \talso ensure that the tabulation works correctly when a" |
| " description size has been set"); |
| |
| stringstream ss; |
| ss << desc; |
| BOOST_CHECK_EQUAL(ss.str(), |
| " --an-option-that-sets-the-max arg this description sits on the same line,\n" |
| " but wrapping should still work \n" |
| " correctly\n" |
| " --a-long-option-that-would-leave-very-little-space-for-description arg\n" |
| " the description of the long opt, but \n" |
| " placed on the next line\n" |
| " also ensure that the tabulation \n" |
| " works correctly when a description \n" |
| " size has been set\n"); |
| } |
| { |
| // the default behaviour reserves 23 (+1 space) characters for the |
| // option column; this shows that the min_description_length does not |
| // breach that. |
| options_description desc("", |
| options_description::m_default_line_length, |
| options_description::m_default_line_length - 10U); // leaves < 23 (default option space) |
| desc.add_options() |
| ("an-option-that-encroaches-description", new untyped_value(), |
| "this description should always be placed on the next line, and wrapping should continue as normal"); |
| |
| stringstream ss; |
| ss << desc; |
| BOOST_CHECK_EQUAL(ss.str(), |
| " --an-option-that-encroaches-description arg\n" |
| //123456789_123456789_ |
| " this description should always be placed on the next line, and \n" |
| " wrapping should continue as normal\n"); |
| } |
| } |
| |
| void test_long_default_value() |
| { |
| options_description desc; |
| desc.add_options() |
| ("cfgfile,c", |
| value<string>()->default_value("/usr/local/etc/myprogramXXXXXXXXX/configuration.conf"), |
| "the configfile") |
| ; |
| |
| stringstream ss; |
| ss << desc; |
| BOOST_CHECK_EQUAL(ss.str(), |
| " -c [ --cfgfile ] arg (=/usr/local/etc/myprogramXXXXXXXXX/configuration.conf)\n" |
| " the configfile\n" |
| ); |
| } |
| |
| void test_word_wrapping() |
| { |
| options_description desc("Supported options"); |
| desc.add_options() |
| ("help", "this is a sufficiently long text to require word-wrapping") |
| ("prefix", value<string>()->default_value("/h/proj/tmp/dispatch"), "root path of the dispatch installation") |
| ("opt1", "this_is_a_sufficiently_long_text_to_require_word-wrapping_but_cannot_be_wrapped") |
| ("opt2", "this_is_a_sufficiently long_text_to_require_word-wrapping") |
| ("opt3", "this_is_a sufficiently_long_text_to_require_word-wrapping_but_will_not_be_wrapped") |
| ; |
| stringstream ss; |
| ss << desc; |
| BOOST_CHECK_EQUAL(ss.str(), |
| "Supported options:\n" |
| " --help this is a sufficiently long text to \n" |
| " require word-wrapping\n" |
| " --prefix arg (=/h/proj/tmp/dispatch) root path of the dispatch installation\n" |
| " --opt1 this_is_a_sufficiently_long_text_to_requ\n" |
| " ire_word-wrapping_but_cannot_be_wrapped\n" |
| " --opt2 this_is_a_sufficiently \n" |
| " long_text_to_require_word-wrapping\n" |
| " --opt3 this_is_a sufficiently_long_text_to_requ\n" |
| " ire_word-wrapping_but_will_not_be_wrappe\n" |
| " d\n" |
| ); |
| } |
| |
| void test_default_values() |
| { |
| options_description desc("Supported options"); |
| desc.add_options() |
| ("maxlength", value<double>()->default_value(.1, "0.1"), "Maximum edge length to keep.") |
| ; |
| stringstream ss; |
| ss << desc; |
| BOOST_CHECK_EQUAL(ss.str(), |
| "Supported options:\n" |
| " --maxlength arg (=0.1) Maximum edge length to keep.\n" |
| ); |
| } |
| |
| |
| int main(int, char* []) |
| { |
| test_type(); |
| test_approximation(); |
| test_formatting(); |
| test_formatting_description_length(); |
| test_long_default_value(); |
| test_word_wrapping(); |
| test_default_values(); |
| return 0; |
| } |
| |