4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Stefan Bund <g0dil@berlios.de>
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.
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.
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.
24 \brief Node unit tests */
26 //#include "Node.test.hh"
27 //#include "Node.test.ih"
32 #include <boost/iterator/transform_iterator.hpp>
34 #include <senf/Utils/auto_unit_test.hh>
35 #include <boost/test/test_tools.hpp>
38 ///////////////////////////////cc.p////////////////////////////////////////
40 SENF_AUTO_UNIT_TEST(genericNode)
42 namespace fty = senf::console::factory;
44 senf::console::GenericNode & node (
46 .add("dir1", fty::Directory())
47 .add("dir2", fty::Directory().doc("help info")));
48 senf::console::GenericNode::weak_ptr wp (node.thisptr());
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() );
56 BOOST_CHECK_EQUAL( ss.str(), "help info\n" );
59 senf::console::GenericNode::ptr p (senf::console::root()["dir1"].unlink());
60 BOOST_CHECK( ! node.active() );
61 BOOST_CHECK( ! wp.expired() );
63 BOOST_CHECK( wp.expired() );
67 void callback(std::ostream & os, senf::console::ParseCommandInfo const & command)
74 typedef T result_type;
75 template <class U> result_type operator()(U const & u) const { return u.first; }
79 SENF_AUTO_UNIT_TEST(directoryNode)
81 namespace fty = senf::console::factory;
83 senf::console::DirectoryNode::ptr p (senf::console::DirectoryNode::create());
85 BOOST_CHECK( & senf::console::root().add("dir1", p) == p.get() );
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() );
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 &>()),
107 children+sizeof(children)/sizeof(children[0]) );
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 &>()),
116 completions+sizeof(completions)/sizeof(completions[0]) );
118 p->doc("test doc\nline 2");
119 std::stringstream ss;
121 BOOST_CHECK_EQUAL( ss.str(), "test doc\nline 2\n" );
122 BOOST_CHECK_EQUAL( p->shorthelp(), "test doc" );
124 BOOST_CHECK_EQUAL( p->shorthelp(), "" );
125 p->shortdoc("short doc");
126 BOOST_CHECK_EQUAL( p->shorthelp(), "short doc" );
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(),
137 "link@ -> /dir1\n" );
139 BOOST_CHECK( senf::console::root().remove("dir1") == p );
140 senf::console::root().remove("dir2");
141 senf::console::root().remove("fn");
143 BOOST_CHECK_EQUAL( std::distance(senf::console::root().children().begin(),
144 senf::console::root().children().end()), 1 );
147 SENF_AUTO_UNIT_TEST(linkNode)
149 namespace fty = senf::console::factory;
151 senf::console::root().add("dir1", fty::Directory());
152 senf::console::root().add("link1", fty::Link(senf::console::root()["dir1"]));
154 BOOST_CHECK( senf::console::root()["dir1"] == senf::console::root()["link1"] );
156 senf::console::root().remove("dir1");
157 senf::console::root().remove("link1");
162 void operator()(std::ostream & os, senf::console::ParseCommandInfo const &) {
168 SENF_AUTO_UNIT_TEST(factory)
170 namespace fty = senf::console::factory;
172 senf::console::root().add("fn1", fty::SimpleCommand(&callback));
173 senf::console::root().add("fn2", fty::SimpleCommand(Functor()));
175 senf::console::ParseCommandInfo info;
178 std::stringstream ss;
179 senf::console::root()("fn1")(ss, info);
180 BOOST_CHECK_EQUAL( ss.str(), "callback" );
184 std::stringstream ss;
185 senf::console::root()("fn2")(ss, info);
186 BOOST_CHECK_EQUAL( ss.str(), "functor" );
189 senf::console::root().remove("fn1");
190 senf::console::root().remove("fn2");
193 SENF_AUTO_UNIT_TEST(simpleCommandNode)
195 senf::console::root().add("fn", senf::console::SimpleCommandNode::create(&callback))
198 std::stringstream ss;
199 senf::console::ParseCommandInfo info;
200 senf::console::root()("fn")(ss, info);
201 BOOST_CHECK_EQUAL( ss.str(), "callback" );
205 std::stringstream ss;
206 senf::console::root().get("fn").help(ss);
207 BOOST_CHECK_EQUAL( ss.str(), "help text\n" );
210 senf::console::root().remove("fn");
213 ///////////////////////////////cc.e////////////////////////////////////////
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"