senfscons: Implement COMPILE_FAILS tests
[senf.git] / Console / ParsedCommand.test.cc
index 6365608..3487d9c 100644 (file)
 //#include "ParsedCommand.test.ih"
 
 // Custom includes
+#include <iostream>
 #include <sstream>
 #include "ParsedCommand.hh"
 #include "Executor.hh"
 #include "Parse.hh"
 #include "ScopedDirectory.hh"
 
-#include <boost/test/auto_unit_test.hpp>
+#include "../Utils/auto_unit_test.hh"
 #include <boost/test/test_tools.hpp>
 
 #define prefix_
 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 v) { os << "Value: " << v << "\n"; }
 }
 
 BOOST_AUTO_UNIT_TEST(parsedCommand)
@@ -113,8 +114,129 @@ BOOST_AUTO_UNIT_TEST(parsedCommand)
                          boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )),
             senf::console::SyntaxErrorException );
     }
+
+    {
+        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", 
+                  description   = "Florgel, dargel and durgel",
+                  default_value = 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." ) );
+
+        (void) cbNode;
+
+        dir.add("cb", &cb2);
+
+        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" );
+    }
+
+    {
+        std::stringstream ss;
+        senf::console::root()["test"]("cb").help(ss);
+        BOOST_CHECK_EQUAL( 
+            ss.str(), 
+            "Usage:\n"
+            "    1- cb arg11:int [checkup:double]\n"
+            "    2- cb arg21:string\n"
+            "    3- cb\n"
+            "\n"
+            "With:\n"
+            "    arg11     Bar didelfrump di desgorb. Nu widsoflar brimeldrgf.\n"
+            "    checkup   Florgel, dargel and durgel\n"
+            "        default: 2.1\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" );
+    }
+}
+
+namespace {
+
+    struct Test 
+    {
+        senf::console::ScopedDirectory<Test> dir;
+        std::string name_;
+
+        Test(std::string const & name) : dir(this), name_ (name) {
+            dir.add("name", &Test::name);
+        }
+
+        std::string name(std::string const & suffix) {
+            return name_ + suffix;
+        }
+    };
+
+}
+
+BOOST_AUTO_UNIT_TEST(memberParsedCommand)
+{
+    senf::console::Executor executor;
+    senf::console::CommandParser parser;
+    senf::console::ScopedDirectory<> dir;
+    senf::console::root().add("test", dir);
+    
+    {
+        Test obj ("bar");
+        dir.add("obj", obj.dir);
+        
+        std::stringstream ss;
+        parser.parse("test/obj/name \": foo\"",
+                     boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 ));
+        BOOST_CHECK_EQUAL( ss.str(), "bar: foo\n" );
+    }
+}
+
+#ifdef COMPILE_CHECK
+
+COMPILE_FAIL(argParser)
+{
+    senf::console::ScopedDirectory<> dir;
+    dir.add("cb", &cb1)
+        .arg()
+        .arg()
+        .arg();
 }
 
+#endif
+    
 ///////////////////////////////cc.e////////////////////////////////////////
 #undef prefix_