Utils/Logger: Remove dependency on libboost_datetime
[senf.git] / Console / ParsedCommand.test.cc
index 98a5584..223a3e3 100644 (file)
@@ -27,6 +27,7 @@
 //#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)
@@ -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<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" );
     }
 }
 
@@ -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_