Fix documentation build under maverick (doxygen 1.7.1)
[senf.git] / senf / Utils / Console / Node.test.cc
1 // $Id$
2 //
3 // Copyright (C) 2008
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Stefan Bund <g0dil@berlios.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 /** \file
24     \brief Node unit tests */
25
26 //#include "Node.test.hh"
27 //#include "Node.test.ih"
28
29 // Custom includes
30 #include <sstream>
31 #include "Console.hh"
32 #include <boost/iterator/transform_iterator.hpp>
33
34 #include <senf/Utils/auto_unit_test.hh>
35 #include <boost/test/test_tools.hpp>
36
37 #define prefix_
38 //-/////////////////////////////////////////////////////////////////////////////////////////////////
39
40 SENF_AUTO_UNIT_TEST(genericNode)
41 {
42     namespace fty = senf::console::factory;
43
44     senf::console::GenericNode & node (
45         senf::console::root()
46         .add("dir1", fty::Directory())
47         .add("dir2", fty::Directory().doc("help info")));
48     senf::console::GenericNode::weak_ptr wp (node.thisptr());
49
50     BOOST_CHECK_EQUAL( node.name(), "dir2" );
51     BOOST_CHECK( node.parent() );
52     BOOST_CHECK_EQUAL( node.path(), "/dir1/dir2" );
53     BOOST_CHECK( node.active() );
54     std::stringstream ss;
55     node.help(ss);
56     BOOST_CHECK_EQUAL( ss.str(), "help info\n" );
57
58     {
59         senf::console::GenericNode::ptr p (senf::console::root()["dir1"].unlink());
60         BOOST_CHECK( ! node.active() );
61         BOOST_CHECK( ! wp.expired() );
62     }
63     BOOST_CHECK( wp.expired() );
64 }
65
66 namespace {
67     void callback(std::ostream & os, senf::console::ParseCommandInfo const & command)
68     {
69         os << "callback";
70     }
71
72     template <class T>
73     struct select1st {
74         typedef T result_type;
75         template <class U> result_type operator()(U const & u) const { return u.first; }
76     };
77 }
78
79 SENF_AUTO_UNIT_TEST(directoryNode)
80 {
81     namespace fty = senf::console::factory;
82
83     senf::console::DirectoryNode::ptr p (senf::console::DirectoryNode::create());
84
85     BOOST_CHECK( & senf::console::root().add("dir1", p) == p.get() );
86
87     senf::console::SimpleCommandNode & fnnode (
88         senf::console::root().add( "fn", senf::console::SimpleCommandNode::create(&callback) ));
89     BOOST_CHECK( &senf::console::root()["dir1"] == p.get() );
90     BOOST_CHECK_THROW( senf::console::root()["dir2"], senf::console::UnknownNodeNameException );
91     BOOST_CHECK_THROW( senf::console::root()("dir1"), std::bad_cast );
92     BOOST_CHECK( &senf::console::root()("fn") == &fnnode );
93     BOOST_CHECK_THROW( senf::console::root()("fn2"), senf::console::UnknownNodeNameException );
94     BOOST_CHECK_THROW( senf::console::root()["fn"], std::bad_cast );
95     BOOST_CHECK( &senf::console::root().get("dir1") == p.get() );
96
97     senf::console::root()
98         .add("dir2", fty::Directory())
99         .add("dir3", fty::Directory());
100     char const * const children[] = { "dir1", "dir2", "fn", "sys" };
101     BOOST_CHECK_EQUAL_COLLECTIONS(
102         boost::make_transform_iterator(senf::console::root().children().begin(),
103                                        select1st<std::string const &>()),
104         boost::make_transform_iterator(senf::console::root().children().end(),
105                                        select1st<std::string const &>()),
106         children,
107         children+sizeof(children)/sizeof(children[0]) );
108
109     char const * const completions[] = { "dir1", "dir2" };
110     BOOST_CHECK_EQUAL_COLLECTIONS(
111         boost::make_transform_iterator(senf::console::root().completions("dir").begin(),
112                                        select1st<std::string const &>()),
113         boost::make_transform_iterator(senf::console::root().completions("dir").end(),
114                                        select1st<std::string const &>()),
115         completions,
116         completions+sizeof(completions)/sizeof(completions[0]) );
117
118     p->doc("test doc\nline 2");
119     std::stringstream ss;
120     p->help(ss);
121     BOOST_CHECK_EQUAL( ss.str(), "test doc\nline 2\n" );
122     BOOST_CHECK_EQUAL( p->shorthelp(), "test doc" );
123     p->doc("");
124     BOOST_CHECK_EQUAL( p->shorthelp(), "" );
125     p->shortdoc("short doc");
126     BOOST_CHECK_EQUAL( p->shorthelp(), "short doc" );
127
128     ss.str("");
129     senf::console::root()["dir2"].add("dir4", fty::Directory());
130     senf::console::root()["dir2"].add("link", fty::Link(*p));
131     senf::console::root()["dir2"]["dir4"].add("link", fty::Link(senf::console::root()));
132     senf::console::dump(ss, senf::console::root()["dir2"]);
133     BOOST_CHECK_EQUAL( ss.str(),
134                        "dir3/\n"
135                        "dir4/\n"
136                        "  link@ -> /\n"
137                        "link@ -> /dir1\n" );
138
139     BOOST_CHECK( senf::console::root().remove("dir1") == p );
140     senf::console::root().remove("dir2");
141     senf::console::root().remove("fn");
142
143     BOOST_CHECK_EQUAL( std::distance(senf::console::root().children().begin(),
144                                      senf::console::root().children().end()), 1 );
145 }
146
147 SENF_AUTO_UNIT_TEST(linkNode)
148 {
149     namespace fty = senf::console::factory;
150
151     senf::console::root().add("dir1", fty::Directory());
152     senf::console::root().add("link1", fty::Link(senf::console::root()["dir1"]));
153
154     BOOST_CHECK( senf::console::root()["dir1"] == senf::console::root()["link1"] );
155
156     senf::console::root().remove("dir1");
157     senf::console::root().remove("link1");
158 }
159
160 namespace {
161     struct Functor {
162         void operator()(std::ostream & os, senf::console::ParseCommandInfo const &) {
163             os << "functor";
164         }
165     };
166 }
167
168 SENF_AUTO_UNIT_TEST(factory)
169 {
170     namespace fty = senf::console::factory;
171
172     senf::console::root().add("fn1", fty::SimpleCommand(&callback));
173     senf::console::root().add("fn2", fty::SimpleCommand(Functor()));
174
175     senf::console::ParseCommandInfo info;
176
177     {
178         std::stringstream ss;
179         senf::console::root()("fn1")(ss, info);
180         BOOST_CHECK_EQUAL( ss.str(), "callback" );
181     }
182
183     {
184         std::stringstream ss;
185         senf::console::root()("fn2")(ss, info);
186         BOOST_CHECK_EQUAL( ss.str(), "functor" );
187     }
188
189     senf::console::root().remove("fn1");
190     senf::console::root().remove("fn2");
191 }
192
193 SENF_AUTO_UNIT_TEST(simpleCommandNode)
194 {
195     senf::console::root().add("fn", senf::console::SimpleCommandNode::create(&callback))
196         .doc("help text");
197     {
198         std::stringstream ss;
199         senf::console::ParseCommandInfo info;
200         senf::console::root()("fn")(ss, info);
201         BOOST_CHECK_EQUAL( ss.str(), "callback" );
202     }
203
204     {
205         std::stringstream ss;
206         senf::console::root().get("fn").help(ss);
207         BOOST_CHECK_EQUAL( ss.str(), "help text\n" );
208     }
209
210     senf::console::root().remove("fn");
211 }
212
213 //-/////////////////////////////////////////////////////////////////////////////////////////////////
214 #undef prefix_
215
216 \f
217 // Local Variables:
218 // mode: c++
219 // fill-column: 100
220 // comment-column: 40
221 // c-file-style: "senf"
222 // indent-tabs-mode: nil
223 // ispell-local-dictionary: "american"
224 // compile-command: "scons -u test"
225 // End: