#include "boost/algorithm/string.hpp"
#include "logging.hpp"
#include "nlohmann/json.hpp"
#include "str_utility.hpp"

#include <string>
#include <vector>

#include <gmock/gmock.h> // IWYU pragma: keep
#include <gtest/gtest.h> // IWYU pragma: keep

// IWYU pragma: no_include <gtest/gtest-message.h>
// IWYU pragma: no_include <gtest/gtest-test-part.h>
// IWYU pragma: no_include "gtest/gtest_pred_impl.h"
// IWYU pragma: no_include <gmock/gmock-matchers.h>

namespace
{

using ::testing::ElementsAre;

TEST(Split, PositiveTests)
{
    std::vector<std::string> vec;
    bmcweb::split(vec, "xx-abc-xx-abb", '-');
    EXPECT_THAT(vec, ElementsAre("xx", "abc", "xx", "abb"));

    vec.clear();
    bmcweb::split(vec, "", '-');
    EXPECT_THAT(vec, ElementsAre(""));

    vec.clear();
    bmcweb::split(vec, "foo/", '/');
    EXPECT_THAT(vec, ElementsAre("foo", ""));

    vec.clear();
    bmcweb::split(vec, "/bar", '/');
    EXPECT_THAT(vec, ElementsAre("", "bar"));

    vec.clear();
    bmcweb::split(vec, "/", '/');
    EXPECT_THAT(vec, ElementsAre("", ""));
}

TEST(Split, Sensor)
{
    std::vector<std::string> vec;
    bmcweb::split(vec, "/xyz/openbmc_project/sensors/unit/name", '/');
    EXPECT_THAT(vec, ElementsAre("", "xyz", "openbmc_project", "sensors",
                                 "unit", "name"));
}

// boost version to keep in mind:
TEST(Split, BoostSplit)
{
    std::vector<std::string> vec;
    boost::split(vec, "batman/superman/zebra", boost::is_any_of("/"));
    BMCWEB_LOG_DEBUG << "=> BoostSplit: vec: " << nlohmann::json(vec);
    EXPECT_THAT(vec, ElementsAre("batman", "superman", "zebra"));
}

TEST(JoinStrings, Two)
{
    std::string ret;
    bmcweb::append_with_sep(ret, ':', "batman", "superman");
    EXPECT_EQ(ret, "batman:superman");
}

TEST(JoinStrings, One)
{
    std::string ret;
    bmcweb::append_with_sep(ret, ':', "batman");
    EXPECT_EQ(ret, "batman");
}

} // namespace
