1#include <xrpl/basics/Buffer.h>
3#include <xrpl/basics/Slice.h>
5#include <gtest/gtest.h>
21 static constexpr auto kRandomData = std::to_array<std::uint8_t>(
22 {0xa8, 0xa1, 0x38, 0x45, 0x23, 0xec, 0xe4, 0x23, 0x71, 0x6d, 0x2a,
23 0x18, 0xb4, 0x70, 0xcb, 0xf5, 0xac, 0x2d, 0x89, 0x4d, 0x19, 0x9c,
24 0xf0, 0x2c, 0x15, 0xd1, 0xf9, 0x9b, 0x66, 0xd2, 0x30, 0xd3});
32 return b.
data() ==
nullptr;
34 return b.
data() !=
nullptr;
52 EXPECT_TRUE(
sane(buf));
53 EXPECT_TRUE(buf.
empty());
67 EXPECT_TRUE(b.
empty());
68 EXPECT_EQ(b.
data(),
nullptr);
76 EXPECT_TRUE(b.
empty());
85 EXPECT_FALSE(b.
empty());
86 EXPECT_EQ(b.
size(), kHalf);
87 EXPECT_EQ(b, firstHalf);
95 EXPECT_FALSE(b.
empty());
96 EXPECT_EQ(b.
size(), kHalf);
99 EXPECT_EQ(b, secondHalf);
104 Buffer const b{kRandomData.data(), kRandomData.size()};
106 EXPECT_TRUE(sane(b));
107 EXPECT_FALSE(b.
empty());
108 EXPECT_EQ(b.
size(), kRandomData.size());
116 EXPECT_TRUE(emptyBuffer == emptyBuffer);
117 EXPECT_TRUE(firstHalf == firstHalf);
119 EXPECT_TRUE(emptyBuffer != firstHalf);
120 EXPECT_TRUE(firstHalf != secondHalf);
121 EXPECT_TRUE(secondHalf != whole);
126 Buffer const fromEmpty{emptyBuffer};
127 EXPECT_TRUE(sane(fromEmpty));
128 EXPECT_EQ(fromEmpty, emptyBuffer);
130 Buffer const fromNonEmpty{firstHalf};
131 EXPECT_TRUE(sane(fromNonEmpty));
132 EXPECT_EQ(fromNonEmpty, firstHalf);
141 EXPECT_TRUE(sane(b));
142 EXPECT_EQ(b, secondHalf);
146 EXPECT_TRUE(sane(b));
151 EXPECT_TRUE(sane(b));
152 EXPECT_EQ(b, emptyBuffer);
158#pragma clang diagnostic push
159#pragma clang diagnostic ignored "-Wself-assign-overloaded"
162 Buffer emptyCopy{emptyBuffer};
163 emptyCopy = emptyCopy;
164 EXPECT_TRUE(sane(emptyCopy));
165 EXPECT_EQ(emptyCopy, emptyBuffer);
168 wholeCopy = wholeCopy;
169 EXPECT_TRUE(sane(wholeCopy));
170 EXPECT_EQ(wholeCopy, whole);
173#pragma clang diagnostic pop
180 Buffer const moved{std::move(source)};
182 checkEmptyAfterMove(source);
183 EXPECT_TRUE(sane(moved));
184 EXPECT_TRUE(moved.
empty());
190 Buffer const moved{std::move(source)};
192 checkEmptyAfterMove(source);
193 EXPECT_TRUE(sane(moved));
194 EXPECT_EQ(moved, firstHalf);
202 target = std::move(source);
204 EXPECT_TRUE(sane(target));
205 EXPECT_TRUE(target.
empty());
206 checkEmptyAfterMove(source);
214 target = std::move(source);
216 EXPECT_TRUE(sane(target));
217 EXPECT_EQ(target, firstHalf);
218 checkEmptyAfterMove(source);
226 target = std::move(source);
228 EXPECT_TRUE(sane(target));
229 EXPECT_TRUE(target.
empty());
230 checkEmptyAfterMove(source);
236 Buffer sameSize{secondHalf};
239 target = std::move(sameSize);
240 EXPECT_TRUE(sane(target));
241 EXPECT_EQ(target, secondHalf);
242 checkEmptyAfterMove(sameSize);
244 target = std::move(largerSize);
245 EXPECT_TRUE(sane(target));
246 EXPECT_EQ(target, whole);
247 checkEmptyAfterMove(largerSize);
252 Buffer const fromEmpty{
static_cast<Slice>(emptyBuffer)};
253 EXPECT_TRUE(sane(fromEmpty));
254 EXPECT_EQ(fromEmpty, emptyBuffer);
256 Buffer const fromNonEmpty{
static_cast<Slice>(whole)};
257 EXPECT_TRUE(sane(fromNonEmpty));
258 EXPECT_EQ(fromNonEmpty, whole);
266 b =
static_cast<Slice>(emptyBuffer);
267 EXPECT_TRUE(sane(b));
268 EXPECT_EQ(b, emptyBuffer);
271 b =
static_cast<Slice>(firstHalf);
272 EXPECT_TRUE(sane(b));
273 EXPECT_EQ(b, firstHalf);
276 b =
static_cast<Slice>(secondHalf);
277 EXPECT_TRUE(sane(b));
278 EXPECT_EQ(b, secondHalf);
281 b =
static_cast<Slice>(emptyBuffer);
282 EXPECT_TRUE(sane(b));
283 EXPECT_EQ(b, emptyBuffer);
289 SCOPED_TRACE(::testing::Message() <<
"size: " << size);
295 EXPECT_TRUE(sane(b));
296 EXPECT_EQ(b.
size(), size);
297 EXPECT_EQ(b.
data() ==
nullptr, size == 0);
300 EXPECT_TRUE(sane(b));
301 EXPECT_EQ(b.
size(), size + 1);
302 EXPECT_NE(b.
data(),
nullptr);
305 EXPECT_TRUE(sane(b));
306 EXPECT_TRUE(b.
empty());
307 EXPECT_EQ(b.
data(),
nullptr);
311 EXPECT_TRUE(sane(b));
312 EXPECT_TRUE(b.
empty());
313 EXPECT_EQ(b.
data(),
nullptr);
316 for (
auto size = 0uz; size < kHalf; ++size)
318 check(emptyBuffer, size);
319 check(firstHalf, size);
328 EXPECT_EQ(b.
size(), 4);
329 for (
auto const byte :
Slice{b})
330 EXPECT_EQ(
byte, 0xab);
339 EXPECT_EQ(b.
size(), 4);
340 for (
auto const byte :
Slice{b})
341 EXPECT_EQ(
byte, 0x00);
349 EXPECT_TRUE(empty.empty());
350 EXPECT_EQ(empty.data(),
nullptr);
Like std::vector<char> but better.
bool empty() const noexcept
std::uint8_t * alloc(std::size_t n)
Reallocate the storage.
std::size_t size() const noexcept
Returns the number of bytes in the buffer.
std::uint8_t const * data() const noexcept
Return a pointer to beginning of the storage.
void clear() noexcept
Reset the buffer.
void fill(std::uint8_t value) noexcept
Set every byte in the buffer to the given value.
An immutable linear range of bytes.
T is_nothrow_move_assignable_v
T is_nothrow_move_constructible_v
TEST_F(BaseUintDeathTest, fromRaw_size_mismatch)
static bool sane(Buffer const &b)
static void checkEmptyAfterMove(Buffer const &buf)
Check the state Buffer documents for a moved-from buffer: "the other buffer is reset",...
static constexpr std::size_t kHalf
static constexpr auto kRandomData