DataElement_Test.cpp
Go to the documentation of this file.
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 // This test is awkward because gtest won't let me EXPECT_EQ two type_infos.
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         // start an smtcore with a random port so we don't collide with any service.
00195         smtcore.startSmtCore(true);
00196     }
00197     static void TearDownTestCase() {
00198         // Shut down the SMTcore instance we started.
00199         smtcore.shutdownSmtCore();
00200     }
00201 
00202     virtual void SetUp(){
00203         // Create an smtclient with the created smtcore port
00204         smtclient = new SMT::SMTClient("http://localhost:" + std::to_string(smtcore.getPort()) + "/");
00205     }
00206 
00207     virtual void TearDown(){
00208         // Cleanup smtclient
00209         delete smtclient;
00210         smtclient = nullptr;
00211     }
00212     
00213     SMT::SMTClient* smtclient;
00214 
00215     static SMTCoreDaemon smtcore;
00216 };
00217 // Because we actually need something for the static member to link to.
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     // Clean up after ourselves
00237     smtclient->deleteShmFile();
00238 }
00239 
00240 TEST_F(DataElementTestSMT, SetDEGetSMTValue)
00241 {
00242     // Create an SMTResource & DataElement using that resource.
00243     auto resourceInt32 = std::make_shared<SMT::Resource>( smtclient->createResource("GetSetValueInt32", "int32", 0, 0, "big", "") );
00244     DataElement dataElementInt32("int32_t", DataElement::Write, resourceInt32);
00245     // Set a value through the DataElement
00246     dataElementInt32.setValue<int32_t>(-1);
00247     // Retrieve it from SMT
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     // dataElement.setValue<float>(0);
00286     // EXPECT_THROW(dataElement.getValue<uint32_t>(), invalid_argument);
00287 }
00288 
00289 // This test is awkward because gtest won't let me EXPECT_EQ two type_infos.
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     // Clean up after ourselves
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 }


robot_instance
Author(s):
autogenerated on Sat Jun 8 2019 20:43:12