/* Copyright (c) 2018-2025 Marcelo Zimbres Silva (mzimbres@gmail.com)
 *
 * Distributed under the Boost Software License, Version 1.0. (See
 * accompanying file LICENSE.txt)
 */

#include <boost/redis/adapter/any_adapter.hpp>
#include <boost/redis/ignore.hpp>
#include <boost/redis/response.hpp>

#include <boost/core/lightweight_test.hpp>

#include <string>

using namespace boost::redis;

namespace {

void test_response_types()
{
   // any_adapter can be used with any supported responses
   response<int> r1;
   response<int, std::string> r2;
   generic_response r3;
   resp3::flat_tree r4;

   BOOST_TEST_NO_THROW(any_adapter{r1});
   BOOST_TEST_NO_THROW(any_adapter{r2});
   BOOST_TEST_NO_THROW(any_adapter{r3});
   BOOST_TEST_NO_THROW(any_adapter{r4});
   BOOST_TEST_NO_THROW(any_adapter{ignore});
}

void test_copy_move()
{
   // any_adapter can be copied/moved
   response<int, std::string> r;
   auto ad1 = any_adapter{r};

   // copy constructor
   auto ad2 = any_adapter(ad1);

   // move constructor
   auto ad3 = any_adapter(std::move(ad2));

   // copy assignment
   BOOST_TEST_NO_THROW(ad2 = ad1);

   // move assignment
   BOOST_TEST_NO_THROW(ad2 = std::move(ad1));
}

}  // namespace

int main()
{
   test_response_types();
   test_copy_move();

   return boost::report_errors();
}