Console: Add console logging documentation
[senf.git] / Console / ParsedCommand.test.cc
index 5b90f2c..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,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<double>(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<senf::console::OverloadedCommandNode&>(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<void>( 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<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" );
     }
 
     {
@@ -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_