📄 cmdline_test.cpp
字号:
test_case test_cases1[] = {
{"/d d -bar", s_success, "-d: d -bar"},
{"--foo", s_success, "--foo"},
{"/d13", s_extra_parameter, ""},
{"/f14", s_success, "-f:14"},
{"/f", s_missing_parameter, ""},
{0}
};
test_cmdline(",d ,f=", style, test_cases1);
style = cmdline::style_t(
allow_short
| allow_slash_for_short | short_allow_next
| short_allow_adjacent | allow_sticky);
test_case test_cases2[] = {
{"/de", s_extra_parameter, ""},
{"/fe", s_success, "-f:e"},
{0}
};
test_cmdline(",d ,f= ,e", style, test_cases2);
}
void test_disguised_long()
{
using namespace command_line_style;
cmdline::style_t style;
style = cmdline::style_t(
allow_short | short_allow_adjacent
| allow_dash_for_short
| short_allow_next | allow_long_disguise
| long_allow_adjacent);
test_case test_cases1[] = {
{"-foo -f", s_success, "foo: foo:"},
{"-goo=x -gy", s_success, "goo:x goo:y"},
{"-bee=x -by", s_success, "bee:x bee:y"},
{0}
};
test_cmdline("foo,f goo,g= bee,b?", style, test_cases1);
style = cmdline::style_t(style | allow_slash_for_short);
test_case test_cases2[] = {
{"/foo -f", s_success, "foo: foo:"},
{"/goo=x", s_success, "goo:x"},
{0}
};
test_cmdline("foo,f goo,g= bee,b?", style, test_cases2);
}
void test_guessing()
{
using namespace command_line_style;
cmdline::style_t style;
style = cmdline::style_t(
allow_short | short_allow_adjacent
| allow_dash_for_short
| allow_long | long_allow_adjacent
| allow_guessing | allow_long_disguise);
test_case test_cases1[] = {
{"--opt1", s_success, "opt123:"},
{"--opt", s_ambiguous_option, ""},
{"--f=1", s_success, "foo:1"},
{"-far", s_success, "foo:ar"},
{0}
};
test_cmdline("opt123 opt56 foo,f=", style, test_cases1);
}
void test_arguments()
{
using namespace command_line_style;
cmdline::style_t style;
style = cmdline::style_t(
allow_short | allow_long
| allow_dash_for_short
| short_allow_adjacent | long_allow_adjacent);
test_case test_cases1[] = {
{"-f file -gx file2", s_success, "-f: file -g:x file2"},
{"-f - -gx - -- -e", s_success, "-f: - -g:x - -e"},
{0}
};
test_cmdline(",f ,g= ,e", style, test_cases1);
// "--" should stop options regardless of whether long options are
// allowed or not.
style = cmdline::style_t(
allow_short | short_allow_adjacent
| allow_dash_for_short);
test_case test_cases2[] = {
{"-f - -gx - -- -e", s_success, "-f: - -g:x - -e"},
{0}
};
test_cmdline(",f ,g= ,e", style, test_cases2);
}
void test_prefix()
{
using namespace command_line_style;
cmdline::style_t style;
style = cmdline::style_t(
allow_short | allow_long
| allow_dash_for_short
| short_allow_adjacent | long_allow_adjacent
);
test_case test_cases1[] = {
{"--foo.bar=12", s_success, "foo.bar:12"},
{0}
};
test_cmdline("foo*=", style, test_cases1);
}
pair<string, string> at_option_parser(string const&s)
{
if ('@' == s[0])
return std::make_pair(string("response-file"), s.substr(1));
else
return pair<string, string>();
}
pair<string, string> at_option_parser_broken(string const&s)
{
if ('@' == s[0])
return std::make_pair(string("some garbage"), s.substr(1));
else
return pair<string, string>();
}
void test_additional_parser()
{
options_description desc;
desc.add_options()
("response-file", value<string>(), "response file")
("foo", value<int>(), "foo")
;
vector<string> input;
input.push_back("@config");
input.push_back("--foo=1");
cmdline cmd(input);
cmd.set_options_description(desc);
cmd.set_additional_parser(at_option_parser);
vector<option> result = cmd.run();
BOOST_REQUIRE(result.size() == 2);
BOOST_CHECK_EQUAL(result[0].string_key, "response-file");
BOOST_CHECK_EQUAL(result[0].value[0], "config");
BOOST_CHECK_EQUAL(result[1].string_key, "foo");
BOOST_CHECK_EQUAL(result[1].value[0], "1");
// Test that invalid options returned by additional style
// parser are detected.
cmdline cmd2(input);
cmd2.set_options_description(desc);
cmd2.set_additional_parser(at_option_parser_broken);
BOOST_CHECK_THROW(cmd2.run(), unknown_option);
}
vector<option> at_option_parser2(vector<string>& args)
{
vector<option> result;
if ('@' == args[0][0]) {
// Simulate reading the response file.
result.push_back(option("foo", vector<string>(1, "1")));
result.push_back(option("bar", vector<string>(1, "1")));
args.erase(args.begin());
}
return result;
}
void test_style_parser()
{
options_description desc;
desc.add_options()
("foo", value<int>(), "foo")
("bar", value<int>(), "bar")
;
vector<string> input;
input.push_back("@config");
cmdline cmd(input);
cmd.set_options_description(desc);
cmd.extra_style_parser(at_option_parser2);
vector<option> result = cmd.run();
BOOST_REQUIRE(result.size() == 2);
BOOST_CHECK_EQUAL(result[0].string_key, "foo");
BOOST_CHECK_EQUAL(result[0].value[0], "1");
BOOST_CHECK_EQUAL(result[1].string_key, "bar");
BOOST_CHECK_EQUAL(result[1].value[0], "1");
}
void test_unregistered()
{
// Check unregisted option when no options are registed at all.
options_description desc;
vector<string> input;
input.push_back("--foo=1");
input.push_back("--bar");
input.push_back("1");
input.push_back("-b");
input.push_back("-biz");
cmdline cmd(input);
cmd.set_options_description(desc);
cmd.allow_unregistered();
vector<option> result = cmd.run();
BOOST_REQUIRE(result.size() == 5);
// --foo=1
BOOST_CHECK_EQUAL(result[0].string_key, "foo");
BOOST_CHECK_EQUAL(result[0].unregistered, true);
BOOST_CHECK_EQUAL(result[0].value[0], "1");
// --bar
BOOST_CHECK_EQUAL(result[1].string_key, "bar");
BOOST_CHECK_EQUAL(result[1].unregistered, true);
BOOST_CHECK(result[1].value.empty());
// '1' is considered a positional option, not a value to
// --bar
BOOST_CHECK(result[2].string_key.empty());
BOOST_CHECK(result[2].position_key == 0);
BOOST_CHECK_EQUAL(result[2].unregistered, false);
BOOST_CHECK_EQUAL(result[2].value[0], "1");
// -b
BOOST_CHECK_EQUAL(result[3].string_key, "-b");
BOOST_CHECK_EQUAL(result[3].unregistered, true);
BOOST_CHECK(result[3].value.empty());
// -biz
BOOST_CHECK_EQUAL(result[4].string_key, "-b");
BOOST_CHECK_EQUAL(result[4].unregistered, true);
BOOST_CHECK_EQUAL(result[4].value[0], "iz");
// Check sticky short options together with unregisted options.
desc.add_options()
("help,h", "")
("magic,m", value<string>(), "")
;
input.clear();
input.push_back("-hc");
input.push_back("-mc");
cmdline cmd2(input);
cmd2.set_options_description(desc);
cmd2.allow_unregistered();
result = cmd2.run();
BOOST_REQUIRE(result.size() == 3);
BOOST_CHECK_EQUAL(result[0].string_key, "help");
BOOST_CHECK_EQUAL(result[0].unregistered, false);
BOOST_CHECK(result[0].value.empty());
BOOST_CHECK_EQUAL(result[1].string_key, "-c");
BOOST_CHECK_EQUAL(result[1].unregistered, true);
BOOST_CHECK(result[1].value.empty());
BOOST_CHECK_EQUAL(result[2].string_key, "magic");
BOOST_CHECK_EQUAL(result[2].unregistered, false);
BOOST_CHECK_EQUAL(result[2].value[0], "c");
// CONSIDER:
// There's a corner case:
// -foo
// when 'allow_long_disguise' is set. Should this be considered
// disguised long option 'foo' or short option '-f' with value 'oo'?
// It's not clear yet, so I'm leaving the decision till later.
}
int test_main(int ac, char* av[])
{
test_long_options();
test_short_options();
test_dos_options();
test_disguised_long();
test_guessing();
test_arguments();
test_prefix();
test_additional_parser();
test_style_parser();
test_unregistered();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -