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