00001 #include <iostream>
00002 #include <gtest/gtest.h>
00003 #include "robot_instance/DataElement.h"
00004 #include "shared_memory_transport/smtcore_daemon.hpp"
00005 #include "shared_memory_transport/smtclient.hpp"
00006
00007 using namespace std;
00008
00009 TEST(DataElementTest, Constructors)
00010 {
00011 DataElement dataElement;
00012 ASSERT_EQ((uint32_t)0, dataElement.getValue<uint32_t>());
00013 ASSERT_EQ(DataElement::Read, dataElement.getReadWrite());
00014
00015 DataElement dataElementFloatWrite("float", DataElement::Write);
00016 ASSERT_EQ((float)0, dataElementFloatWrite.getValue<float>());
00017 ASSERT_EQ(DataElement::Write, dataElementFloatWrite.getReadWrite());
00018 }
00019
00020 TEST(DataElementTest, GetSetReadWrite)
00021 {
00022 DataElement dataElement;
00023
00024 dataElement.setReadWrite(DataElement::Write);
00025 EXPECT_EQ(DataElement::Write, dataElement.getReadWrite());
00026
00027 dataElement.setReadWrite(DataElement::Read);
00028 EXPECT_EQ(DataElement::Read, dataElement.getReadWrite());
00029 }
00030
00031 TEST(DataElementTest, GetSetValue)
00032 {
00033 DataElement dataElement;
00034
00035 dataElement.setValue<bool>(true);
00036 EXPECT_EQ(true, dataElement.getValue<bool>());
00037
00038 dataElement.setValue<int32_t>(-1);
00039 EXPECT_EQ((int32_t) - 1, dataElement.getValue<int32_t>());
00040
00041 dataElement.setValue<int16_t>(-1);
00042 EXPECT_EQ((int16_t) - 1, dataElement.getValue<int16_t>());
00043
00044 dataElement.setValue<int16_t>((int16_t) - 65536);
00045 EXPECT_EQ((int16_t)0, dataElement.getValue<int16_t>());
00046
00047 dataElement.setValue<uint32_t>(-1);
00048 EXPECT_EQ((uint32_t) - 1, dataElement.getValue<uint32_t>());
00049
00050 dataElement.setValue<uint16_t>((uint16_t)65536);
00051 EXPECT_EQ((uint16_t)0, dataElement.getValue<uint16_t>());
00052
00053 dataElement.setValue<float>(3.1415);
00054 EXPECT_EQ((float)3.1415, dataElement.getValue<float>());
00055
00056 dataElement.setValue<float>(0);
00057 EXPECT_THROW(dataElement.getValue<uint32_t>(), invalid_argument);
00058 }
00059
00060
00061 TEST(DataElementTest, GetType)
00062 {
00063 DataElement dataElement;
00064 bool isCorrectType;
00065
00066 if (typeid(uint32_t) == *dataElement.getType())
00067 {
00068 isCorrectType = true;
00069 }
00070 else
00071 {
00072 isCorrectType = false;
00073 }
00074
00075 EXPECT_TRUE(isCorrectType);
00076
00077 dataElement.setValue<int32_t>(-2);
00078
00079 if (typeid(int32_t) == *dataElement.getType())
00080 {
00081 isCorrectType = true;
00082 }
00083 else
00084 {
00085 isCorrectType = false;
00086 }
00087
00088 EXPECT_TRUE(isCorrectType);
00089
00090 dataElement.setValue<bool>(true);
00091
00092 if (typeid(bool) == *dataElement.getType())
00093 {
00094 isCorrectType = true;
00095 }
00096 else
00097 {
00098 isCorrectType = false;
00099 }
00100
00101 EXPECT_TRUE(isCorrectType);
00102
00103 dataElement.setValue<float>(1.112);
00104
00105 if (typeid(float) == *dataElement.getType())
00106 {
00107 isCorrectType = true;
00108 }
00109 else
00110 {
00111 isCorrectType = false;
00112 }
00113
00114 EXPECT_TRUE(isCorrectType);
00115 }
00116
00117 TEST(DataElementTest, GetSize)
00118 {
00119 DataElement dataElementBool ("bool", DataElement::Read);
00120 DataElement dataElementUInt16("uint16_t", DataElement::Read);
00121 DataElement dataElementInt16 ("int16_t", DataElement::Read);
00122 DataElement dataElementUInt32("uint32_t", DataElement::Read);
00123 DataElement dataElementInt32 ("int32_t", DataElement::Read);
00124 DataElement dataElementFloat ("float", DataElement::Read);
00125
00126 EXPECT_EQ(DataElement::EightBit, dataElementBool.getSize());
00127 EXPECT_EQ(DataElement::SixteenBit, dataElementUInt16.getSize());
00128 EXPECT_EQ(DataElement::SixteenBit, dataElementInt16.getSize());
00129 EXPECT_EQ(DataElement::ThirtyTwoBit, dataElementUInt32.getSize());
00130 EXPECT_EQ(DataElement::ThirtyTwoBit, dataElementInt32.getSize());
00131 EXPECT_EQ(DataElement::ThirtyTwoBit, dataElementFloat.getSize());
00132 }
00133
00134 TEST(DataElementTest, ToString)
00135 {
00136 DataElement dataElement;
00137 std::string s;
00138
00139 s.append("DataElement:\n");
00140 s.append(" Value: 0\n");
00141 s.append(" Type: j\n");
00142 s.append(" Size: 32\n");
00143 s.append(" Read/Write: Read");
00144 EXPECT_EQ(s, dataElement.toString());
00145
00146 DataElement dataElement2("float", DataElement::Write);
00147 dataElement2.setValue<float>(-1.123);
00148 s.clear();
00149 s.append("DataElement:\n");
00150 s.append(" Value: -1.123\n");
00151 s.append(" Type: f\n");
00152 s.append(" Size: 32\n");
00153 s.append(" Read/Write: Write");
00154 EXPECT_EQ(s, dataElement2.toString());
00155
00156 DataElement dataElement3("int16_t", DataElement::Write);
00157 dataElement3.setValue<int16_t>(-1);
00158 s.clear();
00159 s.append("DataElement:\n");
00160 s.append(" Value: -1\n");
00161 s.append(" Type: s\n");
00162 s.append(" Size: 16\n");
00163 s.append(" Read/Write: Write");
00164 EXPECT_EQ(s, dataElement3.toString());
00165
00166 DataElement dataElement4("uint16_t", DataElement::Write);
00167 dataElement4.setValue<uint16_t>(2);
00168 s.clear();
00169 s.append("DataElement:\n");
00170 s.append(" Value: 2\n");
00171 s.append(" Type: t\n");
00172 s.append(" Size: 16\n");
00173 s.append(" Read/Write: Write");
00174 EXPECT_EQ(s, dataElement4.toString());
00175
00176 DataElement dataElement5("bool", DataElement::Write);
00177 dataElement5.setValue<bool>(true);
00178 s.clear();
00179 s.append("DataElement:\n");
00180 s.append(" Value: 1\n");
00181 s.append(" Type: b\n");
00182 s.append(" Size: 8\n");
00183 s.append(" Read/Write: Write");
00184 EXPECT_EQ(s, dataElement5.toString());
00185 }
00186
00190 class DataElementTestSMT : public ::testing::Test
00191 {
00192 protected:
00193 static void SetUpTestCase() {
00194
00195 smtcore.startSmtCore(true);
00196 }
00197 static void TearDownTestCase() {
00198
00199 smtcore.shutdownSmtCore();
00200 }
00201
00202 virtual void SetUp(){
00203
00204 smtclient = new SMT::SMTClient("http://localhost:" + std::to_string(smtcore.getPort()) + "/");
00205 }
00206
00207 virtual void TearDown(){
00208
00209 delete smtclient;
00210 smtclient = nullptr;
00211 }
00212
00213 SMT::SMTClient* smtclient;
00214
00215 static SMTCoreDaemon smtcore;
00216 };
00217
00218 SMTCoreDaemon DataElementTestSMT::smtcore;
00219
00220 TEST_F(DataElementTestSMT, Constructors)
00221 {
00222 auto resource = std::make_shared<SMT::Resource>( smtclient->createResource("ConstructorsTest", "uint32", 0, 0, "big", "") );
00223 DataElement dataElement("uint32_t", DataElement::Read, resource);
00224 ASSERT_EQ((uint32_t)0, dataElement.getValue<uint32_t>());
00225 ASSERT_EQ(DataElement::Read, dataElement.getReadWrite());
00226 EXPECT_NE(nullptr, dataElement.smtResource);
00227 smtclient->destroyResource("ConstructorsTest");
00228
00229 resource = std::make_shared<SMT::Resource>( smtclient->createResource("ConstructorsTestFloat", "float32", 0, 0, "big", "") );
00230 DataElement dataElementFloatWrite("float", DataElement::Write, resource);
00231 ASSERT_EQ((float)0, dataElementFloatWrite.getValue<float>());
00232 ASSERT_EQ(DataElement::Write, dataElementFloatWrite.getReadWrite());
00233 EXPECT_NE(nullptr, dataElement.smtResource);
00234 smtclient->destroyResource("ConstructorsTestFloat");
00235
00236
00237 smtclient->deleteShmFile();
00238 }
00239
00240 TEST_F(DataElementTestSMT, SetDEGetSMTValue)
00241 {
00242
00243 auto resourceInt32 = std::make_shared<SMT::Resource>( smtclient->createResource("GetSetValueInt32", "int32", 0, 0, "big", "") );
00244 DataElement dataElementInt32("int32_t", DataElement::Write, resourceInt32);
00245
00246 dataElementInt32.setValue<int32_t>(-1);
00247
00248 EXPECT_EQ((int32_t) - 1, resourceInt32->get<int32_t>());
00249 dataElementInt32.setValue<int32_t>(12);
00250 EXPECT_EQ((int32_t) 12, resourceInt32->get<int32_t>());
00251
00252 auto resourceInt16 = std::make_shared<SMT::Resource>( smtclient->createResource("GetSetValueInt16", "int16", 0, 0, "big", "") );
00253 DataElement dataElementInt16("int16_t", DataElement::Write, resourceInt16);
00254 dataElementInt16.setValue<int16_t>(-1);
00255 EXPECT_EQ((int16_t) - 1, resourceInt16->get<int16_t>());
00256 dataElementInt16.setValue<int16_t>(12);
00257 EXPECT_EQ((int16_t) 12, resourceInt16->get<int16_t>());
00258
00259 auto resourceUInt32 = std::make_shared<SMT::Resource>( smtclient->createResource("GetSetValueUInt32", "uint32", 0, 0, "big", "") );
00260 DataElement dataElementUInt32("uint32_t", DataElement::Write, resourceUInt32);
00261 dataElementUInt32.setValue<uint32_t>(-1);
00262 EXPECT_EQ((uint32_t) - 1, resourceUInt32->get<uint32_t>());
00263 dataElementUInt32.setValue<uint32_t>(12);
00264 EXPECT_EQ((uint32_t) 12, resourceUInt32->get<uint32_t>());
00265
00266 auto resourceUInt16 = std::make_shared<SMT::Resource>( smtclient->createResource("GetSetValueUInt16", "uint16", 0, 0, "big", "") );
00267 DataElement dataElementUInt16("uint16_t", DataElement::Write, resourceUInt16);
00268 dataElementUInt16.setValue<uint16_t>(-1);
00269 EXPECT_EQ((uint16_t) - 1, resourceUInt16->get<uint16_t>());
00270 dataElementUInt16.setValue<uint16_t>(12);
00271 EXPECT_EQ((uint16_t) 12, resourceUInt16->get<uint16_t>());
00272
00273 auto resourceFloat32 = std::make_shared<SMT::Resource>( smtclient->createResource("GetSetValueFloat32", "float32", 0, 0, "big", "") );
00274 DataElement dataElementFloat32("float", DataElement::Write, resourceFloat32);
00275 dataElementFloat32.setValue<float>((float) 3.1415);
00276 EXPECT_FLOAT_EQ((float) 3.1415, resourceFloat32->get<float>());
00277
00278 auto resourceBool = std::make_shared<SMT::Resource>( smtclient->createResource("GetSetValueBool", "uint8", 0, 0, "big", "") );
00279 DataElement dataElement("bool", DataElement::Write, resourceBool);
00280 dataElement.setValue<bool>(true);
00281 EXPECT_EQ(true, resourceBool->get<bool>());
00282 dataElement.setValue<bool>(false);
00283 EXPECT_EQ(false, resourceBool->get<bool>());
00284
00285
00286
00287 }
00288
00289
00290 TEST_F(DataElementTestSMT, GetType)
00291 {
00292 auto resource = std::make_shared<SMT::Resource>( smtclient->createResource("GetTypeTest", "uint32", 0, 0, "big", "") );
00293 DataElement dataElement("uint32_t", DataElement::Write, resource);
00294 bool isCorrectType;
00295
00296 if (typeid(uint32_t) == *dataElement.getType())
00297 {
00298 isCorrectType = true;
00299 }
00300 else
00301 {
00302 isCorrectType = false;
00303 }
00304
00305 EXPECT_TRUE(isCorrectType);
00306
00307 dataElement.setValue<int32_t>(-2);
00308
00309 if (typeid(int32_t) == *dataElement.getType())
00310 {
00311 isCorrectType = true;
00312 }
00313 else
00314 {
00315 isCorrectType = false;
00316 }
00317
00318 EXPECT_TRUE(isCorrectType);
00319
00320 dataElement.setValue<bool>(true);
00321
00322 if (typeid(bool) == *dataElement.getType())
00323 {
00324 isCorrectType = true;
00325 }
00326 else
00327 {
00328 isCorrectType = false;
00329 }
00330
00331 EXPECT_TRUE(isCorrectType);
00332
00333 dataElement.setValue<float>(1.112);
00334
00335 if (typeid(float) == *dataElement.getType())
00336 {
00337 isCorrectType = true;
00338 }
00339 else
00340 {
00341 isCorrectType = false;
00342 }
00343
00344 EXPECT_TRUE(isCorrectType);
00345
00346 smtclient->destroyResource("GetTypeTest");
00347
00348 smtclient->deleteShmFile();
00349 }
00350
00351
00352 int main(int argc, char** argv)
00353 {
00354 testing::InitGoogleTest(&argc, argv);
00355 return RUN_ALL_TESTS();
00356 }