You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
9.7 KiB
213 lines
9.7 KiB
/*****************************************************************************
|
|
*
|
|
* CLIPP - command line interfaces for modern C++
|
|
*
|
|
* released under MIT license
|
|
*
|
|
* (c) 2017-2018 André Müller; foss@andremueller-online.de
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#include "testing.h"
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
struct active {
|
|
active() = default;
|
|
|
|
explicit
|
|
active(bool a_,
|
|
bool ie_, bool je_, bool ke_, bool ve_,
|
|
int i_, int j_, int k_, std::initializer_list<int> v_)
|
|
:
|
|
a{a_},
|
|
ie{ie_}, je{je_}, ke{ke_}, ve{ve_},
|
|
i{i_}, j{j_}, k{k_}, v{v_}
|
|
{}
|
|
|
|
//option presence
|
|
bool a = false;
|
|
//requirement error
|
|
bool ie = false, je = false, ke = false, ve = false;
|
|
//values
|
|
int i = 0, j = 0, k = 0;
|
|
std::vector<int> v;
|
|
|
|
friend bool operator == (const active& x, const active& y) noexcept {
|
|
return (x.a == y.a && x.ie == y.ie && x.je == y.je &&
|
|
x.ke == y.ke && x.ve == y.ve && x.i == y.i &&
|
|
x.j == y.j && x.k == y.k &&
|
|
std::equal(begin(x.v), end(x.v), begin(y.v)));
|
|
}
|
|
|
|
template<class OStream>
|
|
friend OStream& operator << (OStream& os, const active& x) {
|
|
return os << x.a <<' '<< x.ie <<' '<< x.je <<' '<< x.ke <<' '
|
|
<< x.ve <<' '<< x.i <<' '<< x.j <<' '<< x.k;
|
|
}
|
|
};
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
void test(int lineNo,
|
|
const std::initializer_list<const char*> args,
|
|
const active& matches)
|
|
{
|
|
using namespace clipp;
|
|
|
|
active m;
|
|
|
|
auto cli = group(
|
|
option("-a").set(m.a) & opt_value("i", m.i).if_missing(set(m.ie))
|
|
,
|
|
option("-b").set(m.a) & opt_value("i", m.i).if_missing(set(m.ie))
|
|
& opt_value("j", m.j).if_missing(set(m.je))
|
|
,
|
|
option("-c").set(m.a) & opt_value("i", m.i).if_missing(set(m.ie))
|
|
& opt_value("j", m.j).if_missing(set(m.je))
|
|
& opt_value("k", m.k).if_missing(set(m.ke))
|
|
,
|
|
option("-d").set(m.a) & opt_values("v", m.v).if_missing(set(m.ve))
|
|
,
|
|
option("-e").set(m.a) & opt_value("i", m.i).if_missing(set(m.ie))
|
|
& opt_values("v", m.v).if_missing(set(m.ve))
|
|
,
|
|
option("-f").set(m.a) & opt_value("i", m.i).if_missing(set(m.ie))
|
|
& opt_value("j", m.j).if_missing(set(m.je))
|
|
& opt_values("v", m.v)
|
|
,
|
|
option("-k").set(m.a) & value("i", m.i).if_missing(set(m.ie))
|
|
,
|
|
option("-l").set(m.a) & value("i", m.i).if_missing(set(m.ie))
|
|
& opt_value("j", m.j).if_missing(set(m.je))
|
|
,
|
|
option("-m").set(m.a) & value("i", m.i).if_missing(set(m.ie))
|
|
& opt_value("j", m.j).if_missing(set(m.je))
|
|
& opt_value("k", m.k)
|
|
,
|
|
option("-n").set(m.a) & values("v", m.v).if_missing(set(m.ve))
|
|
,
|
|
option("-o").set(m.a) & value("i", m.i).if_missing(set(m.ie))
|
|
& opt_values("v", m.v).if_missing(set(m.ve))
|
|
,
|
|
option("-p").set(m.a) & value("i", m.i).if_missing(set(m.ie))
|
|
& value("j", m.j).if_missing(set(m.je))
|
|
& opt_values("v", m.v).if_missing(set(m.ve))
|
|
,
|
|
option("-q").set(m.a) & value("i", m.i).if_missing(set(m.ie))
|
|
& value("j", m.j).if_missing(set(m.je))
|
|
& values("v", m.v).if_missing(set(m.ve))
|
|
,
|
|
option("-r").set(m.a) & value("i", m.i).if_missing(set(m.ie))
|
|
& value("j", m.j).if_missing(set(m.je))
|
|
,
|
|
option("-s").set(m.a) & value("i", m.i).if_missing(set(m.ie))
|
|
& value("j", m.j).if_missing(set(m.je))
|
|
& opt_value("k", m.k).if_missing(set(m.ke))
|
|
,
|
|
option("-t").set(m.a) & value("i", m.i).if_missing(set(m.ie))
|
|
& value("j", m.j).if_missing(set(m.je))
|
|
& value("k", m.k).if_missing(set(m.ke))
|
|
);
|
|
|
|
run_wrapped_variants({ __FILE__, lineNo }, args, cli,
|
|
[&]{ m = active{}; },
|
|
[&]{ return m == matches; });
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
int main()
|
|
{
|
|
try {
|
|
test(__LINE__, {""}, active{});
|
|
|
|
test(__LINE__, {"-a"}, active{1, 0,0,0,0, 0,0,0,{}});
|
|
test(__LINE__, {"-a", "2"}, active{1, 0,0,0,0, 2,0,0,{}});
|
|
|
|
test(__LINE__, {"-b"}, active{1, 0,0,0,0, 0,0,0,{}});
|
|
test(__LINE__, {"-b", "2"}, active{1, 0,0,0,0, 2,0,0,{}});
|
|
test(__LINE__, {"-b", "2", "3"}, active{1, 0,0,0,0, 2,3,0,{}});
|
|
|
|
test(__LINE__, {"-c"}, active{1, 0,0,0,0, 0,0,0,{}});
|
|
test(__LINE__, {"-c", "2"}, active{1, 0,0,0,0, 2,0,0,{}});
|
|
test(__LINE__, {"-c", "2", "3" }, active{1, 0,0,0,0, 2,3,0,{}});
|
|
test(__LINE__, {"-c", "2", "3", "4"}, active{1, 0,0,0,0, 2,3,4,{}});
|
|
|
|
test(__LINE__, {"-d"}, active{1, 0,0,0,0, 0,0,0,{}});
|
|
test(__LINE__, {"-d", "2"}, active{1, 0,0,0,0, 0,0,0,{2}});
|
|
test(__LINE__, {"-d", "2", "3"}, active{1, 0,0,0,0, 0,0,0,{2,3}});
|
|
test(__LINE__, {"-d", "2", "3", "4"}, active{1, 0,0,0,0, 0,0,0,{2,3,4}});
|
|
test(__LINE__, {"-d", "2", "3", "4", "5"}, active{1, 0,0,0,0, 0,0,0,{2,3,4, 5}});
|
|
|
|
test(__LINE__, {"-c", "2", "-d", "3"}, active{1, 0,0,0,0, 2,0,0,{3}});
|
|
test(__LINE__, {"-d", "3", "-c", "2"}, active{1, 0,0,0,0, 2,0,0,{3}});
|
|
|
|
test(__LINE__, {"-e"}, active{1, 0,0,0,0, 0,0,0,{}});
|
|
test(__LINE__, {"-e", "2"}, active{1, 0,0,0,0, 2,0,0,{}});
|
|
test(__LINE__, {"-e", "2", "3"}, active{1, 0,0,0,0, 2,0,0,{3}});
|
|
test(__LINE__, {"-e", "2", "3", "4"}, active{1, 0,0,0,0, 2,0,0,{3,4}});
|
|
test(__LINE__, {"-e", "2", "3", "4", "5"}, active{1, 0,0,0,0, 2,0,0,{3,4, 5}});
|
|
|
|
test(__LINE__, {"-f"}, active{1, 0,0,0,0, 0,0,0,{}});
|
|
test(__LINE__, {"-f", "2"}, active{1, 0,0,0,0, 2,0,0,{}});
|
|
test(__LINE__, {"-f", "2", "3"}, active{1, 0,0,0,0, 2,3,0,{}});
|
|
test(__LINE__, {"-f", "2", "3", "4"}, active{1, 0,0,0,0, 2,3,0,{4}});
|
|
test(__LINE__, {"-f", "2", "3", "4", "5"}, active{1, 0,0,0,0, 2,3,0,{4, 5}});
|
|
|
|
test(__LINE__, {"-k"}, active{1, 1,0,0,0, 0,0,0,{}});
|
|
test(__LINE__, {"-k", "2"}, active{1, 0,0,0,0, 2,0,0,{}});
|
|
|
|
test(__LINE__, {"-l"}, active{1, 1,0,0,0, 0,0,0,{}});
|
|
test(__LINE__, {"-l", "2"}, active{1, 0,0,0,0, 2,0,0,{}});
|
|
test(__LINE__, {"-l", "2", "3"}, active{1, 0,0,0,0, 2,3,0,{}});
|
|
|
|
test(__LINE__, {"-m"}, active{1, 1,0,0,0, 0,0,0,{}});
|
|
test(__LINE__, {"-m", "2"}, active{1, 0,0,0,0, 2,0,0,{}});
|
|
test(__LINE__, {"-m", "2", "3" }, active{1, 0,0,0,0, 2,3,0,{}});
|
|
test(__LINE__, {"-m", "2", "3", "4"}, active{1, 0,0,0,0, 2,3,4,{}});
|
|
|
|
test(__LINE__, {"-n"}, active{1, 0,0,0,1, 0,0,0,{}});
|
|
test(__LINE__, {"-n", "2"}, active{1, 0,0,0,0, 0,0,0,{2}});
|
|
test(__LINE__, {"-n", "2", "3"}, active{1, 0,0,0,0, 0,0,0,{2,3}});
|
|
test(__LINE__, {"-n", "2", "3", "4"}, active{1, 0,0,0,0, 0,0,0,{2,3,4}});
|
|
test(__LINE__, {"-n", "2", "3", "4", "5"}, active{1, 0,0,0,0, 0,0,0,{2,3,4, 5}});
|
|
|
|
test(__LINE__, {"-o"}, active{1, 1,0,0,0, 0,0,0,{}});
|
|
test(__LINE__, {"-o", "2"}, active{1, 0,0,0,0, 2,0,0,{}});
|
|
test(__LINE__, {"-o", "2", "3"}, active{1, 0,0,0,0, 2,0,0,{3}});
|
|
test(__LINE__, {"-o", "2", "3", "4"}, active{1, 0,0,0,0, 2,0,0,{3,4}});
|
|
test(__LINE__, {"-o", "2", "3", "4", "5"}, active{1, 0,0,0,0, 2,0,0,{3,4, 5}});
|
|
|
|
test(__LINE__, {"-p"}, active{1, 1,1,0,0, 0,0,0,{}});
|
|
test(__LINE__, {"-p", "2"}, active{1, 0,1,0,0, 2,0,0,{}});
|
|
test(__LINE__, {"-p", "2", "3"}, active{1, 0,0,0,0, 2,3,0,{}});
|
|
test(__LINE__, {"-p", "2", "3", "4"}, active{1, 0,0,0,0, 2,3,0,{4}});
|
|
test(__LINE__, {"-p", "2", "3", "4", "5"}, active{1, 0,0,0,0, 2,3,0,{4, 5}});
|
|
|
|
test(__LINE__, {"-q"}, active{1, 1,1,0,1, 0,0,0,{}});
|
|
test(__LINE__, {"-q", "2"}, active{1, 0,1,0,1, 2,0,0,{}});
|
|
test(__LINE__, {"-q", "2", "3"}, active{1, 0,0,0,1, 2,3,0,{}});
|
|
test(__LINE__, {"-q", "2", "3", "4"}, active{1, 0,0,0,0, 2,3,0,{4}});
|
|
test(__LINE__, {"-q", "2", "3", "4", "5"}, active{1, 0,0,0,0, 2,3,0,{4, 5}});
|
|
|
|
test(__LINE__, {"-r"}, active{1, 1,1,0,0, 0,0,0,{}});
|
|
test(__LINE__, {"-r", "2"}, active{1, 0,1,0,0, 2,0,0,{}});
|
|
test(__LINE__, {"-r", "2", "3"}, active{1, 0,0,0,0, 2,3,0,{}});
|
|
|
|
test(__LINE__, {"-s"}, active{1, 1,1,0,0, 0,0,0,{}});
|
|
test(__LINE__, {"-s", "2"}, active{1, 0,1,0,0, 2,0,0,{}});
|
|
test(__LINE__, {"-s", "2", "3" }, active{1, 0,0,0,0, 2,3,0,{}});
|
|
test(__LINE__, {"-s", "2", "3", "4"}, active{1, 0,0,0,0, 2,3,4,{}});
|
|
|
|
test(__LINE__, {"-t"}, active{1, 1,1,1,0, 0,0,0,{}});
|
|
test(__LINE__, {"-t", "2"}, active{1, 0,1,1,0, 2,0,0,{}});
|
|
test(__LINE__, {"-t", "2", "3" }, active{1, 0,0,1,0, 2,3,0,{}});
|
|
test(__LINE__, {"-t", "2", "3", "4"}, active{1, 0,0,0,0, 2,3,4,{}});
|
|
|
|
}
|
|
catch(std::exception& e) {
|
|
std::cerr << e.what() << std::endl;
|
|
return 1;
|
|
}
|
|
}
|