libuav original

Dependents:   UAVCAN UAVCAN_Subscriber

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers data_type.cpp Source File

data_type.cpp

00001 /*
00002  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
00003  */
00004 
00005 #include <gtest/gtest.h>
00006 #include <uavcan/data_type.hpp>
00007 
00008 
00009 TEST(DataTypeSignatureCRC, Correctness)
00010 {
00011     uavcan::DataTypeSignatureCRC crc;
00012 
00013     ASSERT_EQ(0xFFFFFFFFFFFFFFFF ^ 0xFFFFFFFFFFFFFFFF, crc.get());
00014 
00015     crc.add('1');
00016     crc.add('2');
00017     crc.add('3');
00018     crc.add(reinterpret_cast<const uint8_t*>("456789"), 6);
00019 
00020     ASSERT_EQ(0x62EC59E3F1A4F00A, crc.get());
00021 }
00022 
00023 
00024 TEST(DataTypeSignatureCRC, Extension)
00025 {
00026     uavcan::DataTypeSignatureCRC crc1;
00027 
00028     crc1.add('1');
00029     crc1.add('2');
00030     crc1.add('3');
00031 
00032     uavcan::DataTypeSignatureCRC crc2 = uavcan::DataTypeSignatureCRC::extend(crc1.get());
00033 
00034     crc2.add(reinterpret_cast<const uint8_t*>("456789"), 6);
00035 
00036     ASSERT_EQ(0x62EC59E3F1A4F00A, crc2.get());
00037 }
00038 
00039 
00040 TEST(DataTypeSignature, Correctness)
00041 {
00042     using uavcan::DataTypeSignature;
00043     using uavcan::DataTypeSignatureCRC;
00044 
00045     DataTypeSignature signature;
00046     ASSERT_EQ(0, signature.get());
00047 
00048     /*
00049      * First extension
00050      */
00051     signature.extend(DataTypeSignature(0x123456789abcdef0));
00052 
00053     DataTypeSignatureCRC crc;
00054     crc.add(0xF0);
00055     crc.add(0xDE);
00056     crc.add(0xBC);
00057     crc.add(0x9A);
00058     crc.add(0x78);
00059     crc.add(0x56);
00060     crc.add(0x34);
00061     crc.add(0x12);
00062     for (int i = 0; i < 8; i++)
00063     {
00064         crc.add(0);
00065     }
00066 
00067     ASSERT_EQ(crc.get(), signature.get());
00068 
00069     const uint64_t old_signature = signature.get();
00070 
00071     /*
00072      * Second extension
00073      */
00074     signature.extend(DataTypeSignature(0xfedcba9876543210));
00075     crc.add(0x10);
00076     crc.add(0x32);
00077     crc.add(0x54);
00078     crc.add(0x76);
00079     crc.add(0x98);
00080     crc.add(0xba);
00081     crc.add(0xdc);
00082     crc.add(0xfe);
00083     for (int i = 0; i < 64; i += 8)
00084     {
00085         crc.add((old_signature >> i) & 0xFF);
00086     }
00087 
00088     ASSERT_EQ(crc.get(), signature.get());
00089 
00090     /*
00091      * Comparison
00092      */
00093     ASSERT_TRUE(signature == DataTypeSignature(signature.get()));
00094     ASSERT_FALSE(signature == DataTypeSignature());
00095     ASSERT_FALSE(signature != DataTypeSignature(signature.get()));
00096     ASSERT_TRUE(signature != DataTypeSignature());
00097 }
00098 
00099 
00100 TEST(DataTypeDescriptor, ToString)
00101 {
00102     uavcan::DataTypeDescriptor desc;
00103     ASSERT_EQ(":65535s:0000000000000000", desc.toString());
00104 
00105     desc = uavcan::DataTypeDescriptor(uavcan::DataTypeKindMessage, 123,
00106                                       uavcan::DataTypeSignature(0xdeadbeef1234), "Bar");
00107     ASSERT_EQ("Bar:123m:0000deadbeef1234", desc.toString());
00108 
00109     // Max length - 80 chars
00110     desc = uavcan::DataTypeDescriptor(uavcan::DataTypeKindMessage, 1023, uavcan::DataTypeSignature(0xdeadbeef12345678),
00111               "sirius_cybernetics_corporation.marvin.model_a.LongDataTypeName123456789abcdefghi");
00112     ASSERT_EQ("sirius_cybernetics_corporation.marvin.model_a.LongDataTypeName123456789abcdefghi:1023m:deadbeef12345678",
00113               desc.toString());
00114 }
00115 
00116 
00117 TEST(DataTypeDescriptor, Match)
00118 {
00119     uavcan::DataTypeDescriptor desc(uavcan::DataTypeKindMessage, 123,
00120                                     uavcan::DataTypeSignature(0xdeadbeef1234), "namespace.TypeName");
00121     ASSERT_TRUE(desc.match(uavcan::DataTypeKindMessage, "namespace.TypeName"));
00122     ASSERT_FALSE(desc.match(uavcan::DataTypeKindMessage, "boo"));
00123     ASSERT_FALSE(desc.match(uavcan::DataTypeKindService, "namespace.TypeName"));
00124 }
00125 
00126 
00127 TEST(DataTypeID, Basic)
00128 {
00129     uavcan::DataTypeID id;
00130 
00131     ASSERT_EQ(0xFFFF, id.get());
00132     ASSERT_FALSE(id.isValidForDataTypeKind(uavcan::DataTypeKindMessage));
00133     ASSERT_FALSE(id.isValidForDataTypeKind(uavcan::DataTypeKindService));
00134 
00135     id = 123;
00136     uavcan::DataTypeID id2 = 255;
00137 
00138     ASSERT_EQ(123, id.get());
00139     ASSERT_EQ(255, id2.get());
00140 
00141     ASSERT_TRUE(id.isValidForDataTypeKind(uavcan::DataTypeKindMessage));
00142     ASSERT_TRUE(id.isValidForDataTypeKind(uavcan::DataTypeKindService));
00143     ASSERT_TRUE(id2.isValidForDataTypeKind(uavcan::DataTypeKindMessage));
00144     ASSERT_TRUE(id2.isValidForDataTypeKind(uavcan::DataTypeKindService));
00145 
00146     ASSERT_TRUE(id < id2);
00147     ASSERT_TRUE(id <= id2);
00148     ASSERT_TRUE(id2 > id);
00149     ASSERT_TRUE(id2 >= id);
00150     ASSERT_TRUE(id != id2);
00151 
00152     id = id2;
00153     ASSERT_FALSE(id < id2);
00154     ASSERT_TRUE(id <= id2);
00155     ASSERT_FALSE(id2 > id);
00156     ASSERT_TRUE(id2 >= id);
00157     ASSERT_TRUE(id == id2);
00158 
00159     id = 1024;
00160     ASSERT_TRUE(id.isValidForDataTypeKind(uavcan::DataTypeKindMessage));
00161     ASSERT_FALSE(id.isValidForDataTypeKind(uavcan::DataTypeKindService));
00162 }