BareGit
#include <gtest/gtest.h>

#include "message.hpp"

TEST(MessageTest, SystemMessageToJson)
{
    SystemMessage msg{"You are a helpful assistant."};
    nlohmann::json j = toJson(msg);
    EXPECT_EQ(j["role"], "system");
    EXPECT_EQ(j["content"], "You are a helpful assistant.");
}

TEST(MessageTest, UserMessageToJson)
{
    UserMessage msg{"What is 2+2?"};
    nlohmann::json j = toJson(msg);
    EXPECT_EQ(j["role"], "user");
    EXPECT_EQ(j["content"], "What is 2+2?");
}

TEST(MessageTest, ToolCallToJson)
{
    ToolCall call{"call_1", "calc", {{"a", 2}, {"b", 2}}};
    nlohmann::json j = toJson(call);
    EXPECT_EQ(j["id"], "call_1");
    EXPECT_EQ(j["type"], "function");
    EXPECT_EQ(j["function"]["name"], "calc");
    EXPECT_EQ(j["function"]["arguments"], "{\"a\":2,\"b\":2}");
}

TEST(MessageTest, AssistantMessageToJson_ContentOnly)
{
    AssistantMessage msg{"The answer is 4.", {}};
    nlohmann::json j = toJson(msg);
    EXPECT_EQ(j["role"], "assistant");
    EXPECT_EQ(j["content"], "The answer is 4.");
    EXPECT_FALSE(j.contains("tool_calls"));
}

TEST(MessageTest, AssistantMessageToJson_ToolCallsOnly)
{
    AssistantMessage msg{std::nullopt,
                         {{"call_1", "calc", {{"a", 2}, {"b", 2}}}}};
    nlohmann::json j = toJson(msg);
    EXPECT_EQ(j["role"], "assistant");
    EXPECT_FALSE(j.contains("content"));
    ASSERT_TRUE(j.contains("tool_calls"));
    EXPECT_EQ(j["tool_calls"].size(), 1);
    EXPECT_EQ(j["tool_calls"][0]["id"], "call_1");
}

TEST(MessageTest, ToolResultMessageToJson)
{
    ToolResultMessage msg{"call_1", "4"};
    nlohmann::json j = toJson(msg);
    EXPECT_EQ(j["role"], "tool");
    EXPECT_EQ(j["tool_call_id"], "call_1");
    EXPECT_EQ(j["content"], "4");
}

TEST(MessageTest, MessageVariantToJson)
{
    Message msg = UserMessage{"Hello"};
    nlohmann::json j = toJson(msg);
    EXPECT_EQ(j["role"], "user");
    EXPECT_EQ(j["content"], "Hello");
}