/***************************************************************************** * * CLIPP - command line interfaces for modern C++ * * released under MIT license * * (c) 2017-2018-2018 André Müller; foss@andremueller-online.de * *****************************************************************************/ #include "testing.h" //------------------------------------------------------------------- struct active { active() = default; explicit active(bool o_, std::string ov_ = "_", std::string pv_ = "_"): o{o_}, ov{std::move(ov_)}, pv{std::move(pv_)} {} bool o = false; std::string ov = "_"; std::string pv = "_"; friend bool operator == (const active& x, const active& y) noexcept { return (x.o == y.o && x.ov == y.ov && x.pv == y.pv); } }; //------------------------------------------------------------------- void test_empty(int lineNo, const std::initializer_list args, const active& matches) { using namespace clipp; active m; auto cli = ( option("-o", "--opt").set(m.o) & value(match::any, "O", m.ov), value("P", m.pv) ); run_wrapped_variants({ __FILE__, lineNo }, args, cli, [&]{ m = active{}; }, [&]{ return m == matches; }); } //------------------------------------------------------------------- void test_nonempty(int lineNo, const std::initializer_list args, const active& matches) { using namespace clipp; active m; auto cli = ( option("-o", "--opt").set(m.o) & value(match::nonempty, "O", m.ov), value("P", m.pv) ); run_wrapped_variants({ __FILE__, lineNo }, args, cli, [&]{ m = active{}; }, [&]{ return m == matches; }); } //------------------------------------------------------------------- int main() { try { test_empty(__LINE__, {}, active{}); test_empty(__LINE__, {""}, active{}); test_empty(__LINE__, {"-o"}, active{true}); test_empty(__LINE__, {"-o", ""}, active{true, ""}); test_empty(__LINE__, {"-o", "X"}, active{true, "X"}); test_empty(__LINE__, {"X"}, active{false, "_", "X"}); test_empty(__LINE__, {"-o", "", "X"}, active{true, "", "X"}); test_nonempty(__LINE__, {}, active{}); test_nonempty(__LINE__, {""}, active{}); test_nonempty(__LINE__, {"-o"}, active{true}); test_nonempty(__LINE__, {"-o", ""}, active{true}); test_nonempty(__LINE__, {"-o", "X"}, active{true, "X"}); test_nonempty(__LINE__, {"X"}, active{false, "_", "X"}); //ambiguous -> cannot map to value "P", expects value "O" first test_nonempty(__LINE__, {"-o", "", "X"}, active{true}); } catch(std::exception& e) { std::cerr << e.what() << std::endl; return 1; } }