libmoost
/home/mhx/git/github/libmoost/test/configurable/configurable.cpp
Go to the documentation of this file.
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()