#include "verb.hpp"

#include <map>
#include <optional>
#include <string_view>

#include <gtest/gtest.h>
#include "boost/beast/http/verb.hpp"  //NOLINT

using BoostVerb = boost::beast::http::verb;

TEST(BoostToHttpVerb, ValidCase) {
  std::map<HttpVerb, BoostVerb> verbMap = {
      {HttpVerb::Delete, BoostVerb::delete_},
      {HttpVerb::Get, BoostVerb::get},
      {HttpVerb::Head, BoostVerb::head},
      {HttpVerb::Options, BoostVerb::options},
      {HttpVerb::Patch, BoostVerb::patch},
      {HttpVerb::Post, BoostVerb::post},
      {HttpVerb::Put, BoostVerb::put},
  };

  for (int verbIndex = 0; verbIndex < static_cast<int>(HttpVerb::Max);
       ++verbIndex) {
    HttpVerb httpVerb = static_cast<HttpVerb>(verbIndex);
    std::optional<HttpVerb> verb = httpVerbFromBoost(verbMap[httpVerb]);
    ASSERT_TRUE(verb.has_value());
    EXPECT_EQ(*verb, httpVerb);
  }
}

TEST(BoostToHttpVerbTest, InvalidCase) {
  std::optional<HttpVerb> verb = httpVerbFromBoost(BoostVerb::unknown);
  EXPECT_FALSE(verb.has_value());
}

TEST(HttpVerbToStringTest, ValidCase) {
  std::map<HttpVerb, std::string_view> verbMap = {
      {HttpVerb::Delete, "DELETE"}, {HttpVerb::Get, "GET"},
      {HttpVerb::Head, "HEAD"},     {HttpVerb::Options, "OPTIONS"},
      {HttpVerb::Patch, "PATCH"},   {HttpVerb::Post, "POST"},
      {HttpVerb::Put, "PUT"},
  };

  for (int verbIndex = 0; verbIndex < static_cast<int>(HttpVerb::Max);
       ++verbIndex) {
    HttpVerb httpVerb = static_cast<HttpVerb>(verbIndex);
    EXPECT_EQ(httpVerbToString(httpVerb), verbMap[httpVerb]);
  }
}
