libmoost
|
00001 /* vim:set ts=3 sw=3 sts=3 et: */ 00028 #include <boost/test/unit_test.hpp> 00029 #include <boost/test/test_tools.hpp> 00030 00031 #include <string> 00032 00033 #include "../../include/moost/configurable.hpp" 00034 00035 using namespace moost::configurable; 00036 00037 BOOST_AUTO_TEST_SUITE( binder_test ) 00038 00039 struct SimpleConfigurable : public binder 00040 { 00041 int MyInt; 00042 float MyFloat; 00043 std::string MyString; 00044 00045 SimpleConfigurable() 00046 { 00047 bind("MyInt", MyInt, 0); 00048 bind("MyFloat", MyFloat, 0.0F); 00049 bind<std::string>("MyString", MyString, ""); 00050 } 00051 }; 00052 00053 struct AddressConfigurable : public binder 00054 { 00055 std::string Host; 00056 int Port; 00057 AddressConfigurable() 00058 { 00059 bind<std::string>("Host", Host, ""); 00060 bind("Port", Port, 0); 00061 } 00062 }; 00063 00064 struct ComplexConfigurable : public binder 00065 { 00066 SimpleConfigurable Simple; 00067 indexed_binder<AddressConfigurable> Addresses; 00068 00069 int MyInt; 00070 float SomeFloat; 00071 00072 ComplexConfigurable() 00073 { 00074 child("Simple", Simple); 00075 child("Addresses", Addresses); 00076 bind("MyInt", MyInt, 0); 00077 bind("SomeFloat", SomeFloat, 0.0F); 00078 } 00079 }; 00080 00081 struct BoolConfigurable : public binder 00082 { 00083 bool MyBool; 00084 00085 BoolConfigurable() 00086 { 00087 bind("MyBool", MyBool, false); 00088 } 00089 }; 00090 00091 struct Fixture 00092 { 00093 Fixture() 00094 { 00095 } 00096 ~Fixture() 00097 { 00098 } 00099 00100 SimpleConfigurable sc; 00101 ComplexConfigurable cc; 00102 indexed_binder<SimpleConfigurable> ic; 00103 BoolConfigurable bc; 00104 }; 00105 00106 BOOST_FIXTURE_TEST_CASE( test_binding_in, Fixture ) 00107 { 00108 sc.set("MyInt", "3"); 00109 BOOST_CHECK_EQUAL(sc.MyInt, 3); 00110 sc.set("MyFloat", "3.1"); 00111 BOOST_CHECK_EQUAL(sc.MyFloat, 3.1F); 00112 sc.set("MyString", "hey dude bro"); 00113 BOOST_CHECK_EQUAL(sc.MyString, "hey dude bro"); 00114 } 00115 00116 BOOST_FIXTURE_TEST_CASE( test_binding_out, Fixture ) 00117 { 00118 std::string value; 00119 sc.MyInt = 3; 00120 sc.get("MyInt", value); 00121 BOOST_CHECK_EQUAL(value, "3"); 00122 sc.MyFloat = 3.1F; 00123 sc.get("MyFloat", value); 00124 BOOST_CHECK_EQUAL(value, "3.1"); 00125 sc.MyString = "hey dude bro"; 00126 sc.get("MyString", value); 00127 BOOST_CHECK_EQUAL(value, "hey dude bro"); 00128 } 00129 00130 BOOST_FIXTURE_TEST_CASE( test_readwrite, Fixture ) 00131 { 00132 sc.MyInt = 3; 00133 sc.MyFloat = 3.1F; 00134 sc.MyString = "hey dude bro"; 00135 00136 std::ostringstream out; 00137 00138 sc.write(out); 00139 00140 SimpleConfigurable sc2; 00141 00142 std::istringstream in(out.str()); 00143 00144 sc2.read(in); 00145 BOOST_CHECK_EQUAL(sc2.MyInt, 3); 00146 BOOST_CHECK_EQUAL(sc2.MyFloat, 3.1F); 00147 BOOST_CHECK_EQUAL(sc2.MyString, "hey dude bro"); 00148 } 00149 00150 BOOST_FIXTURE_TEST_CASE( test_list, Fixture ) 00151 { 00152 sc.MyInt = 3; 00153 sc.MyFloat = 3.1F; 00154 sc.MyString = "hey dude bro"; 00155 00156 std::vector< std::pair<std::string, std::string> > items; 00157 sc.list(items); 00158 00159 std::pair<std::string, std::string> item1("MyInt", "3"); 00160 std::pair<std::string, std::string> item2("MyFloat", "3.1"); 00161 std::pair<std::string, std::string> item3("MyString", "hey dude bro"); 00162 00163 BOOST_CHECK_EQUAL(items.size(), 3); 00164 BOOST_CHECK(std::find(items.begin(), items.end(), item1) != items.end()); 00165 BOOST_CHECK(std::find(items.begin(), items.end(), item2) != items.end()); 00166 BOOST_CHECK(std::find(items.begin(), items.end(), item3) != items.end()); 00167 } 00168 00169 BOOST_FIXTURE_TEST_CASE( test_index_size, Fixture ) 00170 { 00171 ic.resize(7); 00172 BOOST_CHECK_EQUAL(ic.size(), 7); 00173 std::string value; 00174 ic.get("size", value); 00175 BOOST_CHECK_EQUAL(value, "7"); 00176 ic.set("size", "9"); 00177 BOOST_CHECK_EQUAL(ic.size(), 9); 00178 } 00179 00180 BOOST_FIXTURE_TEST_CASE( test_index_getset, Fixture ) 00181 { 00182 ic.resize(7); 00183 ic[1].MyFloat = 3.1; 00184 00185 std::string value; 00186 ic.get("1.MyFloat", value); 00187 BOOST_CHECK_EQUAL(value, "3.1"); 00188 00189 ic.set("3.MyInt", "17"); 00190 BOOST_CHECK_EQUAL(ic[3].MyInt, 17); 00191 } 00192 00193 BOOST_FIXTURE_TEST_CASE( test_index_read, Fixture ) 00194 { 00195 ic.resize(2); 00196 ic[0].MyFloat = 3.1F; 00197 ic[0].MyInt = 30; 00198 ic[0].MyString = "yabba dabba"; 00199 ic[1].MyFloat = 3.9F; 00200 ic[1].MyInt = 40; 00201 ic[1].MyString = "doooo!"; 00202 00203 std::ostringstream out; 00204 ic.write(out); 00205 00206 std::istringstream in(out.str()); 00207 indexed_binder<SimpleConfigurable> ic2; 00208 00209 ic2.read(in); 00210 00211 BOOST_CHECK_EQUAL(ic.size(), ic2.size()); 00212 BOOST_CHECK_EQUAL(ic[0].MyFloat, ic2[0].MyFloat); 00213 BOOST_CHECK_EQUAL(ic[0].MyInt, ic2[0].MyInt); 00214 BOOST_CHECK_EQUAL(ic[0].MyString, ic2[0].MyString); 00215 BOOST_CHECK_EQUAL(ic[1].MyFloat, ic2[1].MyFloat); 00216 BOOST_CHECK_EQUAL(ic[1].MyInt, ic2[1].MyInt); 00217 BOOST_CHECK_EQUAL(ic[1].MyString, ic2[1].MyString); 00218 } 00219 00220 BOOST_FIXTURE_TEST_CASE( test_complex_binding_in, Fixture ) 00221 { 00222 cc.set("MyInt", "3"); 00223 BOOST_CHECK_EQUAL(cc.MyInt, 3); 00224 cc.set("SomeFloat", "3.1"); 00225 BOOST_CHECK_EQUAL(cc.SomeFloat, 3.1F); 00226 cc.set("Simple.MyInt", "4"); 00227 BOOST_CHECK_EQUAL(cc.Simple.MyInt, 4); 00228 cc.set("Simple.MyFloat", "9.2"); 00229 BOOST_CHECK_EQUAL(cc.Simple.MyFloat, 9.2F); 00230 cc.set("Simple.MyString", "hey well hello"); 00231 BOOST_CHECK_EQUAL(cc.Simple.MyString, "hey well hello"); 00232 cc.set("Addresses.size", "2"); 00233 BOOST_CHECK_EQUAL(cc.Addresses.size(), 2); 00234 cc.set("Addresses.0.Host", "hosty host"); 00235 BOOST_CHECK_EQUAL(cc.Addresses[0].Host, "hosty host"); 00236 cc.set("Addresses.0.Port", "123"); 00237 BOOST_CHECK_EQUAL(cc.Addresses[0].Port, 123); 00238 cc.set("Addresses.1.Host", "another host"); 00239 BOOST_CHECK_EQUAL(cc.Addresses[1].Host, "another host"); 00240 cc.set("Addresses.1.Port", "345"); 00241 BOOST_CHECK_EQUAL(cc.Addresses[1].Port, 345); 00242 } 00243 00244 BOOST_FIXTURE_TEST_CASE( test_complex_binding_out, Fixture ) 00245 { 00246 std::string value; 00247 cc.MyInt = 3; 00248 cc.get("MyInt", value); 00249 BOOST_CHECK_EQUAL(value, "3"); 00250 cc.SomeFloat = 3.1F; 00251 cc.get("SomeFloat", value); 00252 BOOST_CHECK_EQUAL(value, "3.1"); 00253 cc.Simple.MyInt = 4; 00254 cc.get("Simple.MyInt", value); 00255 BOOST_CHECK_EQUAL(value, "4"); 00256 cc.Simple.MyFloat = 9.2F; 00257 cc.get("Simple.MyFloat", value); 00258 BOOST_CHECK_EQUAL(value, "9.2"); 00259 cc.Simple.MyString = "hey well hello"; 00260 cc.get("Simple.MyString", value); 00261 BOOST_CHECK_EQUAL(value, "hey well hello"); 00262 cc.Addresses.resize(2); 00263 cc.get("Addresses.size", value); 00264 BOOST_CHECK_EQUAL(value, "2"); 00265 cc.Addresses[0].Host = "hosted the mosted"; 00266 cc.get("Addresses.0.Host", value); 00267 BOOST_CHECK_EQUAL(value, "hosted the mosted"); 00268 cc.Addresses[0].Port = 789; 00269 cc.get("Addresses.0.Port", value); 00270 BOOST_CHECK_EQUAL(value, "789"); 00271 cc.Addresses[1].Host = "one more host"; 00272 cc.get("Addresses.1.Host", value); 00273 BOOST_CHECK_EQUAL(value, "one more host"); 00274 cc.Addresses[1].Port = 12; 00275 cc.get("Addresses.1.Port", value); 00276 BOOST_CHECK_EQUAL(value, "12"); 00277 } 00278 00279 BOOST_FIXTURE_TEST_CASE( test_complex_readwrite, Fixture ) 00280 { 00281 cc.MyInt = 3; 00282 cc.SomeFloat = 3.1F; 00283 cc.Simple.MyInt = 4; 00284 cc.Simple.MyFloat = 9.2F; 00285 cc.Simple.MyString = "yes here we go"; 00286 cc.Addresses.resize(2); 00287 cc.Addresses[0].Host = "first host"; 00288 cc.Addresses[0].Port = 111; 00289 cc.Addresses[1].Host = "second host"; 00290 cc.Addresses[1].Port = 222; 00291 00292 std::ostringstream out; 00293 00294 cc.write(out); 00295 00296 ComplexConfigurable cc2; 00297 00298 std::istringstream in(out.str()); 00299 00300 cc2.read(in); 00301 BOOST_CHECK_EQUAL(cc2.MyInt, 3); 00302 BOOST_CHECK_EQUAL(cc2.SomeFloat, 3.1F); 00303 BOOST_CHECK_EQUAL(cc2.Simple.MyInt, 4); 00304 BOOST_CHECK_EQUAL(cc2.Simple.MyFloat, 9.2F); 00305 BOOST_CHECK_EQUAL(cc2.Simple.MyString, "yes here we go"); 00306 BOOST_CHECK_EQUAL(cc2.Addresses.size(), 2); 00307 BOOST_CHECK_EQUAL(cc2.Addresses[0].Host, "first host"); 00308 BOOST_CHECK_EQUAL(cc2.Addresses[0].Port, 111); 00309 BOOST_CHECK_EQUAL(cc2.Addresses[1].Host, "second host"); 00310 BOOST_CHECK_EQUAL(cc2.Addresses[1].Port, 222); 00311 } 00312 00313 BOOST_FIXTURE_TEST_CASE( test_complex_list, Fixture ) 00314 { 00315 cc.MyInt = 3; 00316 cc.SomeFloat = 3.1F; 00317 cc.Simple.MyInt = 4; 00318 cc.Simple.MyFloat = 9.2F; 00319 cc.Simple.MyString = "yes here we go"; 00320 cc.Addresses.resize(2); 00321 cc.Addresses[0].Host = "first host"; 00322 cc.Addresses[0].Port = 111; 00323 cc.Addresses[1].Host = "second host"; 00324 cc.Addresses[1].Port = 222; 00325 00326 std::vector< std::pair<std::string, std::string> > items; 00327 cc.list(items); 00328 00329 std::pair<std::string, std::string> item1("MyInt", "3"); 00330 std::pair<std::string, std::string> item2("SomeFloat", "3.1"); 00331 std::pair<std::string, std::string> item3("Simple.MyInt", "4"); 00332 std::pair<std::string, std::string> item4("Simple.MyFloat", "9.2"); 00333 std::pair<std::string, std::string> item5("Simple.MyString", "yes here we go"); 00334 std::pair<std::string, std::string> item6("Addresses.size", "2"); 00335 std::pair<std::string, std::string> item7("Addresses.0.Host", "first host"); 00336 std::pair<std::string, std::string> item8("Addresses.0.Port", "111"); 00337 std::pair<std::string, std::string> item9("Addresses.1.Host", "second host"); 00338 std::pair<std::string, std::string> item10("Addresses.1.Port", "222"); 00339 00340 BOOST_CHECK_EQUAL(items.size(), 10); 00341 BOOST_CHECK(std::find(items.begin(), items.end(), item1) != items.end()); 00342 BOOST_CHECK(std::find(items.begin(), items.end(), item2) != items.end()); 00343 BOOST_CHECK(std::find(items.begin(), items.end(), item3) != items.end()); 00344 BOOST_CHECK(std::find(items.begin(), items.end(), item4) != items.end()); 00345 BOOST_CHECK(std::find(items.begin(), items.end(), item5) != items.end()); 00346 BOOST_CHECK(std::find(items.begin(), items.end(), item6) != items.end()); 00347 BOOST_CHECK(std::find(items.begin(), items.end(), item7) != items.end()); 00348 BOOST_CHECK(std::find(items.begin(), items.end(), item8) != items.end()); 00349 BOOST_CHECK(std::find(items.begin(), items.end(), item9) != items.end()); 00350 BOOST_CHECK(std::find(items.begin(), items.end(), item10) != items.end()); 00351 } 00352 00353 BOOST_FIXTURE_TEST_CASE( test_bool, Fixture ) 00354 { 00355 std::string bool_conf = "{\n MyBool true\n}"; 00356 std::istringstream iss(bool_conf); 00357 bc.read(iss); 00358 00359 BOOST_CHECK_EQUAL(bc.MyBool, true); 00360 } 00361 00362 BOOST_AUTO_TEST_SUITE_END()