#include "group.hpp"
#include "ledlayout.hpp"
#include "manager.hpp"
#include "test-led-priority.hpp"

#include <sdbusplus/bus.hpp>

#include <algorithm>
#include <set>

#include <gtest/gtest.h>

using namespace phosphor::led;

using Action = phosphor::led::Layout::Action;

// systemLedMap is generated code
// static const phosphor::led::GroupMap systemLedMap = {};

const std::string basePath = "/xyz/openbmc_project/led/groups/";

TEST(YamlLedPriorityTest, assertPriorityOn)
{
    const std::string groupPath = basePath + "group1";
    EXPECT_EQ(systemLedMap.contains(groupPath), true);

    phosphor::led::Layout::GroupLayout group = systemLedMap.at(groupPath);

    EXPECT_EQ(group.priority, 0);
    EXPECT_EQ(group.actionSet.size(), 1);

    for (auto& led : group.actionSet)
    {
        EXPECT_EQ(led.name, "led1");
        EXPECT_EQ(led.action, Action::On);
        EXPECT_EQ(led.priority, Action::On);
    }
}

TEST(YamlLedPriorityTest, assertPriorityOff)
{
    const std::string groupPath = basePath + "group2";
    EXPECT_EQ(systemLedMap.contains(groupPath), true);

    phosphor::led::Layout::GroupLayout group = systemLedMap.at(groupPath);

    EXPECT_EQ(group.priority, 0);
    EXPECT_EQ(group.actionSet.size(), 1);

    for (auto& led : group.actionSet)
    {
        EXPECT_EQ(led.name, "led2");
        EXPECT_EQ(led.action, Action::Off);
        EXPECT_EQ(led.priority, Action::Off);
    }
}

TEST(YamlLedPriorityTest, assertPriorityBlink)
{
    const std::string groupPath = basePath + "group3";
    EXPECT_EQ(systemLedMap.contains(groupPath), true);

    phosphor::led::Layout::GroupLayout group = systemLedMap.at(groupPath);

    EXPECT_EQ(group.priority, 0);
    EXPECT_EQ(group.actionSet.size(), 1);

    for (auto& led : group.actionSet)
    {
        EXPECT_EQ(led.name, "led3");
        EXPECT_EQ(led.action, Action::Blink);
        EXPECT_EQ(led.priority, Action::Blink);
    }
}
