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