//
// is_write_buffered.cpp
// ~~~~~~~~~~~~~~~~~~~~~
//
// Copyright (c) 2003-2010 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

// Disable autolinking for unit tests.
#if !defined(BOOST_ALL_NO_LIB)
#define BOOST_ALL_NO_LIB 1
#endif // !defined(BOOST_ALL_NO_LIB)

// Test that header file is self-contained.
#include <boost/asio/is_write_buffered.hpp>

#include <boost/bind.hpp>
#include <boost/noncopyable.hpp>
#include <boost/asio/buffered_read_stream.hpp>
#include <boost/asio/buffered_write_stream.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/asio/ip/tcp.hpp>
#include "unit_test.hpp"

using namespace std; // For memcmp, memcpy and memset.

class test_stream
  : private boost::noncopyable
{
public:
  typedef boost::asio::io_service io_service_type;

  typedef test_stream lowest_layer_type;

  test_stream(boost::asio::io_service& io_service)
    : io_service_(io_service)
  {
  }

  io_service_type& io_service()
  {
    return io_service_;
  }

  lowest_layer_type& lowest_layer()
  {
    return *this;
  }

  template <typename Const_Buffers>
  size_t write(const Const_Buffers&)
  {
    return 0;
  }

  template <typename Const_Buffers>
  size_t write(const Const_Buffers&, boost::system::error_code& ec)
  {
    ec = boost::system::error_code();
    return 0;
  }

  template <typename Const_Buffers, typename Handler>
  void async_write(const Const_Buffers&, Handler handler)
  {
    boost::system::error_code error;
    io_service_.post(boost::asio::detail::bind_handler(handler, error, 0));
  }

  template <typename Mutable_Buffers>
  size_t read(const Mutable_Buffers&)
  {
    return 0;
  }

  template <typename Mutable_Buffers>
  size_t read(const Mutable_Buffers&, boost::system::error_code& ec)
  {
    ec = boost::system::error_code();
    return 0;
  }

  template <typename Mutable_Buffers, typename Handler>
  void async_read(const Mutable_Buffers&, Handler handler)
  {
    boost::system::error_code error;
    io_service_.post(boost::asio::detail::bind_handler(handler, error, 0));
  }

private:
  io_service_type& io_service_;
};

void is_write_buffered_test()
{
  BOOST_CHECK(!boost::asio::is_write_buffered<
      boost::asio::ip::tcp::socket>::value);

  BOOST_CHECK(!boost::asio::is_write_buffered<
      boost::asio::buffered_read_stream<
        boost::asio::ip::tcp::socket> >::value);

  BOOST_CHECK(!!boost::asio::is_write_buffered<
      boost::asio::buffered_write_stream<
        boost::asio::ip::tcp::socket> >::value);

  BOOST_CHECK(!!boost::asio::is_write_buffered<
      boost::asio::buffered_stream<boost::asio::ip::tcp::socket> >::value);

  BOOST_CHECK(!boost::asio::is_write_buffered<test_stream>::value);

  BOOST_CHECK(!boost::asio::is_write_buffered<
      boost::asio::buffered_read_stream<test_stream> >::value);

  BOOST_CHECK(!!boost::asio::is_write_buffered<
      boost::asio::buffered_write_stream<test_stream> >::value);

  BOOST_CHECK(!!boost::asio::is_write_buffered<
      boost::asio::buffered_stream<test_stream> >::value);
}

test_suite* init_unit_test_suite(int, char*[])
{
  test_suite* test = BOOST_TEST_SUITE("is_write_buffered");
  test->add(BOOST_TEST_CASE(&is_write_buffered_test));
  return test;
}
