switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / senf / Utils / Console / Traits.test.cc
1 // $Id$
2 //
3 // Copyright (C) 2008
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 //
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at 
9 // http://senf.berlios.de/license.html
10 //
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on, 
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
14 //
15 // Software distributed under the License is distributed on an "AS IS" basis, 
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
17 // for the specific language governing rights and limitations under the License.
18 //
19 // The Original Code is Fraunhofer FOKUS code.
20 //
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. 
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
24 //
25 // Contributor(s):
26 //   Stefan Bund <g0dil@berlios.de>
27
28 /** \file
29     \brief Traits unit tests */
30
31 //#include "Traits.test.hh"
32 //#include "Traits.test.ih"
33
34 // Custom includes
35 #include "Console.hh"
36
37 #include <senf/Utils/auto_unit_test.hh>
38 #include <boost/test/test_tools.hpp>
39
40 #define prefix_
41 //-/////////////////////////////////////////////////////////////////////////////////////////////////
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     enum TestEnumKey { ONE, TWO, THREE };
62     SENF_CONSOLE_REGISTER_ENUM( TestEnumKey, (key("1s",ONE))(key("2",TWO))(key("three",THREE)) );
63
64     TestEnumKey testKey (TestEnumKey value) { return value; }
65 }
66
67 SENF_AUTO_UNIT_TEST(charTraits)
68 {
69     namespace fty = senf::console::factory;
70
71     senf::console::Executor executor;
72     senf::console::CommandParser parser;
73     senf::console::ScopedDirectory<> dir;
74     senf::console::root().add("test", dir);
75     std::stringstream ss;
76
77     dir.add("test",fty::Command(&charTest));
78     dir.add("stest",fty::Command(&scharTest));
79     dir.add("utest",fty::Command(&ucharTest));
80
81     SENF_CHECK_NO_THROW(
82         parser.parse("test/test 10; test/test 20",
83                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
84     BOOST_CHECK_EQUAL( ss.str(), "10\n" "20\n" );
85     ss.str("");
86
87     SENF_CHECK_NO_THROW(
88         parser.parse("test/stest 10; test/stest -20",
89                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
90     BOOST_CHECK_EQUAL( ss.str(), "10\n" "-20\n" );
91     ss.str("");
92
93     SENF_CHECK_NO_THROW(
94         parser.parse("test/utest 10; test/utest 20",
95                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
96     BOOST_CHECK_EQUAL( ss.str(), "10\n" "20\n" );
97     ss.str("");
98 }
99
100 SENF_AUTO_UNIT_TEST(boolTraits)
101 {
102     namespace fty = senf::console::factory;
103
104     senf::console::Executor executor;
105     senf::console::CommandParser parser;
106     senf::console::ScopedDirectory<> dir;
107     senf::console::root().add("test", dir);
108
109     dir.add("test", fty::Command(&boolTest));
110
111     std::stringstream ss;
112     SENF_CHECK_NO_THROW(
113         parser.parse("test/test true; test/test false",
114                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
115     BOOST_CHECK_EQUAL( ss.str(), "true\n" "false\n" );
116
117     ss.str("");
118     SENF_CHECK_NO_THROW(
119         parser.parse("test/test enabled; test/test disabled",
120                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
121     BOOST_CHECK_EQUAL( ss.str(), "true\n" "false\n" );
122
123     ss.str("");
124     SENF_CHECK_NO_THROW(
125         parser.parse("test/test yes; test/test no",
126                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
127     BOOST_CHECK_EQUAL( ss.str(), "true\n" "false\n" );
128
129     ss.str("");
130     SENF_CHECK_NO_THROW(
131         parser.parse("test/test Y; test/test enA",
132                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
133     BOOST_CHECK_EQUAL( ss.str(), "true\n" "true\n" );
134
135     dir.add("test2", fty::Command(&boolTest).formatter( senf::console::formatEnabledDisabled ));
136     ss.str("");
137     SENF_CHECK_NO_THROW(
138         parser.parse("test/test2 0; test/test2 -1",
139                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
140     BOOST_CHECK_EQUAL( ss.str(), "disabled\n" "enabled\n" );
141 }
142
143 SENF_AUTO_UNIT_TEST(stringTraits)
144 {
145     BOOST_CHECK_EQUAL(
146         senf::console::ArgumentTraits<std::string>::str("Test\nOf\nA \"String\"\x01\x7f\xa0\xff"),
147         "\"Test\\x0aOf\\x0aA \\\"String\\\"\\x01\\x7f\\xa0\\xff\"" );
148 }
149
150 SENF_AUTO_UNIT_TEST(enumSupport)
151 {
152     namespace fty = senf::console::factory;
153
154     senf::console::Executor executor;
155     senf::console::CommandParser parser;
156     senf::console::ScopedDirectory<> dir;
157     senf::console::root().add("test", dir);
158
159     dir.add("test",fty::Command(&test));
160     dir.add("testKey",fty::Command(&testKey));
161
162     std::stringstream ss;
163     SENF_CHECK_NO_THROW(
164         parser.parse("test/test Foo",
165                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
166     BOOST_CHECK_EQUAL( ss.str(), "Foo\n" );
167
168     ss.str("");
169     SENF_CHECK_NO_THROW(
170         parser.parse("test/test Bar",
171                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
172     BOOST_CHECK_EQUAL( ss.str(), "Bar\n" );
173
174     BOOST_CHECK_THROW(
175         parser.parse("test/test (Foo Bar)",
176                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )),
177         senf::console::SyntaxErrorException );
178
179     BOOST_CHECK_THROW(
180         parser.parse("test/test Baz",
181                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )),
182         senf::console::SyntaxErrorException );
183
184     dir.add("member", fty::Command(&TestClass::test));
185
186     ss.str("");
187     SENF_CHECK_NO_THROW(
188         parser.parse("test/member MemberFoo",
189                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
190     BOOST_CHECK_EQUAL( ss.str(), "MemberFoo\n" );
191
192     ss.str("");
193     SENF_CHECK_NO_THROW(
194         parser.parse("test/member MemberBar",
195                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
196     BOOST_CHECK_EQUAL( ss.str(), "MemberBar\n" );
197
198     ss.str("");
199     SENF_CHECK_NO_THROW(
200         parser.parse("test/test foob",
201                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
202     BOOST_CHECK_EQUAL( ss.str(), "FooBar\n" );
203
204     ss.str("");
205     SENF_CHECK_NO_THROW(
206         parser.parse("test/test b",
207                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
208     BOOST_CHECK_EQUAL( ss.str(), "Bar\n" );
209
210     ss.str("");
211     SENF_CHECK_NO_THROW(
212         parser.parse("test/test foo",
213                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
214     BOOST_CHECK_EQUAL( ss.str(), "Foo\n" );
215
216     ss.str("");
217     SENF_CHECK_NO_THROW(
218         parser.parse("test/testKey 1S",
219                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
220     BOOST_CHECK_EQUAL( ss.str(), "1s\n" );
221
222     ss.str("");
223     SENF_CHECK_NO_THROW(
224         parser.parse("test/testKey 2",
225                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
226     BOOST_CHECK_EQUAL( ss.str(), "2\n" );
227
228     ss.str("");
229     SENF_CHECK_NO_THROW(
230         parser.parse("test/testKey ThrEE",
231                      boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
232     BOOST_CHECK_EQUAL( ss.str(), "three\n" );
233 }
234
235 SENF_AUTO_UNIT_TEST(singleToken)
236 {
237     BOOST_CHECK( senf::console::ArgumentTraits<std::string>::singleToken );
238     BOOST_CHECK( senf::console::ArgumentTraits<int>::singleToken );
239     BOOST_CHECK( ! senf::console::ArgumentTraits<
240                        senf::console::FlagCollection<TestEnum> >::singleToken );
241 }
242
243 //-/////////////////////////////////////////////////////////////////////////////////////////////////
244 #undef prefix_
245
246 \f
247 // Local Variables:
248 // mode: c++
249 // fill-column: 100
250 // comment-column: 40
251 // c-file-style: "senf"
252 // indent-tabs-mode: nil
253 // ispell-local-dictionary: "american"
254 // compile-command: "scons -u test"
255 // End: