based

Opinionated utility library
git clone git://git.dimitrijedobrota.com/based.git
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING

commit 4d55232d42d00afb41a2b65d88e291bddc2cc1ea
parent 2272f546a59ff1312ab61aecfb0e2388b27d2fc9
author Dimitrije Dobrota < mail@dimitrijedobrota.com >
date Tue, 29 Apr 2025 12:13:13 +0200

Test buffer

Diffstat:
M include/based/template.hpp | +++ ---
M test/CMakeLists.txt | ++++
A test/source/buffer_test.cpp | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

3 files changed, 73 insertions(+), 3 deletions(-)


diff --git a/ include/based/template.hpp b/ include/based/template.hpp

@@ -275,9 +275,9 @@ struct buffer

void swap(buffer& that) noexcept
{
alignas(alignment) char tmp[size]; // NOLINT array
::memcpy(tmp, this->m_space, size);
::memcpy(this->m_space, that.m_space, size);
::memcpy(that.m_space, tmp, size);
::memcpy(tmp, this->m_space, size); // NOLINT array
::memcpy(this->m_space, that.m_space, size); // NOLINT array
::memcpy(that.m_space, tmp, size); // NOLINT array
}
};

diff --git a/ test/CMakeLists.txt b/ test/CMakeLists.txt

@@ -56,13 +56,17 @@ add_test(find_mismatch_n_test)

add_test(find_if_unguarded_test)

# ---- List ----

add_test(list_test)

# ---- String ----

add_test(string_literal_test)

# ---- Template ----

add_test(signature_test)
add_test(buffer_test)

# ---- End-of-file commands ----

diff --git a/ test/source/buffer_test.cpp b/ test/source/buffer_test.cpp

@@ -0,0 +1,66 @@

#define CATCH_CONFIG_RUNTIME_STATIC_REQUIRE

#include <catch2/catch_test_macros.hpp>

#include "based/template.hpp"

template struct based::buffer<sizeof(void*)>;

TEST_CASE("valid type", "[template/buffer]")
{
SECTION("small buffer")
{
using buffer = based::buffer<sizeof(std::uint8_t)>;
STATIC_REQUIRE(buffer::valid_type<std::uint8_t>());
STATIC_REQUIRE_FALSE(buffer::valid_type<std::size_t>());

STATIC_REQUIRE_FALSE(buffer::valid_type<char[5]>()); // NOLINT array
}

SECTION("big buffer")
{
using buffer = based::buffer<sizeof(std::size_t), alignof(std::size_t)>;
STATIC_REQUIRE(buffer::valid_type<std::uint8_t>());
STATIC_REQUIRE(buffer::valid_type<std::size_t>());

STATIC_REQUIRE_FALSE(buffer::valid_type<char[5]>()); // NOLINT array
}
}

TEST_CASE("buffer", "[template/buffer]")
{
using buffer = based::buffer<sizeof(std::size_t)>;

static constexpr std::uint8_t value = 8;
buffer buf(std::in_place_type<std::uint8_t>, value);

REQUIRE(*buf.as<std::uint8_t>() == value);

SECTION("emplace")
{
static constexpr std::uint16_t new_value = 10;
buf.emplace<std::uint16_t>(new_value);

REQUIRE(*buf.as<std::uint16_t>() == new_value);
}

SECTION("swap")
{
static constexpr std::uint16_t new_value = 10;
buffer new_buf(std::in_place_type<std::uint16_t>, new_value);
buf.swap(new_buf);

REQUIRE(*buf.as<std::uint16_t>() == new_value);
REQUIRE(*new_buf.as<std::uint8_t>() == value);
}
}

TEST_CASE("const buffer", "[template/buffer]")
{
using buffer = based::buffer<sizeof(std::size_t)>;

static constexpr std::uint8_t value = 8;
const buffer buf(std::in_place_type<std::uint8_t>, value);

REQUIRE(*buf.as<std::uint8_t>() == value);
}