Commit 0bcf78f8 authored by Dominik Charousset's avatar Dominik Charousset

Add unit tests for reproducing #942

parent cc7e8d5a
......@@ -165,6 +165,11 @@ public:
/// Generates human-readable help text for all options.
std::string help_text(bool global_only = true) const;
/// Drops all options.
void clear() {
opts_.clear();
}
// -- parsing ----------------------------------------------------------------
/// Parses a given range as CLI arguments into `config`.
......
......@@ -161,6 +161,7 @@ auto config_option_set::parse(settings& config, argument_iterator first,
return static_cast<pec>(err.code());
return pec::illegal_argument;
}
opt.store(*val);
entry[opt_name] = std::move(*val);
}
return pec::success;
......
......@@ -38,6 +38,14 @@ namespace {
struct fixture {
config_option_set opts;
template <class T>
error read(settings& cfg, std::vector<std::string> args) {
auto res = opts.parse(cfg, std::move(args));
if (res.first != pec::success)
return res.first;
return none;
}
template <class T>
expected<T> read(std::vector<std::string> args) {
settings cfg;
......@@ -160,4 +168,69 @@ CAF_TEST(flat CLI parsing with nested categories) {
CAF_CHECK_EQUAL(read<std::string>({"--foo.goo.bar=foobar"}), "foobar");
}
CAF_TEST(square brackets are optional on the command line) {
using int_list = std::vector<int>;
opts.add<int_list>("global", "bar,b", "some list");
CAF_CHECK_EQUAL(read<int_list>({"--bar=[1])"}), int_list({1}));
CAF_CHECK_EQUAL(read<int_list>({"--bar=[1,])"}), int_list({1}));
CAF_CHECK_EQUAL(read<int_list>({"--bar=[ 1 , ])"}), int_list({1}));
CAF_CHECK_EQUAL(read<int_list>({"--bar=[1,2])"}), int_list({1, 2}));
CAF_CHECK_EQUAL(read<int_list>({"--bar=[1, 2, 3])"}), int_list({1, 2, 3}));
CAF_CHECK_EQUAL(read<int_list>({"--bar=[1, 2, 3, ])"}), int_list({1, 2, 3}));
CAF_CHECK_EQUAL(read<int_list>({"--bar=1)"}), int_list({1}));
CAF_CHECK_EQUAL(read<int_list>({"--bar=1,2,3)"}), int_list({1, 2, 3}));
CAF_CHECK_EQUAL(read<int_list>({"--bar=1, 2 , 3 , )"}), int_list({1, 2, 3}));
}
#define SUBTEST(msg) \
opts.clear(); \
if (true)
CAF_TEST(CLI arguments override defaults) {
using int_list = std::vector<int>;
using string_list = std::vector<std::string>;
SUBTEST("with ref syncing") {
settings cfg;
int_list ints;
string_list strings;
CAF_MESSAGE("add --foo and --bar options");
opts.add(strings, "global", "foo,f", "some list");
opts.add(ints, "global", "bar,b", "some list");
CAF_MESSAGE("test integer lists");
ints = int_list{1, 2, 3};
cfg["bar"] = config_value{ints};
CAF_CHECK_EQUAL(get<int_list>(cfg, "bar"), int_list({1, 2, 3}));
CAF_CHECK_EQUAL(read<int_list>(cfg, {"--bar=[10, 20, 30])"}), none);
CAF_CHECK_EQUAL(ints, int_list({10, 20, 30}));
CAF_CHECK_EQUAL(get<int_list>(cfg, "bar"), int_list({10, 20, 30}));
CAF_MESSAGE("test string lists");
strings = string_list{"one", "two", "three"};
cfg["foo"] = config_value{strings};
CAF_CHECK_EQUAL(get<string_list>(cfg, "foo"),
string_list({"one", "two", "three"}));
CAF_CHECK_EQUAL(read<string_list>(cfg, {"--foo=[hello, world])"}), none);
CAF_CHECK_EQUAL(strings, string_list({"hello", "world"}));
CAF_CHECK_EQUAL(get<string_list>(cfg, "foo"),
string_list({"hello", "world"}));
}
SUBTEST("without ref syncing") {
settings cfg;
CAF_MESSAGE("add --foo and --bar options");
opts.add<string_list>("global", "foo,f", "some list");
opts.add<int_list>("global", "bar,b", "some list");
CAF_MESSAGE("test integer lists");
cfg["bar"] = config_value{int_list{1, 2, 3}};
CAF_CHECK_EQUAL(get<int_list>(cfg, "bar"), int_list({1, 2, 3}));
CAF_CHECK_EQUAL(read<int_list>(cfg, {"--bar=[10, 20, 30])"}), none);
CAF_CHECK_EQUAL(get<int_list>(cfg, "bar"), int_list({10, 20, 30}));
CAF_MESSAGE("test string lists");
cfg["foo"] = config_value{string_list{"one", "two", "three"}};
CAF_CHECK_EQUAL(get<string_list>(cfg, "foo"),
string_list({"one", "two", "three"}));
CAF_CHECK_EQUAL(read<string_list>(cfg, {"--foo=[hello, world])"}), none);
CAF_CHECK_EQUAL(get<string_list>(cfg, "foo"),
string_list({"hello", "world"}));
}
}
CAF_TEST_FIXTURE_SCOPE_END()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment