4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Stefan Bund <g0dil@berlios.de>
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.
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.
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.
24 \brief ConfigFile unit tests */
26 //#include "ConfigFile.test.hh"
27 //#include "ConfigFile.test.ih"
32 #include <boost/filesystem/operations.hpp>
34 #include <senf/Utils/auto_unit_test.hh>
35 #include <boost/test/test_tools.hpp>
38 ///////////////////////////////cc.p////////////////////////////////////////
45 void fun1(int v) { var1 = v; }
46 void fun2() { var2 = true; }
51 TempFile(std::string const & name) : name_ (name), file_ (name_.c_str()) {}
52 ~TempFile() { file_.close(); boost::filesystem::remove(name_); }
54 template <class T> TempFile & operator<<(T const & v) { file_ << v; return *this; }
55 enum Closer { close }; void operator<<(Closer) { file_.close(); }
56 std::string const & name() { return name_; }
65 BOOST_AUTO_UNIT_TEST(configFile)
67 TempFile cfgf ("test.cfg");
68 cfgf << "dir1/fun1 10;\n"
71 senf::console::ScopedDirectory<> dir1;
72 senf::console::root().add("dir1", dir1);
73 dir1.add("fun1",&fun1);
76 senf::console::ConfigFile cfg (cfgf.name());
79 SENF_CHECK_NO_THROW( cfg.parse() );
80 BOOST_CHECK_EQUAL( var1, 10 );
83 SENF_CHECK_NO_THROW( cfg.parse() );
84 BOOST_CHECK_EQUAL( var1, 0 );
88 SENF_CHECK_NO_THROW( cfg.parse() );
89 BOOST_CHECK_EQUAL( var1, 10 );
93 senf::console::ConfigFile cfg ("i don't exist");
95 SENF_CHECK_NO_THROW( cfg.parse() );
99 BOOST_AUTO_UNIT_TEST(configFileRestrict)
101 TempFile cfgf ("test.cfg");
102 cfgf << "dir1/fun1 10;\n"
106 senf::console::ScopedDirectory<> dir1;
107 senf::console::root().add("dir1", dir1);
108 dir1.add("fun1",&fun1);
113 senf::console::ConfigFile cfg (cfgf.name());
114 SENF_CHECK_NO_THROW( cfg.parse(dir1) );
115 BOOST_CHECK_EQUAL( var1, 10 );
116 BOOST_CHECK_EQUAL( var2, false );
117 BOOST_CHECK( cfg.parsed(dir1) );
118 BOOST_CHECK( ! cfg.complete() );
120 senf::console::ScopedDirectory<> dir2;
121 senf::console::root().add("dir2", dir2);
122 dir2.add("fun2",&fun2);
126 SENF_CHECK_NO_THROW( cfg.parse() );
127 BOOST_CHECK_EQUAL( var1, 0 );
128 BOOST_CHECK_EQUAL( var2, true );
129 BOOST_CHECK( cfg.complete() );
133 BOOST_AUTO_UNIT_TEST(configFileSkipGroup)
135 TempFile cfgf ("test.cfg");
136 cfgf << "dir1/fun1 10;\n"
137 << "dir2 { dir3 { fun2; } fun1 5; }"
140 senf::console::ScopedDirectory<> dir1;
141 senf::console::root().add("dir1", dir1);
142 dir1.add("fun1",&fun1);
144 senf::console::ScopedDirectory<> dir2;
145 senf::console::root().add("dir2", dir2);
147 dir2.mkdir("dir3").add("fun2", &fun2);
148 dir2.add("fun1", &fun1);
153 senf::console::ConfigFile cfg (cfgf.name());
154 SENF_CHECK_NO_THROW( cfg.parse(dir1) );
155 BOOST_CHECK_EQUAL( var1, 10 );
156 BOOST_CHECK_EQUAL( var2, false );
157 BOOST_CHECK( cfg.parsed(dir1) );
161 SENF_CHECK_NO_THROW( cfg.parse(dir2["dir3"]) );
162 BOOST_CHECK_EQUAL( var1, 0 );
163 BOOST_CHECK_EQUAL( var2, true );
164 BOOST_CHECK( ! cfg.parsed(dir2) );
168 SENF_CHECK_NO_THROW( cfg.parse() );
169 BOOST_CHECK_EQUAL( var1, 5 );
170 BOOST_CHECK_EQUAL( var2, false );
174 BOOST_AUTO_UNIT_TEST(configRestrictAndLink)
176 TempFile cfgf ("test.cfg");
177 cfgf << "dir1/fun1 10;\n"
178 << "link1 { dir3 { fun2; } fun1 5; }"
181 senf::console::ScopedDirectory<> dir1;
182 senf::console::root().add("dir1", dir1);
183 dir1.add("fun1",&fun1);
185 senf::console::ScopedDirectory<> dir2;
186 dir1.add("dir2", dir2);
188 dir2.mkdir("dir3").add("fun2", &fun2);
189 dir2.add("fun1", &fun1);
191 senf::console::ScopedDirectory<> dir4;
192 senf::console::root().add("dir4", dir4);
193 dir4.link("link1", dir2);
196 senf::console::ConfigFile cfg (cfgf.name(), dir4);
200 SENF_CHECK_NO_THROW( cfg.parse(dir2["dir3"]) );
201 BOOST_CHECK_EQUAL( var1, 0 );
202 BOOST_CHECK_EQUAL( var2, true );
204 BOOST_CHECK_THROW( cfg.parse(), senf::console::SyntaxErrorException );
208 ///////////////////////////////cc.e////////////////////////////////////////
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"