Move Console from Scheduler into Utils
[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.test 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("ls", &setCommand);
100         executor(os, commands.back());
101         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinLS );
102         BOOST_CHECK_EQUAL( os.str(), "dir1/\ndir2/\nsys/\n" );
103     }
104
105     {
106         std::stringstream os;
107         parser.parse("ls dir1", &setCommand);
108         executor(os, commands.back());
109         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinLS );
110         BOOST_CHECK_EQUAL( os.str(), "dir3/\n" );
111     }
112
113     {
114         std::stringstream os;
115         parser.parse("ls dir3", &setCommand);
116         BOOST_CHECK_THROW( executor(os, commands.back()), senf::console::SyntaxErrorException );
117         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinLS );
118         BOOST_CHECK_EQUAL( os.str(), "" );
119     }
120     
121     {
122         std::stringstream os;
123         parser.parse("dir1/dir3 { }", &setCommand);
124         executor(os, commands.rbegin()[1]);
125         BOOST_CHECK_EQUAL( commands.rbegin()[1].builtin(), senf::console::ParseCommandInfo::BuiltinPUSHD );
126         BOOST_CHECK( &executor.cwd() == &senf::console::root()["dir1"]["dir3"] );
127         BOOST_CHECK_EQUAL( os.str(), "" );
128     }
129
130     {
131         std::stringstream os;
132         executor(os, commands.back());
133         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinPOPD );
134         BOOST_CHECK( &executor.cwd() == &senf::console::root() );
135         BOOST_CHECK_EQUAL( os.str(), "" );
136     }
137
138     {
139         std::stringstream os;
140         parser.parse("exit", &setCommand);
141         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinEXIT );
142         BOOST_CHECK_THROW( executor(os, commands.back()), senf::console::Executor::ExitException );
143         BOOST_CHECK_EQUAL( os.str(), "" );
144     }
145
146     {
147         std::stringstream os;
148         parser.parse("help /dir2", &setCommand);
149         executor(os, commands.back());
150         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinHELP );
151         BOOST_CHECK_EQUAL( os.str(), "Helptext\n" );
152     }
153
154     {
155         std::stringstream os;
156         parser.parse("dir2/test", &setCommand);
157         executor(os, commands.back());
158         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::NoBuiltin );
159         BOOST_CHECK_EQUAL( os.str(), "testCommand\n" );
160     }
161
162     commands.clear();
163     senf::console::root().remove("dir1");
164     senf::console::root().remove("dir2");
165 }
166
167 BOOST_AUTO_UNIT_TEST(executorChroot)
168 {
169     senf::console::root().mkdir("dir1").mkdir("dir3");
170     senf::console::root().mkdir("dir2").doc("Helptext").add("test",&testCommand);
171
172     senf::console::Executor executor;
173     senf::console::CommandParser parser;
174
175     executor.chroot( senf::console::root()["dir2"] );
176
177     BOOST_CHECK( & executor.chroot() == & senf::console::root()["dir2"] );
178
179     {
180         std::stringstream os;
181         parser.parse("../test", &setCommand);
182         executor(os, commands.back());
183         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::NoBuiltin );
184         BOOST_CHECK_EQUAL( os.str(), "testCommand\n" );
185     }
186
187     commands.clear();
188     senf::console::root().remove("dir1");
189     senf::console::root().remove("dir2");
190 }
191
192 namespace {
193     
194     void testPolicy(senf::console::DirectoryNode & dir, std::string const & entry)
195     {
196         if (dir == senf::console::root() && entry == "dir2")
197             throw senf::console::Executor::IgnoreCommandException();
198     }
199 }
200
201 BOOST_AUTO_UNIT_TEST(executorPolicy)
202 {
203     senf::console::root().mkdir("dir1").mkdir("dir3");
204     senf::console::root().mkdir("dir2").doc("Helptext").add("test",&testCommand);
205
206     senf::console::Executor executor;
207     senf::console::CommandParser parser;
208
209     executor.policy(&testPolicy);
210
211     {
212         std::stringstream os;
213         parser.parse("ls dir1", &setCommand);
214         executor(os, commands.back());
215         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinLS );
216         BOOST_CHECK_EQUAL( os.str(), "dir3/\n" );
217     }
218
219     {
220         std::stringstream os;
221         parser.parse("dir2/test", &setCommand);
222         executor(os, commands.back());
223         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::NoBuiltin );
224         BOOST_CHECK_EQUAL( os.str(), "" );
225     }
226
227     commands.clear();
228     senf::console::root().remove("dir1");
229     senf::console::root().remove("dir2");
230 }
231
232 BOOST_AUTO_UNIT_TEST(executorAuto)
233 {
234     senf::console::root().mkdir("tdir1").mkdir("dir3");
235     senf::console::root().mkdir("dir2").doc("Helptext").add("test",&testCommand);
236
237     senf::console::Executor executor;
238     executor
239         .autocomplete(true)
240         .autocd(true);
241     senf::console::CommandParser parser;
242
243     {
244         std::stringstream os;
245         parser.parse("dir2", &setCommand);
246         executor(os, commands.back());
247         BOOST_CHECK_EQUAL( executor.cwdPath(), "/dir2" );
248         BOOST_CHECK_EQUAL( os.str(), "" );
249     }
250
251     {
252         std::stringstream os;
253         parser.parse("..", &setCommand);
254         executor(os, commands.back());
255         BOOST_CHECK_EQUAL( executor.cwdPath(), "/" );
256         BOOST_CHECK_EQUAL( os.str(), "" );
257     }
258
259     {
260         std::stringstream os;
261         parser.parse("d", &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("t", &setCommand);
270         executor(os, commands.back());
271         BOOST_CHECK_EQUAL( os.str(), "testCommand\n" );
272     }
273     
274     commands.clear();
275     senf::console::root().remove("tdir1");
276     senf::console::root().remove("dir2");
277 }
278
279 ///////////////////////////////cc.e////////////////////////////////////////
280 #undef prefix_
281
282 \f
283 // Local Variables:
284 // mode: c++
285 // fill-column: 100
286 // comment-column: 40
287 // c-file-style: "senf"
288 // indent-tabs-mode: nil
289 // ispell-local-dictionary: "american"
290 // compile-command: "scons -u test"
291 // End: