//#include "ParsedCommand.test.ih"
// Custom includes
+#include <iostream>
#include <sstream>
#include "ParsedCommand.hh"
#include "Executor.hh"
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)
}
{
+ 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<void>( 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<void>( 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<float()>(&cb2))
+ .formatter( &testFormatter );
+ BOOST_CHECK_NO_THROW(
+ parser.parse("test/cb7",
+ boost::bind<void>( 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<void>( boost::ref(executor), boost::ref(ss), _1 )) );
+ BOOST_CHECK_NO_THROW(
+ parser.parse("test/cb 222",
+ boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
+ BOOST_CHECK_NO_THROW(
+ parser.parse("test/cb foo",
+ boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
+ BOOST_CHECK_NO_THROW(
+ parser.parse("test/cb",
+ boost::bind<void>( 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" );
}
}
std::string name(std::string const & suffix) {
return name_ + suffix;
}
-
};
+
}
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_