replaced some tabs with spaces
[senf.git] / Utils / Console / ConfigFile.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 ConfigFile.test unit tests */
25
26 //#include "ConfigFile.test.hh"
27 //#include "ConfigFile.test.ih"
28
29 // Custom includes
30 #include "ConfigFile.hh"
31 #include <fstream>
32 #include "ScopedDirectory.hh"
33 #include "ParsedCommand.hh"
34 #include <boost/filesystem/operations.hpp>
35
36 #include "../../Utils/auto_unit_test.hh"
37 #include <boost/test/test_tools.hpp>
38
39 #define prefix_
40 ///////////////////////////////cc.p////////////////////////////////////////
41
42 namespace {
43
44     int var1 (0);
45     bool var2 (false);
46     
47     void fun1(int v) { var1 = v; }
48     void fun2() { var2 = true; }
49
50     class TempFile
51     {
52     public:
53         TempFile(std::string const & name) : name_ (name), file_ (name_.c_str()) {}
54         ~TempFile() { file_.close(); boost::filesystem::remove(name_); }
55         
56         template <class T> TempFile & operator<<(T const & v) { file_ << v; return *this; }
57         enum Closer { close }; void operator<<(Closer) { file_.close(); }
58         std::string const & name() { return name_; }
59
60     private:
61         std::string name_;
62         std::ofstream file_;
63     };
64     
65 }
66
67 BOOST_AUTO_UNIT_TEST(configFile)
68 {
69     TempFile cfgf ("test.cfg");
70     cfgf << "dir1/fun1 10;\n" 
71          << TempFile::close;
72     
73     senf::console::ScopedDirectory<> dir1;
74     senf::console::root().add("dir1", dir1);
75     dir1.add("fun1",&fun1);
76
77     {
78         senf::console::ConfigFile cfg (cfgf.name());
79
80         var1 = 0;
81         SENF_CHECK_NO_THROW( cfg.parse() );
82         BOOST_CHECK_EQUAL( var1, 10 );
83
84         var1 = 0;
85         SENF_CHECK_NO_THROW( cfg.parse() );
86         BOOST_CHECK_EQUAL( var1, 0 );
87
88         var1 = 0;
89         cfg.reset();
90         SENF_CHECK_NO_THROW( cfg.parse() );
91         BOOST_CHECK_EQUAL( var1, 10 );
92     }
93
94     {
95         senf::console::ConfigFile cfg ("i don't exist");
96         cfg.ignoreMissing();
97         SENF_CHECK_NO_THROW( cfg.parse() );
98     }
99 }
100
101 BOOST_AUTO_UNIT_TEST(configFileRestrict)
102 {
103     TempFile cfgf ("test.cfg");
104     cfgf << "dir1/fun1 10;\n"
105          << "dir2/fun2;\n"
106          << TempFile::close;
107     
108     senf::console::ScopedDirectory<> dir1;
109     senf::console::root().add("dir1", dir1);
110     dir1.add("fun1",&fun1);
111     
112     {
113         var1 = 0;
114         var2 = false;
115         senf::console::ConfigFile cfg (cfgf.name());
116         SENF_CHECK_NO_THROW( cfg.parse(dir1) );
117         BOOST_CHECK_EQUAL( var1, 10 );
118         BOOST_CHECK_EQUAL( var2, false );
119         BOOST_CHECK( cfg.parsed(dir1) );
120         BOOST_CHECK( ! cfg.complete() );
121
122         senf::console::ScopedDirectory<> dir2;
123         senf::console::root().add("dir2", dir2);
124         dir2.add("fun2",&fun2);
125
126         var1 = 0;
127         var2 = false;
128         SENF_CHECK_NO_THROW( cfg.parse() );
129         BOOST_CHECK_EQUAL( var1, 0 );
130         BOOST_CHECK_EQUAL( var2, true );
131         BOOST_CHECK( cfg.complete() );
132     }
133 }
134
135 BOOST_AUTO_UNIT_TEST(configFileSkipGroup)
136 {
137     TempFile cfgf ("test.cfg");
138     cfgf << "dir1/fun1 10;\n"
139          << "dir2 { dir3 { fun2; } fun1 5; }"
140          << TempFile::close;
141     
142     senf::console::ScopedDirectory<> dir1;
143     senf::console::root().add("dir1", dir1);
144     dir1.add("fun1",&fun1);
145     
146     senf::console::ScopedDirectory<> dir2;
147     senf::console::root().add("dir2", dir2);
148     
149     dir2.mkdir("dir3").add("fun2", &fun2);
150     dir2.add("fun1", &fun1);
151
152     {
153         var1 = 0;
154         var2 = false;
155         senf::console::ConfigFile cfg (cfgf.name());
156         SENF_CHECK_NO_THROW( cfg.parse(dir1) );
157         BOOST_CHECK_EQUAL( var1, 10 );
158         BOOST_CHECK_EQUAL( var2, false );
159         BOOST_CHECK( cfg.parsed(dir1) );
160
161         var1 = 0;
162         var2 = false;
163         SENF_CHECK_NO_THROW( cfg.parse(dir2["dir3"]) );
164         BOOST_CHECK_EQUAL( var1, 0 );
165         BOOST_CHECK_EQUAL( var2, true );
166         BOOST_CHECK( ! cfg.parsed(dir2) );
167
168         var1 = 0;
169         var2 = false;
170         SENF_CHECK_NO_THROW( cfg.parse() );
171         BOOST_CHECK_EQUAL( var1, 5 );
172         BOOST_CHECK_EQUAL( var2, false );
173     }
174 }
175
176 BOOST_AUTO_UNIT_TEST(configRestrictAndLink)
177 {
178     TempFile cfgf ("test.cfg");
179     cfgf << "dir1/fun1 10;\n"
180          << "link1 { dir3 { fun2; } fun1 5; }"
181          << TempFile::close;
182     
183     senf::console::ScopedDirectory<> dir1;
184     senf::console::root().add("dir1", dir1);
185     dir1.add("fun1",&fun1);
186     
187     senf::console::ScopedDirectory<> dir2;
188     dir1.add("dir2", dir2);
189     
190     dir2.mkdir("dir3").add("fun2", &fun2);
191     dir2.add("fun1", &fun1);
192
193     senf::console::ScopedDirectory<> dir4;
194     senf::console::root().add("dir4", dir4);
195     dir4.link("link1", dir2);
196
197     {
198         senf::console::ConfigFile cfg (cfgf.name(), dir4);
199
200         var1 = 0;
201         var2 = false;
202         SENF_CHECK_NO_THROW( cfg.parse(dir2["dir3"]) );
203         BOOST_CHECK_EQUAL( var1, 0 );
204         BOOST_CHECK_EQUAL( var2, true );
205
206         BOOST_CHECK_THROW( cfg.parse(), senf::console::SyntaxErrorException );
207     }
208 }
209
210 ///////////////////////////////cc.e////////////////////////////////////////
211 #undef prefix_
212
213 \f
214 // Local Variables:
215 // mode: c++
216 // fill-column: 100
217 // comment-column: 40
218 // c-file-style: "senf"
219 // indent-tabs-mode: nil
220 // ispell-local-dictionary: "american"
221 // compile-command: "scons -u test"
222 // End: