// This file is part of CAF, the C++ Actor Framework. See the file LICENSE in // the main distribution directory for license terms and copyright or visit // https://github.com/actor-framework/actor-framework/blob/master/LICENSE. #include "caf/config.hpp" #define CAF_SUITE io_receive_buffer #include "caf/test/unit_test.hpp" #include #include "caf/io/network/receive_buffer.hpp" using namespace caf; using caf::io::network::receive_buffer; namespace { struct fixture { receive_buffer a; receive_buffer b; std::vector vec; fixture() : b(1024ul), vec{'h', 'a', 'l', 'l', 'o'} { // nop } std::string as_string(const receive_buffer& xs) { std::string result; for (auto& x : xs) result += static_cast(x); return result; } }; } // namespace CAF_TEST_FIXTURE_SCOPE(receive_buffer_tests, fixture) CAF_TEST(constructors) { CAF_CHECK_EQUAL(a.size(), 0ul); CAF_CHECK_EQUAL(a.capacity(), 0ul); CAF_CHECK(a.data() == nullptr); CAF_CHECK(a.empty()); CAF_CHECK_EQUAL(b.size(), 1024ul); CAF_CHECK_EQUAL(b.capacity(), 1024ul); CAF_CHECK(b.data() != nullptr); CAF_CHECK(!b.empty()); receive_buffer other{std::move(b)}; CAF_CHECK_EQUAL(other.size(), 1024ul); CAF_CHECK_EQUAL(other.capacity(), 1024ul); CAF_CHECK(other.data() != nullptr); CAF_CHECK(!other.empty()); } CAF_TEST(reserve) { a.reserve(0); CAF_CHECK_EQUAL(a.size(), 0ul); CAF_CHECK_EQUAL(a.capacity(), 0ul); CAF_CHECK(a.data() == nullptr); CAF_CHECK(a.empty()); a.reserve(1024); CAF_CHECK_EQUAL(a.size(), 0ul); CAF_CHECK_EQUAL(a.capacity(), 1024ul); CAF_CHECK(a.data() != nullptr); CAF_CHECK(a.begin() == a.end()); CAF_CHECK(a.empty()); a.reserve(512); CAF_CHECK_EQUAL(a.size(), 0ul); CAF_CHECK_EQUAL(a.capacity(), 1024ul); CAF_CHECK(a.data() != nullptr); CAF_CHECK(a.begin() == a.end()); CAF_CHECK(a.empty()); } CAF_TEST(resize) { a.resize(512); CAF_CHECK_EQUAL(a.size(), 512ul); CAF_CHECK_EQUAL(a.capacity(), 512ul); CAF_CHECK(a.data() != nullptr); CAF_CHECK(!a.empty()); b.resize(512); CAF_CHECK_EQUAL(b.size(), 512ul); CAF_CHECK_EQUAL(b.capacity(), 1024ul); CAF_CHECK(b.data() != nullptr); CAF_CHECK(!b.empty()); a.resize(1024); std::fill(a.begin(), a.end(), 'a'); auto cnt = 0; CAF_CHECK(std::all_of(a.begin(), a.end(), [&](char c) { ++cnt; return c == 'a'; })); CAF_CHECK_EQUAL(cnt, 1024); a.resize(10); cnt = 0; CAF_CHECK(std::all_of(a.begin(), a.end(), [&](char c) { ++cnt; return c == 'a'; })); CAF_CHECK_EQUAL(cnt, 10); a.resize(1024); cnt = 0; CAF_CHECK(std::all_of(a.begin(), a.end(), [&](char c) { ++cnt; return c == 'a'; })); CAF_CHECK_EQUAL(cnt, 1024); } CAF_TEST(push_back) { for (auto c : vec) a.push_back(c); CAF_CHECK_EQUAL(vec.size(), a.size()); CAF_CHECK_EQUAL(a.capacity(), 8ul); CAF_CHECK(a.data() != nullptr); CAF_CHECK(!a.empty()); CAF_CHECK(std::equal(vec.begin(), vec.end(), a.begin())); } CAF_TEST(insert) { for (auto c : vec) a.insert(a.end(), c); CAF_CHECK_EQUAL(as_string(a), "hallo"); a.insert(a.begin(), '!'); CAF_CHECK_EQUAL(as_string(a), "!hallo"); a.insert(a.begin() + 4, '-'); CAF_CHECK_EQUAL(as_string(a), "!hal-lo"); std::string foo = "foo:"; a.insert(a.begin() + 1, foo.begin(), foo.end()); CAF_CHECK_EQUAL(as_string(a), "!foo:hal-lo"); std::string bar = ":bar"; a.insert(a.end(), bar.begin(), bar.end()); CAF_CHECK_EQUAL(as_string(a), "!foo:hal-lo:bar"); } CAF_TEST(shrink_to_fit) { a.shrink_to_fit(); CAF_CHECK_EQUAL(a.size(), 0ul); CAF_CHECK_EQUAL(a.capacity(), 0ul); CAF_CHECK(a.data() == nullptr); CAF_CHECK(a.empty()); } CAF_TEST(swap) { for (auto c : vec) a.push_back(c); std::swap(a, b); CAF_CHECK_EQUAL(a.size(), 1024ul); CAF_CHECK_EQUAL(a.capacity(), 1024ul); CAF_CHECK(a.data() != nullptr); CAF_CHECK_EQUAL(b.size(), vec.size()); CAF_CHECK_EQUAL(std::distance(b.begin(), b.end()), static_cast(vec.size())); CAF_CHECK_EQUAL(b.capacity(), 8ul); CAF_CHECK(b.data() != nullptr); CAF_CHECK_EQUAL(*(b.data() + 0), 'h'); CAF_CHECK_EQUAL(*(b.data() + 1), 'a'); CAF_CHECK_EQUAL(*(b.data() + 2), 'l'); CAF_CHECK_EQUAL(*(b.data() + 3), 'l'); CAF_CHECK_EQUAL(*(b.data() + 4), 'o'); } CAF_TEST_FIXTURE_SCOPE_END()