#include <msgpack.hpp>

#include <string>
#include <sstream>

#include <gtest/gtest.h>

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

TEST(MSGPACK_RAW_REF, pack_unpack)
{
    std::string s = "ABC";

    msgpack::type::raw_ref rr1(s.data(), s.size());
    std::stringstream ss;
    msgpack::pack(ss, rr1);
    std::string packed_str = ss.str();
    EXPECT_EQ(packed_str[0], static_cast<char>(0xc4u));
    EXPECT_EQ(packed_str[1], static_cast<char>(0x03u));
    EXPECT_EQ(packed_str[2], 'A');
    EXPECT_EQ(packed_str[3], 'B');
    EXPECT_EQ(packed_str[4], 'C');

    msgpack::unpacked upd;
    msgpack::unpack(upd, ss.str().data(), ss.str().size());
    msgpack::type::raw_ref rr2 = upd.get().as<msgpack::type::raw_ref>();
    EXPECT_TRUE(rr1 == rr2);
}

TEST(MSGPACK_RAW_REF, pack_unpack_8_l)
{
    std::string s;

    msgpack::type::raw_ref rr1(s.data(), s.size());
    std::stringstream ss;
    msgpack::pack(ss, rr1);
    std::string packed_str = ss.str();
    EXPECT_EQ(packed_str[0], static_cast<char>(0xc4u));
    EXPECT_EQ(packed_str[1], static_cast<char>(0x00u));

    msgpack::unpacked upd;
    msgpack::unpack(upd, ss.str().data(), ss.str().size());
    msgpack::type::raw_ref rr2 = upd.get().as<msgpack::type::raw_ref>();
    EXPECT_TRUE(rr1 == rr2);
}

TEST(MSGPACK_RAW_REF, pack_unpack_8_h)
{
    std::string s(0xff, 'A');

    msgpack::type::raw_ref rr1(s.data(), s.size());
    std::stringstream ss;
    msgpack::pack(ss, rr1);
    std::string packed_str = ss.str();
    EXPECT_EQ(packed_str[0], static_cast<char>(0xc4u));
    EXPECT_EQ(packed_str[1], static_cast<char>(0xffu));
    EXPECT_EQ(packed_str[2], 'A');

    msgpack::unpacked upd;
    msgpack::unpack(upd, ss.str().data(), ss.str().size());
    msgpack::type::raw_ref rr2 = upd.get().as<msgpack::type::raw_ref>();
    EXPECT_TRUE(rr1 == rr2);
}

TEST(MSGPACK_RAW_REF, pack_unpack_16_l)
{
    std::string s(0xff+1, 'A');

    msgpack::type::raw_ref rr1(s.data(), s.size());
    std::stringstream ss;
    msgpack::pack(ss, rr1);
    std::string packed_str = ss.str();
    EXPECT_EQ(packed_str[0], static_cast<char>(0xc5u));
    EXPECT_EQ(packed_str[1], static_cast<char>(0x01));
    EXPECT_EQ(packed_str[2], static_cast<char>(0x00));
    EXPECT_EQ(packed_str[3], 'A');

    msgpack::unpacked upd;
    msgpack::unpack(upd, ss.str().data(), ss.str().size());
    msgpack::type::raw_ref rr2 = upd.get().as<msgpack::type::raw_ref>();
    EXPECT_TRUE(rr1 == rr2);
}

TEST(MSGPACK_RAW_REF, pack_unpack_16_h)
{
    std::string s(0xffff, 'A');

    msgpack::type::raw_ref rr1(s.data(), s.size());
    std::stringstream ss;
    msgpack::pack(ss, rr1);
    std::string packed_str = ss.str();
    EXPECT_EQ(packed_str[0], static_cast<char>(0xc5u));
    EXPECT_EQ(packed_str[1], static_cast<char>(0xffu));
    EXPECT_EQ(packed_str[2], static_cast<char>(0xffu));
    EXPECT_EQ(packed_str[3], 'A');

    msgpack::unpacked upd;
    msgpack::unpack(upd, ss.str().data(), ss.str().size());
    msgpack::type::raw_ref rr2 = upd.get().as<msgpack::type::raw_ref>();
    EXPECT_TRUE(rr1 == rr2);
}

TEST(MSGPACK_RAW_REF, pack_unpack_32_l)
{
    std::string s(0xffff+1, 'A');

    msgpack::type::raw_ref rr1(s.data(), s.size());
    std::stringstream ss;
    msgpack::pack(ss, rr1);
    std::string packed_str = ss.str();
    EXPECT_EQ(packed_str[0], static_cast<char>(0xc6u));
    EXPECT_EQ(packed_str[1], static_cast<char>(0x00));
    EXPECT_EQ(packed_str[2], static_cast<char>(0x01));
    EXPECT_EQ(packed_str[3], static_cast<char>(0x00));
    EXPECT_EQ(packed_str[4], static_cast<char>(0x00));
    EXPECT_EQ(packed_str[5], 'A');

    msgpack::unpacked upd;
    msgpack::unpack(upd, ss.str().data(), ss.str().size());
    msgpack::type::raw_ref rr2 = upd.get().as<msgpack::type::raw_ref>();
    EXPECT_TRUE(rr1 == rr2);
}

