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