40eb06e63e822cd994e846f2d531a8e107875a38
[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 //-/////////////////////////////////////////////////////////////////////////////////////////////////
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().add("dir 1",fty::Directory()).add("dir3",fty::Directory());
55     senf::console::root().add("dir2",fty::Directory()).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 \"dir 1\"", &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()["dir 1"] );
68         BOOST_CHECK_EQUAL( executor.cwdPath(), "/dir 1" );
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 \"dir 1\"", &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                            "dir 1/                      \n"
106                            "dir2/                       Helptext\n"
107                            "sys/                        \n" );
108     }
109
110     {
111         std::stringstream os;
112         parser.parse("ll \"dir 1\"", &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                            "dir 1/                                  \n"
133                            "  dir3/                                 \n"
134                            "dir2/                                   Helptext\n"
135                            "  test                                  \n"
136                            "sys/                                    \n" );
137     }
138
139     {
140         std::stringstream os;
141         parser.parse("\"dir 1\"/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()["dir 1"]["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("dir 1");
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().add("dir1",fty::Directory()).add("dir3",fty::Directory());
190     senf::console::root().add("dir2",fty::Directory().doc("Helptext"))
191         .add("test", fty::Command(&testCommand));
192
193     senf::console::Executor executor;
194     senf::console::CommandParser parser;
195
196     executor.chroot( senf::console::root()["dir2"] );
197
198     BOOST_CHECK( & executor.chroot() == & senf::console::root()["dir2"] );
199
200     {
201         std::stringstream os;
202         parser.parse("../test", &setCommand);
203         executor(os, commands.back());
204         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::NoBuiltin );
205         BOOST_CHECK_EQUAL( os.str(), "testCommand\n" );
206     }
207
208     commands.clear();
209     senf::console::root().remove("dir1");
210     senf::console::root().remove("dir2");
211 }
212
213 namespace {
214
215     void testPolicy(senf::console::DirectoryNode & dir, std::string const & entry)
216     {
217         if (dir == senf::console::root() && entry == "dir2")
218             throw senf::console::Executor::IgnoreCommandException();
219     }
220 }
221
222 SENF_AUTO_UNIT_TEST(executorPolicy)
223 {
224     namespace fty = senf::console::factory;
225
226     senf::console::root().add("dir1",fty::Directory()).add("dir3",fty::Directory());
227     senf::console::root().add("dir2",fty::Directory().doc("Helptext"))
228         .add("test",fty::Command(&testCommand));
229
230     senf::console::Executor executor;
231     senf::console::CommandParser parser;
232
233     executor.policy(&testPolicy);
234
235     {
236         std::stringstream os;
237         parser.parse("ll dir1", &setCommand);
238         executor(os, commands.back());
239         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinLL );
240         BOOST_CHECK_EQUAL( os.str(), "dir3/                       \n" );
241     }
242
243     {
244         std::stringstream os;
245         parser.parse("dir2/test", &setCommand);
246         executor(os, commands.back());
247         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::NoBuiltin );
248         BOOST_CHECK_EQUAL( os.str(), "" );
249     }
250
251     commands.clear();
252     senf::console::root().remove("dir1");
253     senf::console::root().remove("dir2");
254 }
255
256 SENF_AUTO_UNIT_TEST(executorAuto)
257 {
258     namespace fty = senf::console::factory;
259
260     senf::console::root().add("tdir1",fty::Directory()).add("dir3",fty::Directory());
261     senf::console::root().add("dir2",fty::Directory().doc("Helptext"))
262         .add("test",fty::Command(&testCommand));
263
264     senf::console::Executor executor;
265     executor
266         .autocomplete(true)
267         .autocd(true);
268     senf::console::CommandParser parser;
269
270     {
271         std::stringstream os;
272         parser.parse("dir2", &setCommand);
273         executor(os, commands.back());
274         BOOST_CHECK_EQUAL( executor.cwdPath(), "/dir2" );
275         BOOST_CHECK_EQUAL( os.str(), "" );
276     }
277
278     {
279         std::stringstream os;
280         parser.parse("..", &setCommand);
281         executor(os, commands.back());
282         BOOST_CHECK_EQUAL( executor.cwdPath(), "/" );
283         BOOST_CHECK_EQUAL( os.str(), "" );
284     }
285
286     {
287         std::stringstream os;
288         parser.parse("d", &setCommand);
289         executor(os, commands.back());
290         BOOST_CHECK_EQUAL( executor.cwdPath(), "/dir2" );
291         BOOST_CHECK_EQUAL( os.str(), "" );
292     }
293
294     {
295         std::stringstream os;
296         parser.parse("t", &setCommand);
297         executor(os, commands.back());
298         BOOST_CHECK_EQUAL( os.str(), "testCommand\n" );
299     }
300
301     commands.clear();
302     senf::console::root().remove("tdir1");
303     senf::console::root().remove("dir2");
304 }
305
306 //-/////////////////////////////////////////////////////////////////////////////////////////////////
307 #undef prefix_
308
309 \f
310 // Local Variables:
311 // mode: c++
312 // fill-column: 100
313 // comment-column: 40
314 // c-file-style: "senf"
315 // indent-tabs-mode: nil
316 // ispell-local-dictionary: "american"
317 // compile-command: "scons -u test"
318 // End: