Files
boost_beast/test/beast/core/buffers_prefix.cpp

173 lines
4.6 KiB
C++
Raw Permalink Normal View History

//
2019-02-21 07:00:31 -08:00
// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail 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)
//
2017-07-20 13:40:34 -07:00
// Official repository: https://github.com/boostorg/beast
//
// Test that header file is self-contained.
#include <boost/beast/core/buffers_prefix.hpp>
2019-02-07 20:57:50 -08:00
#include "test_buffer.hpp"
2019-03-05 08:25:54 -08:00
#include <boost/beast/core/buffer_traits.hpp>
#include <boost/beast/core/buffers_to_string.hpp>
2018-11-11 14:07:55 -08:00
#include <boost/beast/_experimental/unit_test/suite.hpp>
#include <string>
2017-07-20 13:40:34 -07:00
namespace boost {
namespace beast {
class buffers_prefix_test : public beast::unit_test::suite
{
public:
void
testBufferSequence()
{
char buf[13];
auto const b =
buffers_triple(buf, sizeof(buf));
for(std::size_t i = 1; i <= sizeof(buf); ++i)
test_buffer_sequence(
buffers_prefix(i, b));
}
void
testInPlaceInit()
2018-12-12 06:37:40 -08:00
{
{
class test_buffers
{
net::const_buffer cb_;
public:
using const_iterator =
net::const_buffer const*;
explicit
test_buffers(std::true_type)
{
}
const_iterator
begin() const
{
return &cb_;
}
const_iterator
end() const
{
return begin() + 1;
}
};
buffers_prefix_view<test_buffers> v(
2, boost::in_place_init, std::true_type{});
2019-03-05 08:47:02 -08:00
BEAST_EXPECT(buffer_bytes(v) == 0);
2018-12-12 06:37:40 -08:00
}
{
char c[2];
c[0] = 0;
c[1] = 0;
buffers_prefix_view<net::const_buffer> v(
2, boost::in_place_init, c, sizeof(c));
2019-03-05 08:47:02 -08:00
BEAST_EXPECT(buffer_bytes(v) == 2);
2018-12-12 06:37:40 -08:00
}
2018-12-12 06:37:40 -08:00
{
char c[2];
buffers_prefix_view<net::mutable_buffer> v(
2, boost::in_place_init, c, sizeof(c));
2019-03-05 08:47:02 -08:00
BEAST_EXPECT(buffer_bytes(v) == 2);
2018-12-12 06:37:40 -08:00
}
}
template<class BufferType>
void
testPrefixes()
{
std::string s = "Hello, world";
BEAST_EXPECT(s.size() == 12);
for(std::size_t x = 1; x < 4; ++x) {
for(std::size_t y = 1; y < 4; ++y) {
{
std::size_t z = s.size() - (x + y);
std::array<BufferType, 3> bs{{
BufferType{&s[0], x},
BufferType{&s[x], y},
BufferType{&s[x+y], z}}};
for(std::size_t i = 0; i <= s.size() + 1; ++i)
{
auto pb = buffers_prefix(i, bs);
BEAST_EXPECT(buffers_to_string(pb) == s.substr(0, i));
auto pb2 = pb;
BEAST_EXPECT(buffers_to_string(pb2) == buffers_to_string(pb));
pb = buffers_prefix(0, bs);
pb2 = pb;
2019-03-05 08:47:02 -08:00
BEAST_EXPECT(buffer_bytes(pb2) == 0);
pb2 = buffers_prefix(i, bs);
BEAST_EXPECT(buffers_to_string(pb2) == s.substr(0, i));
}
}
} }
}
void testEmpty()
{
auto pb0 = buffers_prefix(0, net::mutable_buffer{});
2019-03-05 08:47:02 -08:00
BEAST_EXPECT(buffer_bytes(pb0) == 0);
auto pb1 = buffers_prefix(1, net::mutable_buffer{});
2019-03-05 08:47:02 -08:00
BEAST_EXPECT(buffer_bytes(pb1) == 0);
BEAST_EXPECT(net::buffer_copy(pb0, pb1) == 0);
}
2019-02-08 10:47:36 -08:00
void
testBuffersFront()
{
{
std::array<net::const_buffer, 2> v;
v[0] = {"", 0};
v[1] = net::const_buffer("Hello, world!", 13);
BEAST_EXPECT(buffers_front(v).size() == 0);
std::swap(v[0], v[1]);
BEAST_EXPECT(buffers_front(v).size() == 13);
}
{
struct null_sequence
{
net::const_buffer b;
using iterator = net::const_buffer const*;
iterator begin() const noexcept
{
return &b;
}
iterator end() const noexcept
{
return begin();
}
};
null_sequence z;
BEAST_EXPECT(buffers_front(z).size() == 0);
}
}
void
run() override
{
testBufferSequence();
2018-12-12 06:37:40 -08:00
testInPlaceInit();
testPrefixes<net::const_buffer>();
testPrefixes<net::mutable_buffer>();
testEmpty();
2019-02-08 10:47:36 -08:00
testBuffersFront();
}
};
BEAST_DEFINE_TESTSUITE(beast,core,buffers_prefix);
} // beast
2017-07-20 13:40:34 -07:00
} // boost