libuav original

Dependents:   UAVCAN UAVCAN_Subscriber

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers char_array_formatter.cpp Source File

char_array_formatter.cpp

00001 /*
00002  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
00003  */
00004 
00005 #include <gtest/gtest.h>
00006 #include <uavcan/marshal/char_array_formatter.hpp>
00007 
00008 using uavcan::Array;
00009 using uavcan::ArrayModeDynamic;
00010 using uavcan::ArrayModeStatic;
00011 using uavcan::IntegerSpec;
00012 using uavcan::SignednessSigned;
00013 using uavcan::SignednessUnsigned;
00014 using uavcan::CastModeSaturate;
00015 using uavcan::CastModeTruncate;
00016 using uavcan::CharArrayFormatter;
00017 
00018 TEST(CharArrayFormatter, Basic)
00019 {
00020     typedef Array<IntegerSpec<8, SignednessUnsigned, CastModeSaturate>, ArrayModeDynamic, 45> A8;
00021     A8 a;
00022 
00023     CharArrayFormatter<A8> f(a);
00024     ASSERT_STREQ("", f.getArray().c_str());
00025 
00026     f.write("Don't %s.", "Panic");
00027     ASSERT_STREQ("Don't Panic.", f.getArray().c_str());
00028 
00029     f.write(" abc%idef ", 123);
00030     ASSERT_STREQ("Don't Panic. abc123def ", f.getArray().c_str());
00031 
00032     f.write("%g", 0.0);
00033     ASSERT_STREQ("Don't Panic. abc123def 0", f.getArray().c_str());
00034 
00035     a.clear();
00036     ASSERT_STREQ("", f.getArray().c_str());
00037 
00038     f.write("123456789");
00039     ASSERT_STREQ("123456789", f.getArray().c_str());
00040 }
00041 
00042 #if !defined(UAVCAN_CPP_VERSION) || !defined(UAVCAN_CPP11)
00043 # error UAVCAN_CPP_VERSION
00044 #endif
00045 
00046 #if UAVCAN_CPP_VERSION >= UAVCAN_CPP11
00047 
00048 TEST(CharArrayFormatter, Hardcore)
00049 {
00050     typedef Array<IntegerSpec<8, SignednessUnsigned, CastModeSaturate>, ArrayModeDynamic, 150> A8;
00051     A8 a;
00052 
00053     CharArrayFormatter<A8> f(a);
00054 
00055     f.write(
00056         "%% char='%*' double='%*' long='%*' unsigned long='%*' int='%s' long double='%*' bool='%*' const char='%*' %%",
00057         '%', -12.3456, -123456789123456789L, 987654321, -123456789, 0.000000001L, true, "Don't Panic.");
00058 
00059     static const std::string Reference =
00060         "% char='%' double='-12.3456' long='-123456789123456789' unsigned long='987654321' int='-123456789' "
00061         "long double='1e-09' bool='1' const char='Don't Pani"; // few chars truncated!
00062 
00063     ASSERT_STREQ(Reference.c_str(), f.getArray().c_str());
00064 
00065     a.clear();
00066 
00067     f.write("");
00068     ASSERT_STREQ("", f.getArray().c_str());
00069 
00070     f.write("%%");                                   // Nothing to format --> "%%" is not expanded
00071     ASSERT_STREQ("%%", f.getArray().c_str());
00072 
00073     f.write("%*", "Test", 123, true);                // Extra args ignored
00074     ASSERT_STREQ("%%Test", f.getArray().c_str());
00075 
00076     f.write("%% %* %* %% %*", true);                 // Insufficient args are OK; second "%%" is not expanded
00077     ASSERT_STREQ("%%Test% 1 %* %% %*", f.getArray().c_str());
00078 }
00079 
00080 #endif