TEST(MSGPACK_V4RAW_REF, pack_unpack)
{
    std::string s = "ABC";

    msgpack::type::v4raw_ref rr1(s.data(), s.size());
    std::stringstream ss;
    msgpack::pack(ss, rr1);
    std::string packed_str = ss.str();
    EXPECT_EQ(packed_str[0], static_cast<char>(0xa3u));
    EXPECT_EQ(packed_str[1], 'A');
    EXPECT_EQ(packed_str[2], 'B');
    EXPECT_EQ(packed_str[3], 'C');

    msgpack::unpacked upd;
    msgpack::unpack(upd, ss.str().data(), ss.str().size());
    msgpack::type::v4raw_ref rr2 = upd.get().as<msgpack::type::v4raw_ref>();
    EXPECT_TRUE(rr1 == rr2);
}

TEST(MSGPACK_V4RAW_REF, pack_unpack_fix_l)
{
    std::string s;

    msgpack::type::v4raw_ref rr1(s.data(), s.size());
    std::stringstream ss;
    msgpack::pack(ss, rr1);
    std::string packed_str = ss.str();
    EXPECT_EQ(packed_str[0], static_cast<char>(0xa0u));

    msgpack::unpacked upd;
    msgpack::unpack(upd, ss.str().data(), ss.str().size());
    msgpack::type::v4raw_ref rr2 = upd.get().as<msgpack::type::v4raw_ref>();
    EXPECT_TRUE(rr1 == rr2);
}

TEST(MSGPACK_V4RAW_REF, pack_unpack_fix_h)
{
    std::string s(0x1f, 'A');

    msgpack::type::v4raw_ref rr1(s.data(), s.size());
    std::stringstream ss;
    msgpack::pack(ss, rr1);
    std::string packed_str = ss.str();
    EXPECT_EQ(packed_str[0], static_cast<char>(0xbfu));
    EXPECT_EQ(packed_str[1], 'A');

    msgpack::unpacked upd;
    msgpack::unpack(upd, ss.str().data(), ss.str().size());
    msgpack::type::v4raw_ref rr2 = upd.get().as<msgpack::type::v4raw_ref>();
    EXPECT_TRUE(rr1 == rr2);
}

TEST(MSGPACK_V4RAW_REF, pack_unpack_16_l)
{
    std::string s(0x1f+1, 'A');

    msgpack::type::v4raw_ref rr1(s.data(), s.size());
    std::stringstream ss;
    msgpack::pack(ss, rr1);
    std::string packed_str = ss.str();
    EXPECT_EQ(packed_str[0], static_cast<char>(0xdau));
    EXPECT_EQ(packed_str[1], static_cast<char>(0x00u));
    EXPECT_EQ(packed_str[2], static_cast<char>(0x20u));
    EXPECT_EQ(packed_str[3], 'A');

    msgpack::unpacked upd;
    msgpack::unpack(upd, ss.str().data(), ss.str().size());
    msgpack::type::v4raw_ref rr2 = upd.get().as<msgpack::type::v4raw_ref>();
    EXPECT_TRUE(rr1 == rr2);
}

TEST(MSGPACK_V4RAW_REF, pack_unpack_16_h)
{
    std::string s(0xffff, 'A');

    msgpack::type::v4raw_ref rr1(s.data(), s.size());
    std::stringstream ss;
    msgpack::pack(ss, rr1);
    std::string packed_str = ss.str();
    EXPECT_EQ(packed_str[0], static_cast<char>(0xdau));
    EXPECT_EQ(packed_str[1], static_cast<char>(0xffu));
    EXPECT_EQ(packed_str[2], static_cast<char>(0xffu));
    EXPECT_EQ(packed_str[3], 'A');

    msgpack::unpacked upd;
    msgpack::unpack(upd, ss.str().data(), ss.str().size());
    msgpack::type::v4raw_ref rr2 = upd.get().as<msgpack::type::v4raw_ref>();
    EXPECT_TRUE(rr1 == rr2);
}

TEST(MSGPACK_V4RAW_REF, pack_unpack_32_l)
{
    std::string s(0xffff+1, 'A');

    msgpack::type::v4raw_ref rr1(s.data(), s.size());
    std::stringstream ss;
    msgpack::pack(ss, rr1);
    std::string packed_str = ss.str();
    EXPECT_EQ(packed_str[0], static_cast<char>(0xdbu));
    EXPECT_EQ(packed_str[1], static_cast<char>(0x00));
    EXPECT_EQ(packed_str[2], static_cast<char>(0x01));
    EXPECT_EQ(packed_str[3], static_cast<char>(0x00));
    EXPECT_EQ(packed_str[4], static_cast<char>(0x00));
    EXPECT_EQ(packed_str[5], 'A');

    msgpack::unpacked upd;
    msgpack::unpack(upd, ss.str().data(), ss.str().size());
    msgpack::type::v4raw_ref rr2 = upd.get().as<msgpack::type::v4raw_ref>();
    EXPECT_TRUE(rr1 == rr2);
}
