Utils/Console: Fix DirectoryNode::add(...) API
[senf.git] / senf / Utils / Console / Executor.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 Executor unit tests */
25
26 //#include "Executor.test.hh"
27 //#include "Executor.test.ih"
28
29 // Custom includes
30 #include <sstream>
31 #include <vector>
32 #include "Console.hh"
33
34 #include <senf/Utils/auto_unit_test.hh>
35 #include <boost/test/test_tools.hpp>
36
37 #define prefix_
38 ///////////////////////////////cc.p////////////////////////////////////////
39
40 namespace {
41     std::vector<senf::console::ParseCommandInfo> commands;
42     void setCommand(senf::console::ParseCommandInfo const & cmd) {
43         commands.push_back(cmd);
44     }
45     void testCommand(std::ostream & os, senf::console::ParseCommandInfo const & command) {
46         os << "testCommand\n";
47     }
48 }
49
50 SENF_AUTO_UNIT_TEST(executor)
51 {
52     namespace fty = senf::console::factory;
53
54     senf::console::root().mkdir("dir1").mkdir("dir3");
55     senf::console::root().mkdir("dir2").doc("Helptext").add("test",fty::Command(&testCommand));
56
57     senf::console::Executor executor;
58     senf::console::CommandParser parser;
59
60     BOOST_CHECK( &executor.cwd() == &senf::console::root() );
61     
62     {
63         std::stringstream os;
64         parser.parse("cd dir1", &setCommand);
65         executor(os, commands.back());
66         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinCD );
67         BOOST_CHECK( executor.cwd() == senf::console::root()["dir1"] );
68         BOOST_CHECK_EQUAL( executor.cwdPath(), "/dir1" );
69         BOOST_CHECK_EQUAL( os.str(), "" );
70     }
71
72     {
73         std::stringstream os;
74         parser.parse("cd /dir2", &setCommand);
75         executor(os, commands.back());
76         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinCD );
77         BOOST_CHECK( &executor.cwd() == &senf::console::root()["dir2"] );
78         BOOST_CHECK_EQUAL( os.str(), "" );
79     }
80
81     {
82         std::stringstream os;
83         parser.parse("cd dir1", &setCommand);
84         BOOST_CHECK_THROW( executor(os, commands.back()), senf::console::SyntaxErrorException );
85         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinCD );
86         BOOST_CHECK( &executor.cwd() == &senf::console::root()["dir2"] );
87         BOOST_CHECK_EQUAL( os.str(), "" );
88     }
89
90     {
91         std::stringstream os;
92         parser.parse("cd /", &setCommand);
93         executor(os, commands.back());
94         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinCD );
95         BOOST_CHECK( &executor.cwd() == &senf::console::root() );
96         BOOST_CHECK_EQUAL( os.str(), "" );
97     }
98
99     {
100         std::stringstream os;
101         parser.parse("ll", &setCommand);
102         executor(os, commands.back());
103         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinLL );
104         BOOST_CHECK_EQUAL( os.str(), 
105                            "dir1/                       \n"
106                            "dir2/                       Helptext\n"
107                            "sys/                        \n" );
108     }
109
110     {
111         std::stringstream os;
112         parser.parse("ll dir1", &setCommand);
113         executor(os, commands.back());
114         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinLL );
115         BOOST_CHECK_EQUAL( os.str(), "dir3/                       \n" );
116     }
117
118     {
119         std::stringstream os;
120         parser.parse("ls dir3", &setCommand);
121         BOOST_CHECK_THROW( executor(os, commands.back()), senf::console::SyntaxErrorException );
122         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinLS );
123         BOOST_CHECK_EQUAL( os.str(), "" );
124     }
125     
126     {
127         std::stringstream os;
128         parser.parse("lr", &setCommand);
129         executor(os, commands.back());
130         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinLR );
131         BOOST_CHECK_EQUAL( os.str().substr(0,213),
132                            "dir1/                                   \n"
133                            "  dir3/                                 \n"
134                            "dir2/                                   Helptext\n"
135                            "  test                                  \n"
136                            "sys/                                    \n" );
137     }
138
139     {
140         std::stringstream os;
141         parser.parse("dir1/dir3 { }", &setCommand);
142         executor(os, commands.rbegin()[1]);
143         BOOST_CHECK_EQUAL( commands.rbegin()[1].builtin(), senf::console::ParseCommandInfo::BuiltinPUSHD );
144         BOOST_CHECK( &executor.cwd() == &senf::console::root()["dir1"]["dir3"] );
145         BOOST_CHECK_EQUAL( os.str(), "" );
146     }
147
148     {
149         std::stringstream os;
150         executor(os, commands.back());
151         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinPOPD );
152         BOOST_CHECK( &executor.cwd() == &senf::console::root() );
153         BOOST_CHECK_EQUAL( os.str(), "" );
154     }
155
156     {
157         std::stringstream os;
158         parser.parse("exit", &setCommand);
159         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinEXIT );
160         BOOST_CHECK_THROW( executor(os, commands.back()), senf::console::Executor::ExitException );
161         BOOST_CHECK_EQUAL( os.str(), "" );
162     }
163
164     {
165         std::stringstream os;
166         parser.parse("help /dir2", &setCommand);
167         executor(os, commands.back());
168         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinHELP );
169         BOOST_CHECK_EQUAL( os.str(), "Helptext\n" );
170     }
171
172     {
173         std::stringstream os;
174         parser.parse("dir2/test", &setCommand);
175         executor(os, commands.back());
176         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::NoBuiltin );
177         BOOST_CHECK_EQUAL( os.str(), "testCommand\n" );
178     }
179
180     commands.clear();
181     senf::console::root().remove("dir1");
182     senf::console::root().remove("dir2");
183 }
184
185 SENF_AUTO_UNIT_TEST(executorChroot)
186 {
187     namespace fty = senf::console::factory;
188
189     senf::console::root().mkdir("dir1").mkdir("dir3");
190     senf::console::root().mkdir("dir2").doc("Helptext").add("test", fty::Command(&testCommand));
191
192     senf::console::Executor executor;
193     senf::console::CommandParser parser;
194
195     executor.chroot( senf::console::root()["dir2"] );
196
197     BOOST_CHECK( & executor.chroot() == & senf::console::root()["dir2"] );
198
199     {
200         std::stringstream os;
201         parser.parse("../test", &setCommand);
202         executor(os, commands.back());
203         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::NoBuiltin );
204         BOOST_CHECK_EQUAL( os.str(), "testCommand\n" );
205     }
206
207     commands.clear();
208     senf::console::root().remove("dir1");
209     senf::console::root().remove("dir2");
210 }
211
212 namespace {
213     
214     void testPolicy(senf::console::DirectoryNode & dir, std::string const & entry)
215     {
216         if (dir == senf::console::root() && entry == "dir2")
217             throw senf::console::Executor::IgnoreCommandException();
218     }
219 }
220
221 SENF_AUTO_UNIT_TEST(executorPolicy)
222 {
223     namespace fty = senf::console::factory;
224
225     senf::console::root().mkdir("dir1").mkdir("dir3");
226     senf::console::root().mkdir("dir2").doc("Helptext").add("test",fty::Command(&testCommand));
227
228     senf::console::Executor executor;
229     senf::console::CommandParser parser;
230
231     executor.policy(&testPolicy);
232
233     {
234         std::stringstream os;
235         parser.parse("ll dir1", &setCommand);
236         executor(os, commands.back());
237         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinLL );
238         BOOST_CHECK_EQUAL( os.str(), "dir3/                       \n" );
239     }
240
241     {
242         std::stringstream os;
243         parser.parse("dir2/test", &setCommand);
244         executor(os, commands.back());
245         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::NoBuiltin );
246         BOOST_CHECK_EQUAL( os.str(), "" );
247     }
248
249     commands.clear();
250     senf::console::root().remove("dir1");
251     senf::console::root().remove("dir2");
252 }
253
254 SENF_AUTO_UNIT_TEST(executorAuto)
255 {
256     namespace fty = senf::console::factory;
257
258     senf::console::root().mkdir("tdir1").mkdir("dir3");
259     senf::console::root().mkdir("dir2").doc("Helptext").add("test",fty::Command(&testCommand));
260
261     senf::console::Executor executor;
262     executor
263         .autocomplete(true)
264         .autocd(true);
265     senf::console::CommandParser parser;
266
267     {
268         std::stringstream os;
269         parser.parse("dir2", &setCommand);
270         executor(os, commands.back());
271         BOOST_CHECK_EQUAL( executor.cwdPath(), "/dir2" );
272         BOOST_CHECK_EQUAL( os.str(), "" );
273     }
274
275     {
276         std::stringstream os;
277         parser.parse("..", &setCommand);
278         executor(os, commands.back());
279         BOOST_CHECK_EQUAL( executor.cwdPath(), "/" );
280         BOOST_CHECK_EQUAL( os.str(), "" );
281     }
282
283     {
284         std::stringstream os;
285         parser.parse("d", &setCommand);
286         executor(os, commands.back());
287         BOOST_CHECK_EQUAL( executor.cwdPath(), "/dir2" );
288         BOOST_CHECK_EQUAL( os.str(), "" );
289     }
290     
291     {
292         std::stringstream os;
293         parser.parse("t", &setCommand);
294         executor(os, commands.back());
295         BOOST_CHECK_EQUAL( os.str(), "testCommand\n" );
296     }
297     
298     commands.clear();
299     senf::console::root().remove("tdir1");
300     senf::console::root().remove("dir2");
301 }
302
303 ///////////////////////////////cc.e////////////////////////////////////////
304 #undef prefix_
305
306 \f
307 // Local Variables:
308 // mode: c++
309 // fill-column: 100
310 // comment-column: 40
311 // c-file-style: "senf"
312 // indent-tabs-mode: nil
313 // ispell-local-dictionary: "american"
314 // compile-command: "scons -u test"
315 // End: