X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FParsedCommand.test.cc;h=223a3e3808a09637c279f6a26db03e83c370c049;hb=1b1d76302a5d61e918ef71f1c8e11f80ac1262e2;hp=98a5584461d4a9ff73185852297624a22f2155d9;hpb=76fe5e8b7de8a71aeb6fe9b1d0ea37d5fa51c87a;p=senf.git diff --git a/Console/ParsedCommand.test.cc b/Console/ParsedCommand.test.cc index 98a5584..223a3e3 100644 --- a/Console/ParsedCommand.test.cc +++ b/Console/ParsedCommand.test.cc @@ -27,6 +27,7 @@ //#include "ParsedCommand.test.ih" // Custom includes +#include #include #include "ParsedCommand.hh" #include "Executor.hh" @@ -42,10 +43,20 @@ namespace { int cb1(int a, double b) { return int(a+b); } - double cb2() { return 1.2; } - void cb3(int) {} + double cb2(){ return 1.2; } + void cb3(int i) { } std::string cb4(std::ostream & os) { os << "text\n"; return "value"; } - void cb5(std::ostream & os, int v) { os << "Value: " << v << "\n"; } + void cb5(std::ostream & os, std::string const & v) { os << "Value: " << v << "\n"; } + + struct TestParser + { + void operator()(senf::console::ParseCommandInfo::TokensRange const &, + std::string & out) const + { out = "true"; } + }; + + void testFormatter(double, std::ostream & os) + { os << "formatter"; } } BOOST_AUTO_UNIT_TEST(parsedCommand) @@ -115,14 +126,114 @@ BOOST_AUTO_UNIT_TEST(parsedCommand) } { + namespace kw = senf::console::kw; std::stringstream ss; - dir.add("cb", &cb1); - dir.add("cb", &cb5); - dir.add("cb", &cb2); - parser.parse("test/cb 111 222.4; test/cb 222; test/cb", - boost::bind( boost::ref(executor), boost::ref(ss), _1 )); - BOOST_CHECK_EQUAL( ss.str(), "333\n" "Value: 222\n" "1.2\n" ); + // Just for the fun of it, use a functor and not a function pointer as parser ... + dir.add("cb6", &cb5) + .arg( kw::parser = TestParser() ); + BOOST_CHECK_NO_THROW( + parser.parse("test/cb6 false", + boost::bind( boost::ref(executor), boost::ref(ss), _1 )) ); + BOOST_CHECK_EQUAL( ss.str(), "Value: true\n" ); + } + + { + std::stringstream ss; + + // This tests adding boost::function objects and at the same time validates, that + // compatible types also work + dir.add("cb7", boost::function(&cb2)) + .formatter( &testFormatter ); + BOOST_CHECK_NO_THROW( + parser.parse("test/cb7", + boost::bind( boost::ref(executor), boost::ref(ss), _1 )) ); + BOOST_CHECK_EQUAL( ss.str(), "formatter\n" ); + } + + { + std::stringstream ss; + + using namespace senf::console::kw; + + dir.add("cb", &cb1) + .doc( + "Ops fortunate, ops me ut orgia vociferatio contumax per, rudo re loco emitto\n" + "intolerabiliter ita iugo. Subcribo gravo. Devenio luna fonticulus Castanea\n" + "horum fascino Os interpretor non ipse conjuratio hora, qui filius denuntio ait\n" + "sono te odium Anhelo. Dum Cedo audax celox alius una Agnosco hic, ibi retineo\n" + "lux sto ioco. Per Re dono. Copiose reus scitus jus diligens sis scapulare\n" + "Servitium transi." ) + + .overloadDoc( + "Lo nam balnearius Opprimo Pennatus, no decentia sui, dicto esse se pulchritudo,\n" + "pupa Sive res indifferenter. Captivo pa." ) + + .arg( description = "Bar didelfrump di desgorb. Nu widsoflar brimeldrgf." ) + + .arg( name = "checkup", + type_name = "number", + description = "Florgel, dargel and durgel", + default_value = 2.1, + default_doc = "(double) 2.1" ); + + senf::console::OverloadedCommandNode & cbNode ( + dir.add("cb", &cb5) + .overloadDoc( + "Uus Primordia fundo falsidicus corium, diurnitas humo pro leto. Sui Ueraciter\n" + "hio eruca lenis qua Agalmate ut fors penitentia. Iugum obdormio anxio nuncupo\n" + "iam, in vos nam Custodi." ) + .arg( "text", default_value = "" ) ); + + (void) cbNode; + + BOOST_CHECK_NO_THROW( + parser.parse("test/cb 111 222.4", + boost::bind( boost::ref(executor), boost::ref(ss), _1 )) ); + BOOST_CHECK_NO_THROW( + parser.parse("test/cb 222", + boost::bind( boost::ref(executor), boost::ref(ss), _1 )) ); + BOOST_CHECK_NO_THROW( + parser.parse("test/cb foo", + boost::bind( boost::ref(executor), boost::ref(ss), _1 )) ); + BOOST_CHECK_NO_THROW( + parser.parse("test/cb", + boost::bind( boost::ref(executor), boost::ref(ss), _1 )) ); + + BOOST_CHECK_EQUAL( ss.str(), "333\n" "224\n" "Value: foo\n" "Value: \n" ); + } + + { + std::stringstream ss; + senf::console::root()["test"]("cb").help(ss); + BOOST_CHECK_EQUAL( + ss.str(), + "Usage:\n" + " 1- cb arg11:int [checkup:number]\n" + " 2- cb [text:string]\n" + "\n" + "With:\n" + " arg11 Bar didelfrump di desgorb. Nu widsoflar brimeldrgf.\n" + " checkup Florgel, dargel and durgel\n" + " default: (double) 2.1\n" + " text \n" + " default: (empty)\n" + "\n" + "Ops fortunate, ops me ut orgia vociferatio contumax per, rudo re loco emitto\n" + "intolerabiliter ita iugo. Subcribo gravo. Devenio luna fonticulus Castanea\n" + "horum fascino Os interpretor non ipse conjuratio hora, qui filius denuntio ait\n" + "sono te odium Anhelo. Dum Cedo audax celox alius una Agnosco hic, ibi retineo\n" + "lux sto ioco. Per Re dono. Copiose reus scitus jus diligens sis scapulare\n" + "Servitium transi.\n" + "\n" + "Variant 1:\n" + "Lo nam balnearius Opprimo Pennatus, no decentia sui, dicto esse se pulchritudo,\n" + "pupa Sive res indifferenter. Captivo pa.\n" + "\n" + "Variant 2:\n" + "Uus Primordia fundo falsidicus corium, diurnitas humo pro leto. Sui Ueraciter\n" + "hio eruca lenis qua Agalmate ut fors penitentia. Iugum obdormio anxio nuncupo\n" + "iam, in vos nam Custodi.\n" ); } } @@ -140,8 +251,8 @@ namespace { std::string name(std::string const & suffix) { return name_ + suffix; } - }; + } BOOST_AUTO_UNIT_TEST(memberParsedCommand) @@ -161,6 +272,31 @@ BOOST_AUTO_UNIT_TEST(memberParsedCommand) BOOST_CHECK_EQUAL( ss.str(), "bar: foo\n" ); } } + +#ifdef COMPILE_CHECK + +COMPILE_FAIL(argParser) +{ + senf::console::ScopedDirectory<> dir; + + // Fails, since there are only two arguments defined + dir.add("cb", &cb1) + .arg() + .arg() + .arg(); +} + +COMPILE_FAIL(defaultDoc) +{ + senf::console::ScopedDirectory<> dir; + using namespace senf::console::kw; + + // Fails, since default_value is missing but default_doc is given + dir.add("cb",&cb1) + .arg(default_doc = "doc"); +} + +#endif ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_