Utils/Logger: Remove dependency on libboost_datetime
[senf.git] / Console / ParsedCommand.test.cc
index b7c78d6..223a3e3 100644 (file)
@@ -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,35 +126,81 @@ 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<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;
 
-        senf::console::OverloadedCommandNode & cbNode ( dir.add("cb", &cb1)
+        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.")
+                "Servitium transi." )
+
             .overloadDoc(
                 "Lo nam balnearius Opprimo Pennatus, no decentia sui, dicto esse se pulchritudo,\n"
-                "pupa Sive res indifferenter. Captivo pa.")
-            .arg("", "Bar didelfrump di desgorb. Nu widsoflar brimeldrgf.")
-            .arg("checkup", "Florgel, dargel and durgel", 2.1) );
+                "pupa Sive res indifferenter. Captivo pa." )
 
-        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( 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;
 
-        dir.add("cb", &cb2);
+        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 )) );
 
-        parser.parse("test/cb 111 222.4; test/cb 222; test/cb foo; test/cb",
-                     boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 ));
-        BOOST_CHECK_EQUAL( ss.str(), "333\n" "224\n" "Value: foo\n" "1.2\n" );
+        BOOST_CHECK_EQUAL( ss.str(), "333\n" "224\n" "Value: foo\n" "Value: \n" );
     }
 
     {
@@ -153,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"
@@ -215,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_