deserializer_test.cpp
Go to the documentation of this file.
00001 #include "config.h"
00002 #include <gtest/gtest.h>
00003 
00004 #include "ros_type_introspection/deserializer.hpp"
00005 #include <sensor_msgs/JointState.h>
00006 #include <sensor_msgs/NavSatStatus.h>
00007 #include <sensor_msgs/Imu.h>
00008 #include <std_msgs/Int16MultiArray.h>
00009 
00010 using namespace ros::message_traits;
00011 using namespace RosIntrospection;
00012 
00013 TEST(Deserialize, JointState)
00014 
00015 {
00016   ROSTypeList type_map = buildROSTypeMapFromDefinition(
00017         DataType<sensor_msgs::JointState >::value(),
00018         Definition<sensor_msgs::JointState >::value() );
00019 
00020   sensor_msgs::JointState joint_state;
00021 
00022   joint_state.header.seq = 2016;
00023   joint_state.header.stamp.sec  = 1234;
00024   joint_state.header.stamp.nsec = 567*1000*1000;
00025   joint_state.header.frame_id = "pippo";
00026 
00027   joint_state.name.resize( 3 );
00028   joint_state.position.resize( 3 );
00029   joint_state.velocity.resize( 3 );
00030   joint_state.effort.resize( 3 );
00031 
00032   std::string names[3];
00033   names[0] = ("hola");
00034   names[1] = ("ciao");
00035   names[2] = ("bye");
00036 
00037   for (int i=0; i<3; i++)
00038   {
00039     joint_state.name[i] = names[i];
00040     joint_state.position[i]= 11+i;
00041     joint_state.velocity[i]= 21+i;
00042     joint_state.effort[i]= 31+i;
00043   }
00044 
00045   std::vector<uint8_t> buffer(64*1024);
00046   ros::serialization::OStream stream(buffer.data(), buffer.size());
00047   ros::serialization::Serializer<sensor_msgs::JointState>::write(stream, joint_state);
00048 
00049   ROSType main_type( DataType<sensor_msgs::JointState >::value() );
00050 
00051   ROSTypeFlat flat_container;
00052   buildRosFlatType(type_map,
00053                    main_type,
00054                    "JointState",
00055                    buffer.data(),
00056                    &flat_container,
00057                    100);
00058 
00059   if(VERBOSE_TEST){
00060     for(auto&it: flat_container.value) {
00061       std::cout << it.first << " >> " << it.second.convert<double>() << std::endl;
00062     }
00063 
00064     for(auto&it: flat_container.name) {
00065       std::cout << it.first << " >> " << it.second << std::endl;
00066     }
00067   }
00068 
00069   EXPECT_EQ( flat_container.value[0].first.toStdString() , ("JointState/header/seq"));
00070   EXPECT_EQ( flat_container.value[0].second, 2016 );
00071   EXPECT_EQ( flat_container.value[1].first.toStdString() , ("JointState/header/stamp"));
00072   EXPECT_EQ( flat_container.value[1].second.convert<double>(),   double(1234.567)  );
00073   EXPECT_EQ( flat_container.value[1].second.convert<ros::Time>(), joint_state.header.stamp  );
00074 
00075   EXPECT_EQ( flat_container.value[2].first.toStdString() , ("JointState/position.0"));
00076   EXPECT_EQ( flat_container.value[2].second, 11 );
00077   EXPECT_EQ( flat_container.value[3].first.toStdString() , ("JointState/position.1"));
00078   EXPECT_EQ( flat_container.value[3].second, 12 );
00079   EXPECT_EQ( flat_container.value[4].first.toStdString() , ("JointState/position.2"));
00080   EXPECT_EQ( flat_container.value[4].second, 13 );
00081 
00082   EXPECT_EQ( flat_container.value[5].first.toStdString() , ("JointState/velocity.0"));
00083   EXPECT_EQ( flat_container.value[5].second, 21 );
00084   EXPECT_EQ( flat_container.value[6].first.toStdString() , ("JointState/velocity.1"));
00085   EXPECT_EQ( flat_container.value[6].second, 22 );
00086   EXPECT_EQ( flat_container.value[7].first.toStdString() , ("JointState/velocity.2"));
00087   EXPECT_EQ( flat_container.value[7].second, 23 );
00088 
00089   EXPECT_EQ( flat_container.value[8].first.toStdString() , ("JointState/effort.0"));
00090   EXPECT_EQ( flat_container.value[8].second, 31 );
00091   EXPECT_EQ( flat_container.value[9].first.toStdString() , ("JointState/effort.1"));
00092   EXPECT_EQ( flat_container.value[9].second, 32 );
00093   EXPECT_EQ( flat_container.value[10].first.toStdString() , ("JointState/effort.2"));
00094   EXPECT_EQ( flat_container.value[10].second, 33 );
00095 
00096   EXPECT_EQ( flat_container.name[0].first.toStdString() , ("JointState/header/frame_id"));
00097   EXPECT_EQ( flat_container.name[0].second, ("pippo") );
00098 
00099   EXPECT_EQ( flat_container.name[1].first.toStdString() , ("JointState/name.0"));
00100   EXPECT_EQ( flat_container.name[1].second, ("hola") );
00101   EXPECT_EQ( flat_container.name[2].first.toStdString() , ("JointState/name.1"));
00102   EXPECT_EQ( flat_container.name[2].second, ("ciao") );
00103   EXPECT_EQ( flat_container.name[3].first.toStdString() , ("JointState/name.2"));
00104   EXPECT_EQ( flat_container.name[3].second, ("bye") );
00105 }
00106 
00107 TEST( Deserialize, NavSatStatus)
00108 
00109 {
00110   // We test this because we want to test that constant fields are skipped.
00111 
00112   ROSTypeList type_map = buildROSTypeMapFromDefinition(
00113         DataType<sensor_msgs::NavSatStatus >::value(),
00114         Definition<sensor_msgs::NavSatStatus >::value() );
00115 
00116   sensor_msgs::NavSatStatus nav_stat;
00117   nav_stat.status  = nav_stat.STATUS_GBAS_FIX;  // 2
00118   nav_stat.service = nav_stat.SERVICE_COMPASS; // 4
00119 
00120 
00121   std::vector<uint8_t> buffer(64*1024);
00122   ros::serialization::OStream stream(buffer.data(), buffer.size());
00123   ros::serialization::Serializer<sensor_msgs::NavSatStatus>::write(stream, nav_stat);
00124 
00125   ROSType main_type( DataType<sensor_msgs::NavSatStatus >::value() );
00126 
00127   ROSTypeFlat flat_container;
00128   buildRosFlatType(type_map,
00129                    main_type,
00130                    "nav_stat",
00131                    buffer.data(),
00132                    &flat_container, 100);
00133 
00134   if(VERBOSE_TEST){ std::cout << " -------------------- " << std::endl;
00135 
00136     for(auto&it: flat_container.value) {
00137       std::cout << it.first << " >> " << it.second.convert<double>() << std::endl;
00138     }
00139   }
00140 
00141   EXPECT_EQ( flat_container.value[0].first.toStdString() , ("nav_stat/status"));
00142   EXPECT_EQ( flat_container.value[0].second, (int)nav_stat.STATUS_GBAS_FIX );
00143   EXPECT_EQ( flat_container.value[1].first.toStdString() , ("nav_stat/service"));
00144   EXPECT_EQ( flat_container.value[1].second, (int)nav_stat.SERVICE_COMPASS );
00145 }
00146 
00147 TEST( Deserialize, DeserializeIMU)
00148 //int func()
00149 {
00150   // We test this because to check if arrays with fixed length work.
00151 
00152   ROSTypeList type_map = buildROSTypeMapFromDefinition(
00153         DataType<sensor_msgs::Imu >::value(),
00154         Definition<sensor_msgs::Imu >::value() );
00155 
00156   sensor_msgs::Imu imu;
00157 
00158   imu.header.seq = 2016;
00159   imu.header.stamp.sec  = 1234;
00160   imu.header.stamp.nsec = 567*1000*1000;
00161   imu.header.frame_id = "pippo";
00162 
00163   imu.orientation.x = 11;
00164   imu.orientation.y = 12;
00165   imu.orientation.z = 13;
00166   imu.orientation.w = 14;
00167 
00168   imu.angular_velocity.x = 21;
00169   imu.angular_velocity.y = 22;
00170   imu.angular_velocity.z = 23;
00171 
00172   imu.linear_acceleration.x = 31;
00173   imu.linear_acceleration.y = 32;
00174   imu.linear_acceleration.z = 33;
00175 
00176   for (int i=0; i<9; i++)
00177   {
00178     imu.orientation_covariance[i]         = 40+i;
00179     imu.angular_velocity_covariance[i]    = 50+i;
00180     imu.linear_acceleration_covariance[i] = 60+i;
00181   }
00182 
00183   std::vector<uint8_t> buffer(64*1024);
00184   ros::serialization::OStream stream(buffer.data(), buffer.size());
00185   ros::serialization::Serializer<sensor_msgs::Imu>::write(stream, imu);
00186 
00187   ROSType main_type( DataType<sensor_msgs::Imu >::value() );
00188 
00189   ROSTypeFlat flat_container;
00190   buildRosFlatType(type_map,
00191                    main_type,
00192                    "imu",
00193                    buffer.data(),
00194                    &flat_container, 100);
00195 
00196   if(VERBOSE_TEST){
00197 
00198     std::cout << " -------------------- " << std::endl;
00199     for(auto&it: flat_container.value) {
00200       std::cout << it.first << " >> " << it.second.convert<double>() << std::endl;
00201     }
00202   }
00203 
00204   int index = 0;
00205 
00206   EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/header/seq"));
00207   EXPECT_EQ( flat_container.value[index].second, 2016 );
00208   index++;
00209   EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/header/stamp"));
00210   EXPECT_EQ( flat_container.value[index].second.convert<double>(),   double(1234.567)  );
00211   EXPECT_EQ( flat_container.value[index].second.convert<ros::Time>(), imu.header.stamp  );
00212   index++;
00213   EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/orientation/x"));
00214   EXPECT_EQ( flat_container.value[index].second, 11 );
00215   index++;
00216   EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/orientation/y"));
00217   EXPECT_EQ( flat_container.value[index].second, 12 );
00218   index++;
00219   EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/orientation/z"));
00220   EXPECT_EQ( flat_container.value[index].second, 13 );
00221   index++;
00222   EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/orientation/w"));
00223   EXPECT_EQ( flat_container.value[index].second, 14 );
00224   index++;
00225 
00226   for(int i=0; i<9; i++)
00227   {
00228     char str[64];
00229     sprintf(str, "imu/orientation_covariance.%d",i);
00230     EXPECT_EQ( flat_container.value[index].first.toStdString() , (str) );
00231     EXPECT_EQ( flat_container.value[index].second, 40+i );
00232     index++;
00233   }
00234 
00235   EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/angular_velocity/x"));
00236   EXPECT_EQ( flat_container.value[index].second, 21 );
00237   index++;
00238   EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/angular_velocity/y"));
00239   EXPECT_EQ( flat_container.value[index].second, 22 );
00240   index++;
00241   EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/angular_velocity/z"));
00242   EXPECT_EQ( flat_container.value[index].second, 23 );
00243   index++;
00244 
00245   for(int i=0; i<9; i++)
00246   {
00247     char str[64];
00248     sprintf(str, "imu/angular_velocity_covariance.%d",i);
00249     EXPECT_EQ( flat_container.value[index].first.toStdString() , (str) );
00250     EXPECT_EQ( flat_container.value[index].second, 50+i );
00251     index++;
00252   }
00253 
00254   EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/linear_acceleration/x"));
00255   EXPECT_EQ( flat_container.value[index].second, 31 );
00256   index++;
00257   EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/linear_acceleration/y"));
00258   EXPECT_EQ( flat_container.value[index].second, 32 );
00259   index++;
00260   EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/linear_acceleration/z"));
00261   EXPECT_EQ( flat_container.value[index].second, 33 );
00262   index++;
00263 
00264   for(int i=0; i<9; i++)
00265   {
00266     char str[64];
00267     sprintf(str, "imu/linear_acceleration_covariance.%d",i);
00268     EXPECT_EQ( flat_container.value[index].first.toStdString() , (str) );
00269     EXPECT_EQ( flat_container.value[index].second, 60+i );
00270     index++;
00271   }
00272 }
00273 
00274 
00275 
00276 TEST( Deserialize, Int16MultiArrayDeserialize)
00277 //int func()
00278 {
00279   ROSTypeList type_map = buildROSTypeMapFromDefinition(
00280         DataType<std_msgs::Int16MultiArray >::value(),
00281         Definition<std_msgs::Int16MultiArray >::value() );
00282 
00283   std_msgs::Int16MultiArray multi_array;
00284 
00285   const unsigned N = 6;
00286   multi_array.layout.data_offset = 42;
00287   multi_array.data.resize(N);
00288 
00289   for (unsigned i=0; i<N; i++){
00290     multi_array.data[i] = i;
00291   }
00292 
00293 
00294   std::vector<uint8_t> buffer(64*1024);
00295   ros::serialization::OStream stream(buffer.data(), buffer.size());
00296   ros::serialization::Serializer<std_msgs::Int16MultiArray>::write(stream, multi_array);
00297 
00298   ROSType main_type( DataType<std_msgs::Int16MultiArray>::value() );
00299 
00300   ROSTypeFlat flat_container;
00301   buildRosFlatType(type_map,
00302                    main_type,
00303                    "multi_array",
00304                    buffer.data(),
00305                    &flat_container, 100);
00306 
00307   if(VERBOSE_TEST){
00308     std::cout << " -------------------- " << std::endl;
00309 
00310     for(auto&it: flat_container.value) {
00311       std::cout << it.first << " >> " << it.second.convert<double>() << std::endl;
00312     }
00313   }
00314 
00315 }
00316 
00317 


ros_type_introspection
Author(s): Davide Faconti
autogenerated on Sun Oct 1 2017 02:54:53