Utils/Console: Parse char arguments as integers
[senf.git] / senf / Utils / Console / Traits.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 Traits unit tests */
25
26 //#include "Traits.test.hh"
27 //#include "Traits.test.ih"
28
29 // Custom includes
30 #include "Traits.hh"
31 #include "Utility.hh"
32 #include "ParsedCommand.hh"
33 #include "Executor.hh"
34 #include "Parse.hh"
35 #include "ScopedDirectory.hh"
36
37 #include <senf/Utils/auto_unit_test.hh>
38 #include <boost/test/test_tools.hpp>
39
40 #define prefix_
41 ///////////////////////////////cc.p////////////////////////////////////////
42
43 namespace {
44     char charTest(char value) { return value; }
45     signed char scharTest(signed char value) { return value; }
46     unsigned char ucharTest(unsigned char value) { return value; }
47
48     bool boolTest(bool value) { return value; }
49
50     enum TestEnum { Foo=1, Bar=2, FooBar=4 };
51     SENF_CONSOLE_REGISTER_ENUM( TestEnum, (Foo)(Bar)(FooBar) );
52
53     TestEnum test (TestEnum value) { return value; }
54
55     struct TestClass {
56         enum MemberEnum { MemberFoo, MemberBar };
57         static MemberEnum test (MemberEnum value) { return value; }
58     };
59     SENF_CONSOLE_REGISTER_ENUM_MEMBER( TestClass, MemberEnum, (MemberFoo)(MemberBar) );
60 }
61
62 BOOST_AUTO_UNIT_TEST(charTraits)
63 {
64     senf::console::Executor executor;
65     senf::console::CommandParser parser;
66     senf::console::ScopedDirectory<> dir;
67     senf::console::root().add("test", dir);
68     std::stringstream ss;
69
70     dir.add("test",&charTest);
71     dir.add("stest",&scharTest);
72     dir.add("utest",&ucharTest);
73
74     SENF_CHECK_NO_THROW(
75         parser.parse("test/test 10; test/test 20",
76                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
77     BOOST_CHECK_EQUAL( ss.str(), "10\n" "20\n" );
78     ss.str("");
79
80     SENF_CHECK_NO_THROW(
81         parser.parse("test/stest 10; test/stest -20",
82                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
83     BOOST_CHECK_EQUAL( ss.str(), "10\n" "-20\n" );
84     ss.str("");
85
86     SENF_CHECK_NO_THROW(
87         parser.parse("test/utest 10; test/utest 20",
88                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
89     BOOST_CHECK_EQUAL( ss.str(), "10\n" "20\n" );
90     ss.str("");
91 }
92
93 BOOST_AUTO_UNIT_TEST(boolTraits)
94 {
95     senf::console::Executor executor;
96     senf::console::CommandParser parser;
97     senf::console::ScopedDirectory<> dir;
98     senf::console::root().add("test", dir);
99
100     dir.add("test", &boolTest);
101
102     std::stringstream ss;
103     SENF_CHECK_NO_THROW(
104         parser.parse("test/test true; test/test false",
105                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
106     BOOST_CHECK_EQUAL( ss.str(), "true\n" "false\n" );
107
108     ss.str("");
109     SENF_CHECK_NO_THROW(
110         parser.parse("test/test enabled; test/test disabled",
111                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
112     BOOST_CHECK_EQUAL( ss.str(), "true\n" "false\n" );
113
114     ss.str("");
115     SENF_CHECK_NO_THROW(
116         parser.parse("test/test yes; test/test no",
117                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
118     BOOST_CHECK_EQUAL( ss.str(), "true\n" "false\n" );
119
120     ss.str("");
121     SENF_CHECK_NO_THROW(
122         parser.parse("test/test Y; test/test enA",
123                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
124     BOOST_CHECK_EQUAL( ss.str(), "true\n" "true\n" );
125
126     dir.add("test2", &boolTest).formatter( senf::console::formatEnabledDisabled );
127     ss.str("");
128     SENF_CHECK_NO_THROW(
129         parser.parse("test/test2 0; test/test2 -1",
130                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
131     BOOST_CHECK_EQUAL( ss.str(), "disabled\n" "enabled\n" );
132 }
133
134 BOOST_AUTO_UNIT_TEST(enumSupport)
135 {
136     senf::console::Executor executor;
137     senf::console::CommandParser parser;
138     senf::console::ScopedDirectory<> dir;
139     senf::console::root().add("test", dir);
140
141     dir.add("test",&test);
142     
143     std::stringstream ss;
144     SENF_CHECK_NO_THROW(
145         parser.parse("test/test Foo",
146                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
147     BOOST_CHECK_EQUAL( ss.str(), "Foo\n" );
148
149     ss.str("");
150     SENF_CHECK_NO_THROW(
151         parser.parse("test/test Bar",
152                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
153     BOOST_CHECK_EQUAL( ss.str(), "Bar\n" );
154
155     BOOST_CHECK_THROW(
156         parser.parse("test/test (Foo Bar)",
157                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )),
158         senf::console::SyntaxErrorException );
159
160     BOOST_CHECK_THROW(
161         parser.parse("test/test Baz",
162                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )),
163         senf::console::SyntaxErrorException );
164
165     dir.add("member", &TestClass::test);
166
167     ss.str("");
168     SENF_CHECK_NO_THROW(
169         parser.parse("test/member MemberFoo",
170                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
171     BOOST_CHECK_EQUAL( ss.str(), "MemberFoo\n" );
172
173     ss.str("");
174     SENF_CHECK_NO_THROW(
175         parser.parse("test/member MemberBar",
176                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
177     BOOST_CHECK_EQUAL( ss.str(), "MemberBar\n" );
178
179     ss.str("");
180     SENF_CHECK_NO_THROW(
181         parser.parse("test/test foob",
182                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
183     BOOST_CHECK_EQUAL( ss.str(), "FooBar\n" );
184
185     ss.str("");
186     SENF_CHECK_NO_THROW(
187         parser.parse("test/test b",
188                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
189     BOOST_CHECK_EQUAL( ss.str(), "Bar\n" );
190
191     ss.str("");
192     SENF_CHECK_NO_THROW(
193         parser.parse("test/test foo",
194                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
195     BOOST_CHECK_EQUAL( ss.str(), "Foo\n" );
196 }
197
198 BOOST_AUTO_UNIT_TEST(singleToken)
199 {
200     BOOST_CHECK( senf::console::ArgumentTraits<std::string>::singleToken );
201     BOOST_CHECK( senf::console::ArgumentTraits<int>::singleToken );
202     BOOST_CHECK( ! senf::console::ArgumentTraits< 
203                        senf::console::FlagCollection<TestEnum> >::singleToken );
204 }
205
206 ///////////////////////////////cc.e////////////////////////////////////////
207 #undef prefix_
208
209 \f
210 // Local Variables:
211 // mode: c++
212 // fill-column: 100
213 // comment-column: 40
214 // c-file-style: "senf"
215 // indent-tabs-mode: nil
216 // ispell-local-dictionary: "american"
217 // compile-command: "scons -u test"
218 // End: