123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485 |
- #include <msgpack.hpp>
- #include <gtest/gtest.h>
- #include <sstream>
- // To avoid link error
- TEST(visitor, dummy)
- {
- }
- #if MSGPACK_DEFAULT_API_VERSION >= 2
- struct json_like_visitor : msgpack::null_visitor {
- json_like_visitor(std::string& s):m_s(s) {}
- bool visit_nil() {
- m_s += "null";
- return true;
- }
- bool visit_boolean(bool v) {
- if (v) m_s += "true";
- else m_s += "false";
- return true;
- }
- bool visit_positive_integer(uint64_t v) {
- std::stringstream ss;
- ss << v;
- m_s += ss.str();
- return true;
- }
- bool visit_negative_integer(int64_t v) {
- std::stringstream ss;
- ss << v;
- m_s += ss.str();
- return true;
- }
- bool visit_str(const char* v, uint32_t size) {
- // I omit escape process.
- m_s += '"' + std::string(v, size) + '"';
- return true;
- }
- bool start_array(uint32_t /*num_elements*/) {
- m_s += "[";
- return true;
- }
- bool end_array_item() {
- m_s += ",";
- return true;
- }
- bool end_array() {
- m_s.erase(m_s.size() - 1, 1); // remove the last ','
- m_s += "]";
- return true;
- }
- bool start_map(uint32_t /*num_kv_pairs*/) {
- m_s += "{";
- return true;
- }
- bool end_map_key() {
- m_s += ":";
- return true;
- }
- bool end_map_value() {
- m_s += ",";
- return true;
- }
- bool end_map() {
- m_s.erase(m_s.size() - 1, 1); // remove the last ','
- m_s += "}";
- return true;
- }
- void parse_error(size_t /*parsed_offset*/, size_t /*error_offset*/) {
- EXPECT_TRUE(false);
- }
- void insufficient_bytes(size_t /*parsed_offset*/, size_t /*error_offset*/) {
- EXPECT_TRUE(false);
- }
- std::string& m_s;
- };
- TEST(visitor, json_like)
- {
- std::stringstream ss;
- msgpack::packer<std::stringstream> p(ss);
- p.pack_map(1);
- p.pack("key");
- p.pack_array(3);
- p.pack(42);
- p.pack_nil();
- p.pack(true);
- std::string json_like;
- json_like_visitor v(json_like);
- std::size_t off = 0;
- bool ret = msgpack::parse(ss.str().data(), ss.str().size(), off, v);
- EXPECT_TRUE(ret);
- EXPECT_EQ("{\"key\":[42,null,true]}", json_like);
- }
- struct parse_error_check_visitor : msgpack::null_visitor {
- parse_error_check_visitor(bool& called):m_called(called) {}
- void parse_error(size_t parsed_offset, size_t error_offset) {
- EXPECT_EQ(static_cast<size_t>(1), parsed_offset);
- EXPECT_EQ(static_cast<size_t>(2), error_offset);
- m_called = true;
- }
- bool& m_called;
- };
- TEST(visitor, parse_error)
- {
- bool called = false;
- parse_error_check_visitor v(called);
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x93u), 0x01u, static_cast<char>(0xc1u), 0x03u };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- EXPECT_TRUE(called);
- #if MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(0u, off);
- #else // MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(2u, off);
- #endif // MSGPACK_DEFAULT_API_VERSION < 3
- }
- struct insuf_bytes_check_visitor : msgpack::null_visitor {
- insuf_bytes_check_visitor(bool& called):m_called(called) {}
- void insufficient_bytes(size_t parsed_offset, size_t error_offset) {
- EXPECT_EQ(static_cast<size_t>(2), parsed_offset);
- EXPECT_EQ(static_cast<size_t>(3), error_offset);
- m_called = true;
- }
- bool& m_called;
- };
- TEST(visitor, insuf_bytes)
- {
- bool called = false;
- insuf_bytes_check_visitor v(called);
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x93u), 0x01u, 0x01u };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- EXPECT_TRUE(called);
- // Even if MSGPACK_DEFAULT_API_VERSION is 2, then off is updated
- // in the case of insufficient bytes.
- EXPECT_EQ(3u, off);
- }
- struct return_false_array_val_visitor : msgpack::null_visitor {
- return_false_array_val_visitor(std::size_t& times):m_times(times) {}
- bool visit_positive_integer(uint64_t) {
- if (++m_times == 2) return false;
- return true;
- }
- std::size_t& m_times;
- };
- TEST(visitor, return_false_array_val)
- {
- std::size_t times = 0;
- return_false_array_val_visitor v(times);
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x93u), 0x01u, 0x02u, 0x03u };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- EXPECT_EQ(2u, times);
- #if MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(0u, off);
- #else // MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(2u, off);
- #endif // MSGPACK_DEFAULT_API_VERSION < 3
- }
- struct return_false_start_array_item_visitor : msgpack::null_visitor {
- return_false_start_array_item_visitor(std::size_t& times):m_times(times) {}
- bool start_array_item() {
- if (++m_times == 2) return false;
- return true;
- }
- std::size_t& m_times;
- };
- TEST(visitor, return_false_start_array_item)
- {
- std::size_t times = 0;
- return_false_start_array_item_visitor v(times);
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x93u), 0x01u, 0x02u, 0x03u };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- EXPECT_EQ(2u, times);
- #if MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(0u, off);
- #else // MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(2u, off);
- #endif // MSGPACK_DEFAULT_API_VERSION < 3
- }
- struct return_false_end_array_item_visitor : msgpack::null_visitor {
- return_false_end_array_item_visitor(std::size_t& times):m_times(times) {}
- bool end_array_item() {
- if (++m_times == 2) return false;
- return true;
- }
- std::size_t& m_times;
- };
- TEST(visitor, return_false_end_array_item)
- {
- std::size_t times = 0;
- return_false_end_array_item_visitor v(times);
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x93u), 0x01u, 0x02u, 0x03u };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- EXPECT_EQ(2u, times);
- #if MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(0u, off);
- #else // MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(2u, off);
- #endif // MSGPACK_DEFAULT_API_VERSION < 3
- }
- struct return_false_start_array_visitor : msgpack::null_visitor {
- bool start_array(uint32_t) {
- return false;
- }
- };
- TEST(visitor, return_false_start_array)
- {
- return_false_start_array_visitor v;
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x93u), 0x01u, 0x02u, 0x03u };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- EXPECT_EQ(0u, off);
- }
- struct return_false_start_array0_visitor : msgpack::null_visitor {
- bool start_array(uint32_t) {
- return false;
- }
- };
- TEST(visitor, return_false_start_array0)
- {
- return_false_start_array0_visitor v;
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x90u) };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- EXPECT_EQ(0u, off);
- }
- struct return_false_end_array_visitor : msgpack::null_visitor {
- bool end_array() {
- return false;
- }
- };
- TEST(visitor, return_false_end_array)
- {
- return_false_end_array_visitor v;
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x93u), 0x01u, 0x02u, 0x03u };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- #if MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(0u, off);
- #else // MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(3u, off);
- #endif // MSGPACK_DEFAULT_API_VERSION < 3
- }
- struct return_false_end_array0_visitor : msgpack::null_visitor {
- bool end_array() {
- return false;
- }
- };
- TEST(visitor, return_false_end_array0)
- {
- return_false_end_array0_visitor v;
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x90u) };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- EXPECT_EQ(0u, off);
- }
- struct return_false_map_val_visitor : msgpack::null_visitor {
- return_false_map_val_visitor(std::size_t& times):m_times(times) {}
- bool visit_positive_integer(uint64_t) {
- if (++m_times == 2) return false;
- return true;
- }
- std::size_t& m_times;
- };
- TEST(visitor, return_false_map_val)
- {
- std::size_t times = 0;
- return_false_map_val_visitor v(times);
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x83u), 0x01u, 0x02u, 0x03u, 0x01u, 0x02u, 0x03u };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- EXPECT_EQ(2u, times);
- #if MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(0u, off);
- #else // MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(2u, off);
- #endif // MSGPACK_DEFAULT_API_VERSION < 3
- }
- struct return_false_start_map_key_visitor : msgpack::null_visitor {
- return_false_start_map_key_visitor(std::size_t& times):m_times(times) {}
- bool start_map_key() {
- if (++m_times == 2) return false;
- return true;
- }
- std::size_t& m_times;
- };
- TEST(visitor, return_false_start_map_key)
- {
- std::size_t times = 0;
- return_false_start_map_key_visitor v(times);
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x83u), 0x01u, 0x02u, 0x03u, 0x01u, 0x02u, 0x03u };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- EXPECT_EQ(2u, times);
- #if MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(0u, off);
- #else // MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(3u, off);
- #endif // MSGPACK_DEFAULT_API_VERSION < 3
- }
- struct return_false_end_map_key_visitor : msgpack::null_visitor {
- return_false_end_map_key_visitor(std::size_t& times):m_times(times) {}
- bool end_map_key() {
- if (++m_times == 2) return false;
- return true;
- }
- std::size_t& m_times;
- };
- TEST(visitor, return_false_end_map_key)
- {
- std::size_t times = 0;
- return_false_end_map_key_visitor v(times);
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x83u), 0x01u, 0x02u, 0x03u, 0x01u, 0x02u, 0x03u };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- EXPECT_EQ(2u, times);
- #if MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(0u, off);
- #else // MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(3u, off);
- #endif // MSGPACK_DEFAULT_API_VERSION < 3
- }
- struct return_false_start_map_value_visitor : msgpack::null_visitor {
- return_false_start_map_value_visitor(std::size_t& times):m_times(times) {}
- bool start_map_value() {
- if (++m_times == 2) return false;
- return true;
- }
- std::size_t& m_times;
- };
- TEST(visitor, return_false_start_map_value)
- {
- std::size_t times = 0;
- return_false_start_map_value_visitor v(times);
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x83u), 0x01u, 0x02u, 0x03u, 0x01u, 0x02u, 0x03u };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- EXPECT_EQ(2u, times);
- #if MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(0u, off);
- #else // MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(4u, off);
- #endif // MSGPACK_DEFAULT_API_VERSION < 3
- }
- struct return_false_end_map_value_visitor : msgpack::null_visitor {
- return_false_end_map_value_visitor(std::size_t& times):m_times(times) {}
- bool end_map_value() {
- if (++m_times == 2) return false;
- return true;
- }
- std::size_t& m_times;
- };
- TEST(visitor, return_false_end_map_value)
- {
- std::size_t times = 0;
- return_false_end_map_value_visitor v(times);
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x83u), 0x01u, 0x02u, 0x03u, 0x01u, 0x02u, 0x03u };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- EXPECT_EQ(2u, times);
- #if MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(0u, off);
- #else // MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(4u, off);
- #endif // MSGPACK_DEFAULT_API_VERSION < 3
- }
- struct return_false_start_map_visitor : msgpack::null_visitor {
- bool start_map(uint32_t) {
- return false;
- }
- };
- TEST(visitor, return_false_start_map)
- {
- return_false_start_map_visitor v;
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x83u), 0x01u, 0x02u, 0x03u, 0x01u, 0x02u, 0x03u };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- EXPECT_EQ(0u, off);
- }
- struct return_false_start_map0_visitor : msgpack::null_visitor {
- bool start_map(uint32_t) {
- return false;
- }
- };
- TEST(visitor, return_false_start_map0)
- {
- return_false_start_map0_visitor v;
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x80u) };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- EXPECT_EQ(0u, off);
- }
- struct return_false_end_map_visitor : msgpack::null_visitor {
- bool end_map() {
- return false;
- }
- };
- TEST(visitor, return_false_end_map)
- {
- return_false_end_map_visitor v;
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x83u), 0x01u, 0x02u, 0x03u, 0x01u, 0x02u, 0x03u };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- #if MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(0u, off);
- #else // MSGPACK_DEFAULT_API_VERSION < 3
- EXPECT_EQ(6u, off);
- #endif // MSGPACK_DEFAULT_API_VERSION < 3
- }
- struct return_false_end_map0_visitor : msgpack::null_visitor {
- bool end_map() {
- return false;
- }
- };
- TEST(visitor, return_false_end_map0)
- {
- return_false_end_map0_visitor v;
- std::size_t off = 0;
- char const data[] = { static_cast<char>(0x80u) };
- bool ret = msgpack::parse(data, sizeof(data), off, v);
- EXPECT_FALSE(ret);
- EXPECT_EQ(0u, off);
- }
- #endif // MSGPACK_DEFAULT_API_VERSION >= 1
|