$search
00001 /*************************************************************************** 00002 tag: The SourceWorks Tue Sep 7 00:54:57 CEST 2010 type_discovery_test.cpp 00003 00004 type_discovery_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 #include "unit.hpp" 00021 00022 #include <boost/serialization/vector.hpp> 00023 #include <boost/array.hpp> 00024 00025 #include <rtt-fwd.hpp> 00026 #include <internal/DataSources.hpp> 00027 #include <types/type_discovery.hpp> 00028 #include <os/fosi.h> 00029 #include <boost/lambda/lambda.hpp> 00030 00031 #include "datasource_fixture.hpp" 00032 #include "types/StructTypeInfo.hpp" 00033 #include "types/CArrayTypeInfo.hpp" 00034 #include "types/SequenceTypeInfo.hpp" 00035 #include "types/BoostArrayTypeInfo.hpp" 00036 00037 using namespace boost::lambda; 00038 using namespace boost::archive; 00039 using namespace boost::serialization; 00040 00041 class TypeArchiveTest 00042 { 00043 public: 00044 TypeArchiveTest() { } 00045 ~TypeArchiveTest() { } 00046 }; 00047 00048 // Registers the fixture into the 'registry' 00049 BOOST_FIXTURE_TEST_SUITE( TypeArchiveTestSuite, TypeArchiveTest ) 00050 00051 // Test writing an AType data sample into a type data archive 00052 BOOST_AUTO_TEST_CASE( testATypeDiscovery ) 00053 { 00054 AssignableDataSource<AType>::shared_ptr atype = new ValueDataSource<AType>( AType(true) ); 00055 00056 // decompose a complex type 00057 type_discovery out( atype ); 00058 out.discover( atype->set() ); 00059 00060 BOOST_CHECK_EQUAL( out.mnames.size(), 5 ); 00061 BOOST_CHECK_EQUAL( out.mparts.size(), 5 ); 00062 BOOST_CHECK_EQUAL( out.mparent, atype); 00063 00064 // for_each( out.mnames.begin(), out.mnames.end(), cout << lambda::_1 <<", " ); 00065 // cout <<endl; 00066 00067 BOOST_REQUIRE_EQUAL( out.mparts.size(), 5); 00068 00069 AssignableDataSource<int>::shared_ptr a = AssignableDataSource<int>::narrow( out.mparts[0].get() ); 00070 AssignableDataSource<double>::shared_ptr b = AssignableDataSource<double>::narrow( out.mparts[1].get() ); 00071 AssignableDataSource<string>::shared_ptr c = AssignableDataSource<string>::narrow( out.mparts[2].get()); 00072 AssignableDataSource<types::carray<int> >::shared_ptr ai = AssignableDataSource<types::carray<int> >::narrow( out.mparts[3].get()); 00073 AssignableDataSource<vector<double> >::shared_ptr vd = AssignableDataSource<vector<double> >::narrow( out.mparts[4].get()); 00074 00075 BOOST_REQUIRE( a ); 00076 BOOST_REQUIRE( b ); 00077 BOOST_REQUIRE( c ); 00078 BOOST_REQUIRE( ai ); 00079 BOOST_REQUIRE( vd ); 00080 00081 // Check reading parts (must equal parent) 00082 BOOST_CHECK_EQUAL( a->get(), atype->get().a ); 00083 BOOST_CHECK_EQUAL( b->get(), atype->get().b ); 00084 BOOST_CHECK_EQUAL( c->get(), atype->get().c ); 00085 BOOST_CHECK_EQUAL( ai->get().address()[3], atype->get().ai[3] ); 00086 BOOST_CHECK_EQUAL( vd->get()[3], atype->get().vd[3] ); 00087 00088 // Check writing a part (must change in parent too). 00089 a->set(10); 00090 BOOST_CHECK_EQUAL( a->get(), 10 ); 00091 BOOST_CHECK_EQUAL( a->get(), atype->get().a ); 00092 00093 // Check getMember function. 00094 BOOST_CHECK_EQUAL( out.getMember("a"), out.mparts[0] ); 00095 BOOST_CHECK_EQUAL( out.getMember("b"), out.mparts[1] ); 00096 BOOST_CHECK_EQUAL( out.getMember("c"), out.mparts[2] ); 00097 BOOST_CHECK_EQUAL( out.getMember("ai"), out.mparts[3] ); 00098 BOOST_CHECK_EQUAL( out.getMember("vd"), out.mparts[4] ); 00099 } 00100 00101 // Test writing a BType data sample into a type data archive 00102 BOOST_AUTO_TEST_CASE( testBTypeDiscovery ) 00103 { 00104 AssignableDataSource<BType>::shared_ptr atype = new ValueDataSource<BType>( BType(true) ); 00105 00106 // decompose a complex type 00107 type_discovery out( atype ); 00108 out.discover( atype->set() ); 00109 00110 BOOST_CHECK_EQUAL( out.mnames.size(), 5 ); 00111 BOOST_CHECK_EQUAL( out.mparts.size(), 5 ); 00112 BOOST_CHECK_EQUAL( out.mparent, atype); 00113 00114 // for_each( out.mnames.begin(), out.mnames.end(), cout << lambda::_1 <<", " ); 00115 // cout <<endl; 00116 00117 BOOST_REQUIRE_EQUAL( out.mparts.size(), 5); 00118 00119 AssignableDataSource<int>::shared_ptr a = AssignableDataSource<int>::narrow( out.mparts[0].get() ); 00120 AssignableDataSource<double>::shared_ptr b = AssignableDataSource<double>::narrow( out.mparts[1].get() ); 00121 AssignableDataSource< carray<char> >::shared_ptr c = AssignableDataSource< carray<char> >::narrow( out.mparts[2].get()); 00122 AssignableDataSource< carray<int> >::shared_ptr ai = AssignableDataSource< carray<int> >::narrow( out.mparts[3].get()); 00123 AssignableDataSource< carray<double> >::shared_ptr vd = AssignableDataSource< carray<double> >::narrow( out.mparts[4].get()); 00124 00125 BOOST_REQUIRE( a ); 00126 BOOST_REQUIRE( b ); 00127 BOOST_REQUIRE( c ); 00128 BOOST_REQUIRE( ai ); 00129 BOOST_REQUIRE( vd ); 00130 00131 BOOST_CHECK( !out.getMember("zort") ); 00132 00133 00134 // Check reading parts (must equal parent) 00135 BOOST_CHECK_EQUAL( a->get(), atype->get().a ); 00136 BOOST_CHECK_EQUAL( b->get(), atype->get().b ); 00137 BOOST_CHECK_EQUAL( c->get().address(), atype->set().c ); 00138 BOOST_CHECK_EQUAL( ai->get().address()[3], atype->set().ai[3] ); 00139 BOOST_CHECK_EQUAL( vd->get().address()[3], atype->set().vd[3] ); 00140 00141 // Check writing a part (must change in parent too). 00142 a->set(10); 00143 BOOST_CHECK_EQUAL( a->get(), 10 ); 00144 BOOST_CHECK_EQUAL( a->get(), atype->get().a ); 00145 00146 c->set().address()[3] = 'L'; 00147 BOOST_CHECK_EQUAL( c->get().address(), "helLo" ); 00148 BOOST_CHECK_EQUAL( c->get().address(), atype->set().c ); 00149 00150 // Check getMember function. 00151 BOOST_CHECK_EQUAL( out.getMember("a"), out.mparts[0] ); 00152 BOOST_CHECK_EQUAL( out.getMember("b"), out.mparts[1] ); 00153 BOOST_CHECK_EQUAL( out.getMember("c"), out.mparts[2] ); 00154 BOOST_CHECK_EQUAL( out.getMember("ai"), out.mparts[3] ); 00155 BOOST_CHECK_EQUAL( out.getMember("vd"), out.mparts[4] ); 00156 } 00157 00158 BOOST_AUTO_TEST_SUITE_END() 00159