missed files: xo-alloc/CircularBuffer
This commit is contained in:
parent
8fa254418a
commit
df9ad3b855
2 changed files with 419 additions and 0 deletions
174
utest/CircularBuffer.test.cpp
Normal file
174
utest/CircularBuffer.test.cpp
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
/* CircularBuffer.test.cpp
|
||||
*
|
||||
* author: Roland Conybeare, Aug 2025
|
||||
*/
|
||||
|
||||
#include "xo/alloc/CircularBuffer.hpp"
|
||||
#include "xo/indentlog/print/vector.hpp"
|
||||
#include <catch2/catch.hpp>
|
||||
|
||||
namespace xo {
|
||||
using xo::gc::CircularBuffer;
|
||||
|
||||
namespace ut {
|
||||
TEST_CASE("circular_buffer_0", "[circular_buffer]")
|
||||
{
|
||||
CircularBuffer<std::string> q(10, false /*debug_flag*/);
|
||||
q.push_back("a");
|
||||
REQUIRE(q.back() == "a");
|
||||
q.push_back("b");
|
||||
REQUIRE(q.back() == "b");
|
||||
q.push_back("c");
|
||||
REQUIRE(q.back() == "c");
|
||||
REQUIRE(q.location_of(0) == 0);
|
||||
REQUIRE(q.location_of(1) == 1);
|
||||
REQUIRE(q.location_of(2) == 2);
|
||||
//REQUIRE(q.index_of(0) == 0);
|
||||
|
||||
REQUIRE(q.size() == 3);
|
||||
REQUIRE(q.front() == "a");
|
||||
REQUIRE(q.at(0) == "a");
|
||||
REQUIRE(q.at(1) == "b");
|
||||
REQUIRE(q.at(2) == "c");
|
||||
|
||||
CircularBuffer<std::string> q2;
|
||||
|
||||
q2 = q;
|
||||
|
||||
q.clear();
|
||||
|
||||
REQUIRE(q2.size() == 3);
|
||||
REQUIRE(q2.front() == "a");
|
||||
REQUIRE(q2.at(0) == "a");
|
||||
REQUIRE(q2.at(1) == "b");
|
||||
REQUIRE(q2.at(2) == "c");
|
||||
}
|
||||
|
||||
TEST_CASE("circular_buffer_1", "[circular_buffer]")
|
||||
{
|
||||
CircularBuffer<std::string> q(2, false /*debug_flag*/);
|
||||
q.push_back("a");
|
||||
REQUIRE(q.back() == "a");
|
||||
q.push_back("b");
|
||||
REQUIRE(q.back() == "b");
|
||||
q.push_back("c");
|
||||
REQUIRE(q.back() == "c");
|
||||
REQUIRE(q.location_of(0) == 1);
|
||||
REQUIRE(q.location_of(1) == 0);
|
||||
//REQUIRE(q.index_of(0) == 0);
|
||||
|
||||
REQUIRE(q.size() == 2);
|
||||
REQUIRE(q.front() == "b");
|
||||
REQUIRE(q.at(0) == "b");
|
||||
REQUIRE(q.at(1) == "c");
|
||||
|
||||
{
|
||||
std::size_t i = 0;
|
||||
for (const auto & qi : q) {
|
||||
REQUIRE(qi == q.at(i));
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
CircularBuffer<std::string> q2 = q;
|
||||
|
||||
q.clear();
|
||||
|
||||
REQUIRE(q2.size() == 2);
|
||||
REQUIRE(q2.front() == "b");
|
||||
REQUIRE(q2.at(0) == "b");
|
||||
REQUIRE(q2.at(1) == "c");
|
||||
|
||||
{
|
||||
std::size_t i = 0;
|
||||
for (const auto & qi : q) {
|
||||
REQUIRE(qi == q2.at(i));
|
||||
++i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
namespace {
|
||||
struct Testcase_CircularBuffer {
|
||||
explicit Testcase_CircularBuffer(std::size_t capacity,
|
||||
const std::vector<std::string> & contents)
|
||||
: capacity_{capacity},
|
||||
contents_{contents} {}
|
||||
|
||||
std::size_t capacity_ = 0;
|
||||
std::vector<std::string> contents_;
|
||||
};
|
||||
|
||||
std::vector<Testcase_CircularBuffer>
|
||||
s_testcase_v = {
|
||||
Testcase_CircularBuffer(0, {}),
|
||||
Testcase_CircularBuffer(1, {"a"}),
|
||||
Testcase_CircularBuffer(2, {"a", "b"}),
|
||||
Testcase_CircularBuffer(2, {"a", "b", "c", "d"})
|
||||
};
|
||||
}
|
||||
|
||||
namespace ut {
|
||||
TEST_CASE("circular_buffer_2", "[circular_buffer]")
|
||||
{
|
||||
for (std::size_t i_tc = 0, n_tc = s_testcase_v.size(); i_tc < n_tc; ++i_tc) {
|
||||
const Testcase_CircularBuffer & tc = s_testcase_v[i_tc];
|
||||
|
||||
INFO(tostr(xtag("i_tc", i_tc),
|
||||
xtag("capacity", tc.capacity_),
|
||||
xrtag("contents", tc.contents_)));
|
||||
|
||||
for (std::size_t j_phase = 0; j_phase < 2; ++j_phase) {
|
||||
constexpr bool c_debug_flag = false;
|
||||
|
||||
CircularBuffer<std::string> q(tc.capacity_, false /*debug_flag*/);
|
||||
|
||||
REQUIRE(q.empty());
|
||||
REQUIRE(q.size() == 0);
|
||||
REQUIRE(q.begin() == q.end());
|
||||
REQUIRE(q.capacity() == tc.capacity_);
|
||||
|
||||
std::size_t n = 0;
|
||||
for (const auto & s : tc.contents_) {
|
||||
INFO(tostr(xtag("n0", n), xtag("s", s)));
|
||||
++n;
|
||||
INFO(xtag("n1", n));
|
||||
|
||||
q.push_back(s);
|
||||
|
||||
REQUIRE(q.back() == s);
|
||||
REQUIRE(q.capacity() == tc.capacity_);
|
||||
REQUIRE(q.size() == std::min(n, tc.capacity_));
|
||||
|
||||
std::size_t i = 0;
|
||||
for (const auto & qi : q) {
|
||||
INFO(tostr(xtag("i", i), xtag("qi", qi)));
|
||||
|
||||
if (n <= tc.capacity_) {
|
||||
REQUIRE(qi == tc.contents_.at(i));
|
||||
REQUIRE(qi == tc.contents_[i]);
|
||||
} else {
|
||||
REQUIRE(qi == tc.contents_.at(n - tc.capacity_ + i));
|
||||
REQUIRE(qi == tc.contents_[n - tc.capacity_ + i]);
|
||||
}
|
||||
++i;
|
||||
}
|
||||
|
||||
REQUIRE(i == std::min(n, tc.capacity_));
|
||||
|
||||
if (tc.contents_.size() <= tc.capacity_)
|
||||
REQUIRE(q.front() == tc.contents_.at(0));
|
||||
}
|
||||
|
||||
q.clear();
|
||||
|
||||
REQUIRE(q.size() == 0);
|
||||
REQUIRE(q.capacity() == tc.capacity_);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* CircularBuffer.test.cpp */
|
||||
Loading…
Add table
Add a link
Reference in a new issue