#include "common/utils.hpp"

#include <gmock/gmock.h>
#include <gtest/gtest.h>

namespace pldm
{
namespace utils
{
/** @brief helper function for parameter matching
 *  @param[in] lhs - left-hand side value
 *  @param[in] rhs - right-hand side value
 *  @return true if it matches
 */
inline bool operator==(const DBusMapping& lhs, const DBusMapping& rhs)
{
    return lhs.objectPath == rhs.objectPath && lhs.interface == rhs.interface &&
           lhs.propertyName == rhs.propertyName &&
           lhs.propertyType == rhs.propertyType;
}

} // namespace utils
} // namespace pldm

class GetManagedEmptyObject
{
  public:
    static pldm::utils::ObjectValueTree getManagedObj(const char* /*service*/,
                                                      const char* /*path*/)
    {
        return pldm::utils::ObjectValueTree{};
    }
};

class GetManagedObject
{
  public:
    static pldm::utils::ObjectValueTree getManagedObj(const char* /*service*/,
                                                      const char* /*path*/)
    {
        return pldm::utils::ObjectValueTree{
            {sdbusplus::message::object_path("/foo/bar"),
             {{"foo.bar",
               {{"Functional", true},
                {"Enabled", true},
                {"PrettyName", "System"},
                {"Present", true},
                {"SerialNumber", "abc123z"},
                {"Model", "1234 - 00Z"},
                {"SubModel", "S0"}}}}}};
    }
};

class MockdBusHandler : public pldm::utils::DBusHandler
{
  public:
    MOCK_METHOD(std::string, getService, (const char*, const char*),
                (const override));

    MOCK_METHOD(void, setDbusProperty,
                (const pldm::utils::DBusMapping&,
                 const pldm::utils::PropertyValue&),
                (const override));

    MOCK_METHOD(pldm::utils::PropertyValue, getDbusPropertyVariant,
                (const char*, const char*, const char*), (const override));

    MOCK_METHOD(pldm::utils::GetSubTreeResponse, getSubtree,
                (const std::string&, int, const std::vector<std::string>&),
                (const override));
};