$search
00001 /*************************************************************************** 00002 tag: The SourceWorks Tue Sep 7 00:54:57 CEST 2010 property_marsh_test.cpp 00003 00004 property_marsh_test.cpp - description 00005 ------------------- 00006 begin : Tue September 07 2010 00007 copyright : (C) 2010 The SourceWorks 00008 email : peter@thesourceworks.com 00009 00010 *************************************************************************** 00011 * * 00012 * This program is free software; you can redistribute it and/or modify * 00013 * it under the terms of the GNU General Public License as published by * 00014 * the Free Software Foundation; either version 2 of the License, or * 00015 * (at your option) any later version. * 00016 * * 00017 ***************************************************************************/ 00018 00019 00020 00021 #include <marsh/PropertyMarshaller.hpp> 00022 #include <marsh/PropertyDemarshaller.hpp> 00023 #include <Property.hpp> 00024 #include <PropertyBag.hpp> 00025 #include <types/PropertyComposition.hpp> 00026 00027 #include "unit.hpp" 00028 00029 class PropertyMarshTest 00030 { 00031 public: 00032 PropertyMarshTest() 00033 { 00034 } 00035 ~PropertyMarshTest() 00036 { 00037 } 00038 }; 00039 00040 00041 BOOST_FIXTURE_TEST_SUITE( PropertyMarshTestSuite, PropertyMarshTest ) 00042 00043 00044 BOOST_AUTO_TEST_CASE( testPropMarsh ) 00045 { 00046 std::string filename = "testPropMarsh.tst"; 00047 00048 PropertyBag source; // to file 00049 PropertyBag target; // from file 00050 00051 Property<PropertyBag> b1("b1","b1d"); 00052 Property<PropertyBag> b2("b2","b2d"); 00053 Property<int> p1("p1","p1d",-1); 00054 00055 // setup source tree 00056 source.addProperty( b1 ); 00057 b1.value().addProperty( b2 ); 00058 b2.value().addProperty( p1 ); 00059 00060 { 00061 // scope required such that file is closed 00062 PropertyMarshaller pm( filename ); 00063 pm.serialize( source ); 00064 } 00065 00066 { 00067 // scope required such that file is closed 00068 PropertyDemarshaller pd( filename ); 00069 BOOST_REQUIRE( pd.deserialize( target ) ); 00070 } 00071 00072 Property<PropertyBag> bag = target.getProperty("b1"); 00073 BOOST_REQUIRE( bag.ready() ); 00074 BOOST_CHECK( bag.getDescription() == "b1d" ); 00075 00076 bag = bag.rvalue().getProperty("b2"); 00077 BOOST_REQUIRE( bag.ready() ); 00078 BOOST_CHECK( bag.getDescription() == "b2d" ); 00079 00080 Property<int> pi = bag.rvalue().getProperty("p1"); 00081 BOOST_REQUIRE( pi.ready() ); 00082 BOOST_CHECK( pi.get() == -1 ); 00083 BOOST_CHECK( pi.getDescription() == "p1d" ); 00084 deletePropertyBag( target ); 00085 } 00086 00088 BOOST_AUTO_TEST_CASE( testPropMarshVect ) 00089 { 00090 std::string filename = "testPropMarshVect.tst"; 00091 00092 PropertyBag source; // to file 00093 PropertyBag target; // from file 00094 00095 Property<std::vector<double> >* p1 = new Property<std::vector<double> >("p1","p1d", std::vector<double>(7, 1.234) ); 00096 00097 // setup source tree 00098 source.addProperty( *p1 ); 00099 00100 { 00101 // scope required such that file is closed 00102 PropertyMarshaller pm( filename ); 00103 pm.serialize( source ); 00104 } 00105 00106 p1->set() = std::vector<double>(3, 0.234); 00107 { 00108 // scope required such that file is closed 00109 PropertyDemarshaller pd( filename ); 00110 BOOST_REQUIRE( pd.deserialize( target ) ); 00111 } 00112 00113 // check bag: 00114 Property<PropertyBag> bag = target.getProperty("p1"); 00115 BOOST_REQUIRE( bag.ready() ); 00116 BOOST_CHECK( bag.getDescription() == "p1d" ); 00117 BOOST_CHECK_EQUAL( bag.rvalue().size(), 7 ); 00118 00119 // update bag -> array. 00120 PropertyBag composed; 00121 BOOST_CHECK( composePropertyBag(target, composed)); 00122 BOOST_CHECK( updateProperties( source, composed) ); 00123 00124 //p1 = source.getProperty("p1"); 00125 BOOST_REQUIRE( p1->ready() ); 00126 BOOST_CHECK_EQUAL( p1->rvalue().size() , 7 ); 00127 BOOST_CHECK_EQUAL( p1->rvalue()[0] , 1.234 ); 00128 00129 deletePropertyBag( target ); 00130 deletePropertyBag( source ); 00131 } 00132 00134 BOOST_AUTO_TEST_CASE( testPropMarshVectLegacy ) 00135 { 00136 PropertyBag target; // to file 00137 PropertyBag source; // from file 00138 00139 Property<std::vector<double> >* p1 = new Property<std::vector<double> >("driveLimits","p1d", std::vector<double>(7, 1.234) ); 00140 00141 // setup target tree 00142 target.addProperty( *p1 ); 00143 { 00144 // scope required such that file is closed 00145 PropertyDemarshaller pd( "testPropMarshVectLegacy.cpf" ); 00146 BOOST_REQUIRE( pd.deserialize( source ) ); 00147 } 00148 // Check if the bag was read from file: 00149 Property<PropertyBag> bag = source.getProperty("driveLimits"); 00150 BOOST_REQUIRE( bag.ready() ); 00151 // check if legacy bag contains 7 elements: 00152 BOOST_CHECK_EQUAL( bag.value().size() , 7 ); 00153 00154 // update bag -> array. 00155 PropertyBag composed; 00156 BOOST_CHECK( composePropertyBag(source, composed)); 00157 BOOST_CHECK( refreshProperties( target, composed) ); 00158 00159 //p1 = target.getProperty("p1"); 00160 BOOST_REQUIRE( p1->ready() ); 00161 //cout << p1 << endl; 00162 // check updated vector size is 6, contents is 1: 00163 BOOST_CHECK_EQUAL( p1->rvalue().size() , 6 ); 00164 BOOST_CHECK_EQUAL( p1->rvalue()[0] , 1 ); 00165 00166 deletePropertyBag( source ); 00167 } 00168 00169 BOOST_AUTO_TEST_SUITE_END()