/***************************************************************************** * * 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 b_, std::initializer_list i_, std::initializer_list j_) : a{a_}, b{b_}, i{i_}, j{j_} {} bool a = false, b = false; std::vector i, j; friend bool operator == (const active& x, const active& y) noexcept { return x.a == y.a && x.b == y.b && std::equal(begin(x.i), end(x.i), begin(y.i)) && std::equal(begin(x.j), end(x.j), begin(y.j)); } }; //------------------------------------------------------------------- void test(int lineNo, const std::initializer_list args, const active& matches) { using namespace clipp; active m; auto cli = repeatable( ( option("a").set(m.a) & value("i",m.i) ) | ( option("b").set(m.b) & value("j",m.j) ) ); run_wrapped_variants({ __FILE__, lineNo }, args, cli, [&]{ m = active{}; }, [&]{ return m == matches; }); } //------------------------------------------------------------------- int main() { try { test(__LINE__, {""}, active{}); test(__LINE__, {"a"}, active{1,0, {}, {} }); test(__LINE__, {"b"}, active{0,1, {}, {} }); test(__LINE__, {"a", "12"}, active{1,0, {12}, {} }); test(__LINE__, {"b", "34"}, active{0,1, {}, {34} }); test(__LINE__, {"a", "12", "b", "34"}, active{1,1, {12}, {34} }); test(__LINE__, {"a", "12", "a", "34"}, active{1,0, {12,34}, {} }); test(__LINE__, {"b", "12", "b", "34"}, active{0,1, {}, {12,34} }); test(__LINE__, {"a", "1", "b", "2", "a", "3"}, active{1,1, {1,3}, {2} }); test(__LINE__, {"a", "1", "b", "2", "b", "4", "a", "3"}, active{1,1, {1,3}, {2,4} }); test(__LINE__, {"a", "b", "2", "b", "a", "3"}, active{1,1, {3}, {2} }); } catch(std::exception& e) { std::cerr << e.what() << std::endl; return 1; } }