X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FParsedCommand.test.cc;h=223a3e3808a09637c279f6a26db03e83c370c049;hb=456ee576285b76aa46240f8001f426757810dcc1;hp=5b90f2c8473136247c2b08311092f1d296bc3345;hpb=5209d7573f53f4b32730833af00668f5c0e56147;p=senf.git diff --git a/Console/ParsedCommand.test.cc b/Console/ParsedCommand.test.cc index 5b90f2c..223a3e3 100644 --- a/Console/ParsedCommand.test.cc +++ b/Console/ParsedCommand.test.cc @@ -46,7 +46,17 @@ namespace { 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, std::string 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) @@ -116,33 +126,81 @@ BOOST_AUTO_UNIT_TEST(parsedCommand) } { + namespace kw = senf::console::kw; std::stringstream ss; - senf::console::ParsedCommandOverloadBase & c1 (dir.add("cb", &cb1)); - c1.doc( - "Lo nam balnearius Opprimo Pennatus, no decentia sui, dicto esse se pulchritudo,\n" - "pupa Sive res indifferenter. Captivo pa."); - c1.arg(0).doc = "Bar didelfrump di desgorb. Nu widsoflar brimeldrgf."; - c1.arg(1).name = "checkup"; - c1.arg(1).doc = "Florgel, dargel and durgel"; - c1.arg(1).defaultValue = 2.1; - c1.arg(1).hasDefault = true; - senf::console::ParsedCommandOverloadBase & c5 (dir.add("cb", &cb5)); - c5.doc( - "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."); - dir.add("cb", &cb2); - static_cast(dir("cb")).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."); - parser.parse("test/cb 111 222.4; test/cb 222; test/cb foo; test/cb", - boost::bind( boost::ref(executor), boost::ref(ss), _1 )); - BOOST_CHECK_EQUAL( ss.str(), "333\n" "224\n" "Value: foo\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" ); } { @@ -151,14 +209,15 @@ BOOST_AUTO_UNIT_TEST(parsedCommand) BOOST_CHECK_EQUAL( ss.str(), "Usage:\n" - " 1- cb arg11:int [checkup:double]\n" - " 2- cb arg21:string\n" - " 3- cb\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: 2.1\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" @@ -213,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_