#include <msgpack.hpp>
#include <gtest/gtest.h>

class enum_member {
public:
    enum_member() : flag(A) { }

    enum flags_t {
        A = 0,
        B = 1
    };

    flags_t flag;

    MSGPACK_DEFINE(flag);
};

MSGPACK_ADD_ENUM(enum_member::flags_t);

class compatibility {
public:
    compatibility() : str1("default"), str2("default") { }

    std::string str1;
    std::string str2;

    MSGPACK_DEFINE(str1, str2);
};

TEST(convert, compatibility_less)
{
    std::vector<std::string> src(1);
    src[0] = "kumofs";

    msgpack::zone z;
    msgpack::object obj(src, z);

    compatibility c;
    EXPECT_NO_THROW( obj.convert(c) );

    EXPECT_EQ("kumofs",  c.str1);
    EXPECT_EQ("default", c.str2);
}

TEST(convert, compatibility_more)
{
    std::vector<std::string> src(3);
    src[0] = "kumofs";
    src[1] = "mpio";
    src[2] = "cloudy";

    msgpack::zone z;
    msgpack::object obj(src, z);

    compatibility to;
    EXPECT_NO_THROW( obj.convert(to) );

    EXPECT_EQ("kumofs", to.str1);
    EXPECT_EQ("mpio",   to.str2);
}

TEST(convert, enum_member)
{
    enum_member src;
    src.flag = enum_member::B;

    msgpack::zone z;
    msgpack::object obj(src, z);

    enum_member to;
    EXPECT_NO_THROW( obj.convert(to) );

    EXPECT_EQ(enum_member::B, to.flag);
}

TEST(convert, return_value_ref)
{
    msgpack::zone z;
    msgpack::object obj(1, z);

    int i;
    int const& j = obj.convert(i);
    EXPECT_EQ(&i, &j);
    EXPECT_EQ(i, j);
}

#if !defined(MSGPACK_DISABLE_LEGACY_CONVERT)

TEST(convert, return_value_ptr)
{
    msgpack::zone z;
    msgpack::object obj(1, z);

    int i;
    EXPECT_EQ(obj.convert(&i), &i);
    EXPECT_EQ(1, i);
}

#endif // !defined(MSGPACK_DISABLE_LEGACY_CONVERT)

TEST(convert, if_not_nil_nil)
{
    msgpack::object obj;
    int i;
    EXPECT_FALSE(obj.convert_if_not_nil(i));
}

TEST(convert, if_not_nil_not_nil)
{
    msgpack::zone z;
    msgpack::object obj(1, z);

    int i;
    EXPECT_TRUE(obj.convert_if_not_nil(i));
    EXPECT_EQ(i, 1);
}
