X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FParsedCommand.test.cc;h=223a3e3808a09637c279f6a26db03e83c370c049;hb=e879290346fe5242d7df2d70ee552d264081492f;hp=94ab8fabaa9e45b7edefedee94ad5edb9f5cb140;hpb=01e02e262ea327678dfa0c3f7a66d50ed91924d5;p=senf.git diff --git a/Console/ParsedCommand.test.cc b/Console/ParsedCommand.test.cc index 94ab8fa..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,9 +126,35 @@ BOOST_AUTO_UNIT_TEST(parsedCommand) } { + namespace kw = senf::console::kw; + std::stringstream ss; + + // 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::tag; + using namespace senf::console::kw; dir.add("cb", &cb1) .doc( @@ -133,26 +169,38 @@ BOOST_AUTO_UNIT_TEST(parsedCommand) "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( description = "Bar didelfrump di desgorb. Nu widsoflar brimeldrgf." ) - .arg( name_ = "checkup", - description_ = "Florgel, dargel and durgel", - default_value_ = 2.1 ); + .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." ) ); + "iam, in vos nam Custodi." ) + .arg( "text", default_value = "" ) ); (void) cbNode; - dir.add("cb", &cb2); - - 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" ); + 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" ); } { @@ -161,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" @@ -223,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_