#include "MockIO.hpp" namespace aissia::tests { void MockIO::publish(const std::string& topic, std::unique_ptr data) { // Convert IDataNode to JSON for easy verification json jsonData; if (data) { // Try to extract JSON from JsonDataNode auto* jsonNode = dynamic_cast(data.get()); if (jsonNode) { jsonData = jsonNode->getJsonData(); } else { // Fallback: create basic JSON from IDataNode interface jsonData = json::object(); } } m_publishedMessages.emplace_back(topic, jsonData); } grove::Message MockIO::pullMessage() { if (m_incomingMessages.empty()) { throw std::runtime_error("No messages available"); } grove::Message msg = std::move(m_incomingMessages.front()); m_incomingMessages.pop(); return msg; } void MockIO::injectMessage(const std::string& topic, const json& data) { grove::Message message; message.topic = topic; message.data = std::make_unique("data", data); message.timestamp = 0; m_incomingMessages.push(std::move(message)); } void MockIO::injectMessages(const std::vector>& messages) { for (const auto& [topic, data] : messages) { injectMessage(topic, data); } } bool MockIO::wasPublished(const std::string& topic) const { return std::any_of(m_publishedMessages.begin(), m_publishedMessages.end(), [&topic](const auto& msg) { return msg.first == topic; }); } json MockIO::getLastPublished(const std::string& topic) const { for (auto it = m_publishedMessages.rbegin(); it != m_publishedMessages.rend(); ++it) { if (it->first == topic) { return it->second; } } return json::object(); } std::vector MockIO::getAllPublished(const std::string& topic) const { std::vector result; for (const auto& [t, data] : m_publishedMessages) { if (t == topic) { result.push_back(data); } } return result; } size_t MockIO::countPublished(const std::string& topic) const { return std::count_if(m_publishedMessages.begin(), m_publishedMessages.end(), [&topic](const auto& msg) { return msg.first == topic; }); } void MockIO::clear() { m_publishedMessages.clear(); while (!m_incomingMessages.empty()) { m_incomingMessages.pop(); } m_subscriptions.clear(); } void MockIO::clearPublished() { m_publishedMessages.clear(); } } // namespace aissia::tests