BareGit
#include <gtest/gtest.h>
#include <nlohmann/json.hpp>

#include "tool.hpp"

class MockTool : public Tool
{
public:
    std::string name() const override
    {
        return "mock_tool";
    }
    std::string description() const override
    {
        return "Mock Tool";
    }
    nlohmann::json parametersSchema() const override
    {
        return nlohmann::json::object();
    }
    Task<mw::E<std::string>> execute(const nlohmann::json&) override
    {
        co_return "mock_result";
    }
};

TEST(ToolRegistryTest, RegisterAndGetTool)
{
    ToolRegistry registry;
    auto res = registry.registerTool(std::make_unique<MockTool>());
    ASSERT_TRUE(res.has_value());

    Tool* tool = registry.getTool("mock_tool");
    ASSERT_NE(tool, nullptr);
    EXPECT_EQ(tool->name(), "mock_tool");
}

TEST(ToolRegistryTest, DuplicateRegistrationFails)
{
    ToolRegistry registry;
    ASSERT_TRUE(
        registry.registerTool(std::make_unique<MockTool>()).has_value());
    EXPECT_FALSE(
        registry.registerTool(std::make_unique<MockTool>()).has_value());
}

TEST(ToolRegistryTest, RegisterWithNamespace)
{
    ToolRegistry registry;
    auto res =
        registry.registerToolWithNamespace("ns", std::make_unique<MockTool>());
    ASSERT_TRUE(res.has_value());

    Tool* tool = registry.getTool("ns_mock_tool");
    ASSERT_NE(tool, nullptr);
    EXPECT_EQ(tool->name(), "mock_tool");
}

TEST(ToolRegistryTest, GetAllTools)
{
    ToolRegistry registry;
    registry.registerTool(std::make_unique<MockTool>());

    auto tools = registry.getAllTools();
    ASSERT_EQ(tools.size(), 1);
    EXPECT_EQ(tools[0]->name(), "mock_tool");
}