mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-06-25 22:15:23 +02:00
139 lines
9.6 KiB
C++
139 lines
9.6 KiB
C++
#include <msgpack.hpp>
|
|
|
|
#if defined(__GNUC__)
|
|
#pragma GCC diagnostic push
|
|
#pragma GCC diagnostic ignored "-Wconversion"
|
|
#endif //defined(__GNUC__)
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#if defined(__GNUC__)
|
|
#pragma GCC diagnostic pop
|
|
#endif //defined(__GNUC__)
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
// To avoid link error
|
|
TEST(MSGPACK_CPP20, dummy)
|
|
{
|
|
}
|
|
|
|
#if !defined(MSGPACK_USE_CPP03) && __cplusplus > 201703
|
|
|
|
#if MSGPACK_HAS_INCLUDE(<span>)
|
|
|
|
template <typename Byte>
|
|
bool operator==(const std::span<const Byte>& lhs, const std::span<const Byte>& rhs)
|
|
{
|
|
if (lhs.size() != rhs.size())
|
|
return false;
|
|
for (std::size_t i = 0; i < lhs.size(); ++i)
|
|
if (lhs[i] != rhs[i])
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
template <typename Byte>
|
|
bool operator==(const std::span<const Byte>& lhs, const std::vector<Byte>& rhs)
|
|
{
|
|
return lhs == std::span<const Byte>{rhs.data(), rhs.size()};
|
|
}
|
|
|
|
template <typename Byte>
|
|
bool operator==(const std::vector<Byte>& lhs, const std::span<const Byte>& rhs)
|
|
{
|
|
return std::span<const Byte>{lhs.data(), lhs.size()} == rhs;
|
|
}
|
|
|
|
#define MSGPACK_TEST_SPAN_BYTE_PACK_CONVERT(byte_t, display_name) \
|
|
TEST(MSGPACK_CPP20, span_##display_name##_pack_convert) \
|
|
{ \
|
|
std::stringstream ss; \
|
|
byte_t raw_data[] = { \
|
|
(byte_t)(0x01), (byte_t)(0x02), (byte_t)(0x7f), (byte_t)(0x80), (byte_t)(0xff) \
|
|
}; \
|
|
std::span<const byte_t> val1{raw_data, sizeof(raw_data)}; \
|
|
\
|
|
msgpack::pack(ss, val1); \
|
|
std::string const& str = ss.str(); \
|
|
\
|
|
char packed[] = { char(0xc4), char(0x05), char(0x01), char(0x02), char(0x7f), char(0x80), char(0xff) }; \
|
|
EXPECT_EQ(str.size(), sizeof(packed)); \
|
|
for (size_t i = 0; i != sizeof(packed); ++i) { \
|
|
EXPECT_EQ(str[i], packed[i]); \
|
|
} \
|
|
\
|
|
msgpack::object_handle oh; \
|
|
msgpack::unpack(oh, str.data(), str.size()); \
|
|
{ \
|
|
auto val2 = oh.get().as<std::vector<byte_t>>(); \
|
|
EXPECT_TRUE(val1 == val2); \
|
|
} \
|
|
{ \
|
|
auto val2 = oh.get().as<std::span<const byte_t>>(); \
|
|
EXPECT_TRUE(val1 == val2); \
|
|
} \
|
|
} \
|
|
|
|
#define MSGPACK_TEST_SPAN_BYTE_OBJECT(byte_t, display_name) \
|
|
TEST(MSGPACK_CPP20, span_##display_name##_object) \
|
|
{ \
|
|
byte_t raw_data[] = { \
|
|
(byte_t)(0x01), (byte_t)(0x02), (byte_t)(0x7f), (byte_t)(0x80), (byte_t)(0xff) \
|
|
}; \
|
|
std::span<const byte_t> val1{raw_data, sizeof(raw_data)}; \
|
|
\
|
|
/* Caller needs to manage val1's lifetime. The Data is not copied. */ \
|
|
msgpack::object obj(val1); \
|
|
\
|
|
{ \
|
|
auto val2 = obj.as<std::vector<byte_t>>(); \
|
|
EXPECT_TRUE(val1 == val2); \
|
|
} \
|
|
{ \
|
|
auto val2 = obj.as<std::span<const byte_t>>(); \
|
|
EXPECT_TRUE(val1 == val2); \
|
|
} \
|
|
} \
|
|
|
|
#define MSGPACK_TEST_SPAN_BYTE_OBJECT_WITH_ZONE(byte_t, display_name) \
|
|
TEST(MSGPACK_CPP20, span_##display_name##_object_with_zone) \
|
|
{ \
|
|
msgpack::zone z; \
|
|
byte_t raw_data[] = { \
|
|
(byte_t)(0x01), (byte_t)(0x02), (byte_t)(0x7f), (byte_t)(0x80), (byte_t)(0xff) \
|
|
}; \
|
|
std::span<const byte_t> val1(raw_data, sizeof(raw_data)); \
|
|
\
|
|
msgpack::object obj(val1, z); \
|
|
\
|
|
{ \
|
|
auto val2 = obj.as<std::vector<byte_t>>(); \
|
|
EXPECT_TRUE(val1 == val2); \
|
|
} \
|
|
{ \
|
|
auto val2 = obj.as<std::span<const byte_t>>(); \
|
|
EXPECT_TRUE(val1 == val2); \
|
|
} \
|
|
} \
|
|
|
|
#define MSGPACK_TEST_SPAN_BYTE(byte_t, display_name) \
|
|
MSGPACK_TEST_SPAN_BYTE_PACK_CONVERT(byte_t, display_name) \
|
|
MSGPACK_TEST_SPAN_BYTE_OBJECT(byte_t, display_name) \
|
|
MSGPACK_TEST_SPAN_BYTE_OBJECT_WITH_ZONE(byte_t, display_name) \
|
|
|
|
MSGPACK_TEST_SPAN_BYTE(std::byte, byte)
|
|
MSGPACK_TEST_SPAN_BYTE(char, char)
|
|
MSGPACK_TEST_SPAN_BYTE(unsigned char, unsigned_char)
|
|
|
|
#undef MSGPACK_TEST_SPAN_BYTE
|
|
#undef MSGPACK_TEST_SPAN_BYTE_OBJECT_WITH_ZONE
|
|
#undef MSGPACK_TEST_SPAN_BYTE_OBJECT
|
|
#undef MSGPACK_TEST_SPAN_BYTE_PACK_CONVERT
|
|
|
|
#endif // MSGPACK_HAS_INCLUDE(<span>)
|
|
|
|
#endif // !defined(MSGPACK_USE_CPP03) && __cplusplus > 201703
|