1 // Copyright 2020 The Pigweed Authors
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
7 // https://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
15 #include "pw_bytes/byte_builder.h"
20 #include "gtest/gtest.h"
24 template <typename... Args>
25 constexpr std::array<byte, sizeof...(Args)> MakeBytes(Args... args) noexcept {
26 return {static_cast<byte>(args)...};
32 TEST(ByteBuilder, EmptyBuffer_SizeAndMaxSizeAreCorrect) {
33 ByteBuilder bb(ByteSpan{});
35 EXPECT_TRUE(bb.empty());
36 EXPECT_EQ(0u, bb.size());
37 EXPECT_EQ(0u, bb.max_size());
40 TEST(ByteBuilder, NonEmptyBufferOfSize0_SizeAndMaxSizeAreCorrect) {
41 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
42 ByteBuilder bb(buffer);
44 EXPECT_TRUE(bb.empty());
45 EXPECT_EQ(0u, bb.size());
46 EXPECT_EQ(3u, bb.max_size());
49 TEST(ByteBuilder, Constructor_InsertsEmptyBuffer) {
50 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
51 ByteBuilder bb(buffer);
53 EXPECT_TRUE(bb.empty());
56 TEST(ByteBuilder, EmptyBuffer_Append) {
57 ByteBuilder bb(ByteSpan{});
58 EXPECT_TRUE(bb.empty());
60 constexpr auto kBytesTestLiteral = MakeBytes(0x04, 0x05);
62 EXPECT_FALSE(bb.append(kBytesTestLiteral.data(), 2).ok());
63 EXPECT_EQ(0u, bb.size());
64 EXPECT_EQ(0u, bb.max_size());
67 TEST(ByteBuilder, NonEmptyBufferOfSize0_Append) {
68 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
69 ByteBuilder bb(buffer);
70 EXPECT_TRUE(bb.empty());
72 constexpr auto kBytesTestLiteral = MakeBytes(0x04, 0x05);
74 EXPECT_TRUE(bb.append(kBytesTestLiteral.data(), 2).ok());
75 EXPECT_EQ(byte{0x04}, bb.data()[0]);
76 EXPECT_EQ(byte{0x05}, bb.data()[1]);
79 TEST(ByteBuilder, NonEmptyBufferOfSize0_Append_Partial_NotResourceExhausted) {
80 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
81 ByteBuilder bb(buffer);
83 EXPECT_TRUE(bb.empty());
85 constexpr auto kBytesTestLiteral = MakeBytes(0x04, 0x05, 0x06, 0x07);
87 EXPECT_TRUE(bb.append(kBytesTestLiteral.data(), 3).ok());
88 EXPECT_EQ(byte{0x04}, bb.data()[0]);
89 EXPECT_EQ(byte{0x05}, bb.data()[1]);
90 EXPECT_EQ(byte{0x06}, bb.data()[2]);
93 TEST(ByteBuilder, NonEmptyBufferOfSize0_Append_Partial_ResourceExhausted) {
94 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
95 ByteBuilder bb(buffer);
97 EXPECT_TRUE(bb.empty());
99 constexpr auto kBytesTestLiteral = MakeBytes(0x04, 0x05, 0x06, 0x07);
101 EXPECT_FALSE(bb.append(kBytesTestLiteral.data(), 4).ok());
102 EXPECT_EQ(Status::ResourceExhausted(), bb.status());
103 EXPECT_EQ(0u, bb.size());
106 TEST(ByteBuilder, Append_RepeatedBytes) {
108 EXPECT_TRUE(bb.empty());
110 EXPECT_TRUE(bb.append(7, byte{0x04}).ok());
112 for (size_t i = 0; i < 7; i++) {
113 EXPECT_EQ(byte{0x04}, bb.data()[i]);
117 TEST(ByteBuilder, Append_Bytes_Full) {
120 EXPECT_EQ(8u, bb.max_size() - bb.size());
122 EXPECT_TRUE(bb.append(8, byte{0x04}).ok());
124 for (size_t i = 0; i < 8; i++) {
125 EXPECT_EQ(byte{0x04}, bb.data()[i]);
129 TEST(ByteBuilder, Append_Bytes_Exhausted) {
132 EXPECT_EQ(Status::ResourceExhausted(), bb.append(9, byte{0x04}).status());
133 EXPECT_EQ(0u, bb.size());
136 TEST(ByteBuilder, Append_Partial) {
137 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
140 EXPECT_TRUE(bb.append(buffer.data(), 2).ok());
141 EXPECT_EQ(2u, bb.size());
142 EXPECT_EQ(byte{0x01}, bb.data()[0]);
143 EXPECT_EQ(byte{0x02}, bb.data()[1]);
146 TEST(ByteBuilder, EmptyBuffer_Resize_WritesNothing) {
147 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
148 ByteBuilder bb(buffer);
151 EXPECT_TRUE(bb.ok());
154 TEST(ByteBuilder, EmptyBuffer_Resize_Larger_Fails) {
155 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
156 ByteBuilder bb(buffer);
159 EXPECT_EQ(Status::OutOfRange(), bb.append(9, byte{0x04}).status());
162 TEST(ByteBuilder, Resize_Smaller) {
163 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
166 EXPECT_TRUE(bb.append(buffer).ok());
169 EXPECT_TRUE(bb.ok());
170 EXPECT_EQ(1u, bb.size());
171 EXPECT_EQ(byte{0x01}, bb.data()[0]);
174 TEST(ByteBuilder, Resize_Clear) {
175 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
178 EXPECT_TRUE(bb.append(buffer).ok());
181 EXPECT_TRUE(bb.ok());
182 EXPECT_EQ(0u, bb.size());
183 EXPECT_TRUE(bb.empty());
186 TEST(ByteBuilder, Resize_Larger_Fails) {
187 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
190 EXPECT_TRUE(bb.append(buffer).ok());
192 EXPECT_EQ(3u, bb.size());
194 EXPECT_EQ(3u, bb.size());
195 EXPECT_EQ(bb.status(), Status::OutOfRange());
198 TEST(ByteBuilder, Status_StartsOk) {
200 EXPECT_EQ(OkStatus(), bb.status());
203 TEST(ByteBuilder, Status_StatusUpdate) {
204 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
207 EXPECT_FALSE(bb.append(buffer).ok());
208 EXPECT_EQ(Status::ResourceExhausted(), bb.status());
211 EXPECT_EQ(Status::OutOfRange(), bb.status());
213 EXPECT_FALSE(bb.append(buffer.data(), 0).ok());
214 EXPECT_EQ(Status::OutOfRange(), bb.status());
217 TEST(ByteBuilder, Status_ClearStatus_SetsStatusToOk) {
218 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
221 EXPECT_FALSE(bb.append(buffer).ok());
222 EXPECT_EQ(Status::ResourceExhausted(), bb.status());
225 EXPECT_EQ(OkStatus(), bb.status());
228 TEST(ByteBuilder, PushBack) {
230 bb.push_back(byte{0x01});
231 EXPECT_EQ(OkStatus(), bb.status());
232 EXPECT_EQ(1u, bb.size());
233 EXPECT_EQ(byte{0x01}, bb.data()[0]);
236 TEST(ByteBuilder, PushBack_Full) {
238 bb.push_back(byte{0x01});
239 EXPECT_EQ(OkStatus(), bb.status());
240 EXPECT_EQ(1u, bb.size());
243 TEST(ByteBuilder, PushBack_Full_ResourceExhausted) {
245 bb.push_back(byte{0x01});
246 bb.push_back(byte{0x01});
248 EXPECT_EQ(Status::ResourceExhausted(), bb.status());
249 EXPECT_EQ(1u, bb.size());
252 TEST(ByteBuilder, PopBack) {
253 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
256 bb.append(buffer.data(), 3);
259 EXPECT_EQ(OkStatus(), bb.status());
260 EXPECT_EQ(2u, bb.size());
261 EXPECT_EQ(byte{0x01}, bb.data()[0]);
262 EXPECT_EQ(byte{0x02}, bb.data()[1]);
265 TEST(ByteBuilder, PopBack_Empty) {
266 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
268 bb.append(buffer.data(), 3);
273 EXPECT_EQ(OkStatus(), bb.status());
274 EXPECT_EQ(0u, bb.size());
275 EXPECT_TRUE(bb.empty());
278 TEST(ByteBuffer, Assign) {
279 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
283 one.append(buffer.data(), 3);
284 EXPECT_EQ(byte{0x01}, one.data()[0]);
285 EXPECT_EQ(byte{0x02}, one.data()[1]);
286 EXPECT_EQ(byte{0x03}, one.data()[2]);
289 EXPECT_EQ(byte{0x01}, two.data()[0]);
290 EXPECT_EQ(byte{0x02}, two.data()[1]);
291 EXPECT_EQ(byte{0x03}, two.data()[2]);
293 constexpr auto kBytesTestLiteral = MakeBytes(0x04, 0x05, 0x06, 0x07);
294 one.append(kBytesTestLiteral.data(), 2);
295 two.append(kBytesTestLiteral.data(), 4);
296 EXPECT_EQ(5u, one.size());
297 EXPECT_EQ(7u, two.size());
298 EXPECT_EQ(byte{0x04}, one.data()[3]);
299 EXPECT_EQ(byte{0x05}, one.data()[4]);
300 EXPECT_EQ(byte{0x04}, two.data()[3]);
301 EXPECT_EQ(byte{0x05}, two.data()[4]);
302 EXPECT_EQ(byte{0x06}, two.data()[5]);
303 EXPECT_EQ(byte{0x07}, two.data()[6]);
305 two.push_back(byte{0x01});
306 two.push_back(byte{0x01});
307 two.push_back(byte{0x01});
308 two.push_back(byte{0x01});
309 ASSERT_EQ(Status::ResourceExhausted(), two.status());
312 EXPECT_EQ(byte{0x01}, two.data()[7]);
313 EXPECT_EQ(byte{0x01}, two.data()[8]);
314 EXPECT_EQ(byte{0x01}, two.data()[9]);
315 EXPECT_EQ(Status::ResourceExhausted(), one.status());
318 TEST(ByteBuffer, CopyConstructFromSameSize) {
320 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
322 one.append(buffer.data(), 3);
323 EXPECT_EQ(byte{0x01}, one.data()[0]);
324 EXPECT_EQ(byte{0x02}, one.data()[1]);
325 EXPECT_EQ(byte{0x03}, one.data()[2]);
327 ByteBuffer<10> two(one);
328 EXPECT_EQ(byte{0x01}, two.data()[0]);
329 EXPECT_EQ(byte{0x02}, two.data()[1]);
330 EXPECT_EQ(byte{0x03}, two.data()[2]);
333 TEST(ByteBuffer, CopyConstructFromSmaller) {
334 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
336 one.append(buffer.data(), 2);
337 ByteBuffer<3> two(one);
339 EXPECT_EQ(byte{0x01}, two.data()[0]);
340 EXPECT_EQ(byte{0x02}, two.data()[1]);
341 EXPECT_EQ(OkStatus(), two.status());
344 TEST(ByteBuilder, ResizeError_NoDataAddedAfter) {
345 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
348 EXPECT_TRUE(bb.append(buffer).ok());
350 EXPECT_EQ(3u, bb.size());
352 EXPECT_EQ(3u, bb.size());
353 EXPECT_EQ(bb.status(), Status::OutOfRange());
356 EXPECT_EQ(3u, bb.size());
357 EXPECT_EQ(bb.status(), Status::OutOfRange());
360 TEST(ByteBuilder, AddingNoBytesToZeroSizedByteBuffer) {
361 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
364 EXPECT_TRUE(bb.append(buffer.data(), 0).ok());
365 EXPECT_EQ(0u, bb.size());
368 TEST(ByteBuffer, Putting8ByteInts_Full) {
373 EXPECT_EQ(byte{0xFE}, bb.data()[0]);
374 EXPECT_EQ(byte{0x02}, bb.data()[1]);
375 EXPECT_EQ(OkStatus(), bb.status());
378 TEST(ByteBuffer, Putting8ByteInts_Exhausted) {
384 EXPECT_EQ(byte{0xFE}, bb.data()[0]);
385 EXPECT_EQ(byte{0x02}, bb.data()[1]);
386 EXPECT_EQ(Status::ResourceExhausted(), bb.status());
389 TEST(ByteBuffer, Putting16ByteInts_Full_kLittleEndian) {
392 bb.PutUint16(0x0008);
394 EXPECT_EQ(byte{0xF7}, bb.data()[0]);
395 EXPECT_EQ(byte{0xFF}, bb.data()[1]);
396 EXPECT_EQ(byte{0x08}, bb.data()[2]);
397 EXPECT_EQ(byte{0x00}, bb.data()[3]);
399 EXPECT_EQ(OkStatus(), bb.status());
402 TEST(ByteBuffer, Putting16ByteInts_Exhausted_kBigEndian) {
404 bb.PutInt16(0xFFF7, std::endian::big);
405 bb.PutUint16(0x0008, std::endian::big);
407 EXPECT_EQ(byte{0xFF}, bb.data()[0]);
408 EXPECT_EQ(byte{0xF7}, bb.data()[1]);
409 EXPECT_EQ(byte{0x00}, bb.data()[2]);
410 EXPECT_EQ(byte{0x08}, bb.data()[3]);
412 bb.PutInt16(0xFAFA, std::endian::big);
413 EXPECT_EQ(4u, bb.size());
414 EXPECT_EQ(Status::ResourceExhausted(), bb.status());
417 TEST(ByteBuffer, Putting32ByteInts_Full_kLittleEndian) {
419 bb.PutInt32(0xFFFFFFF1);
420 bb.PutUint32(0x00000014);
422 EXPECT_EQ(byte{0xF1}, bb.data()[0]);
423 EXPECT_EQ(byte{0xFF}, bb.data()[1]);
424 EXPECT_EQ(byte{0xFF}, bb.data()[2]);
425 EXPECT_EQ(byte{0xFF}, bb.data()[3]);
426 EXPECT_EQ(byte{0x14}, bb.data()[4]);
427 EXPECT_EQ(byte{0x00}, bb.data()[5]);
428 EXPECT_EQ(byte{0x00}, bb.data()[6]);
429 EXPECT_EQ(byte{0x00}, bb.data()[7]);
431 EXPECT_EQ(OkStatus(), bb.status());
434 TEST(ByteBuffer, Putting32ByteInts_Exhausted_kBigEndian) {
436 bb.PutInt32(0xF92927B2, std::endian::big);
437 bb.PutUint32(0x0C90739E, std::endian::big);
439 EXPECT_EQ(byte{0xF9}, bb.data()[0]);
440 EXPECT_EQ(byte{0x29}, bb.data()[1]);
441 EXPECT_EQ(byte{0x27}, bb.data()[2]);
442 EXPECT_EQ(byte{0xB2}, bb.data()[3]);
443 EXPECT_EQ(byte{0x0C}, bb.data()[4]);
444 EXPECT_EQ(byte{0x90}, bb.data()[5]);
445 EXPECT_EQ(byte{0x73}, bb.data()[6]);
446 EXPECT_EQ(byte{0x9E}, bb.data()[7]);
448 bb.PutInt32(-114743374, std::endian::big);
449 EXPECT_EQ(8u, bb.size());
450 EXPECT_EQ(Status::ResourceExhausted(), bb.status());
453 TEST(ByteBuffer, Putting64ByteInts_Full_kLittleEndian) {
455 bb.PutInt64(0x000001E8A7A0D569);
456 bb.PutUint64(0xFFFFFE17585F2A97);
458 EXPECT_EQ(byte{0x69}, bb.data()[0]);
459 EXPECT_EQ(byte{0xD5}, bb.data()[1]);
460 EXPECT_EQ(byte{0xA0}, bb.data()[2]);
461 EXPECT_EQ(byte{0xA7}, bb.data()[3]);
462 EXPECT_EQ(byte{0xE8}, bb.data()[4]);
463 EXPECT_EQ(byte{0x01}, bb.data()[5]);
464 EXPECT_EQ(byte{0x00}, bb.data()[6]);
465 EXPECT_EQ(byte{0x00}, bb.data()[7]);
466 EXPECT_EQ(byte{0x97}, bb.data()[8]);
467 EXPECT_EQ(byte{0x2A}, bb.data()[9]);
468 EXPECT_EQ(byte{0x5F}, bb.data()[10]);
469 EXPECT_EQ(byte{0x58}, bb.data()[11]);
470 EXPECT_EQ(byte{0x17}, bb.data()[12]);
471 EXPECT_EQ(byte{0xFE}, bb.data()[13]);
472 EXPECT_EQ(byte{0xFF}, bb.data()[14]);
473 EXPECT_EQ(byte{0xFF}, bb.data()[15]);
475 EXPECT_EQ(OkStatus(), bb.status());
478 TEST(ByteBuffer, Putting64ByteInts_Exhausted_kBigEndian) {
480 bb.PutUint64(0x000001E8A7A0D569, std::endian::big);
481 bb.PutInt64(0xFFFFFE17585F2A97, std::endian::big);
483 EXPECT_EQ(byte{0x00}, bb.data()[0]);
484 EXPECT_EQ(byte{0x00}, bb.data()[1]);
485 EXPECT_EQ(byte{0x01}, bb.data()[2]);
486 EXPECT_EQ(byte{0xE8}, bb.data()[3]);
487 EXPECT_EQ(byte{0xA7}, bb.data()[4]);
488 EXPECT_EQ(byte{0xA0}, bb.data()[5]);
489 EXPECT_EQ(byte{0xD5}, bb.data()[6]);
490 EXPECT_EQ(byte{0x69}, bb.data()[7]);
491 EXPECT_EQ(byte{0xFF}, bb.data()[8]);
492 EXPECT_EQ(byte{0xFF}, bb.data()[9]);
493 EXPECT_EQ(byte{0xFE}, bb.data()[10]);
494 EXPECT_EQ(byte{0x17}, bb.data()[11]);
495 EXPECT_EQ(byte{0x58}, bb.data()[12]);
496 EXPECT_EQ(byte{0x5F}, bb.data()[13]);
497 EXPECT_EQ(byte{0x2A}, bb.data()[14]);
498 EXPECT_EQ(byte{0x97}, bb.data()[15]);
500 bb.PutInt64(-6099875637501324530, std::endian::big);
501 EXPECT_EQ(16u, bb.size());
502 EXPECT_EQ(Status::ResourceExhausted(), bb.status());
505 TEST(ByteBuffer, PuttingInts_MixedTypes_MixedEndian) {
508 bb.PutInt16(0xFD6D, std::endian::big);
509 bb.PutUint32(0x482B3D9E);
510 bb.PutInt64(0x9A1C3641843DF317, std::endian::big);
513 EXPECT_EQ(byte{0x03}, bb.data()[0]);
514 EXPECT_EQ(byte{0xFD}, bb.data()[1]);
515 EXPECT_EQ(byte{0x6D}, bb.data()[2]);
516 EXPECT_EQ(byte{0x9E}, bb.data()[3]);
517 EXPECT_EQ(byte{0x3D}, bb.data()[4]);
518 EXPECT_EQ(byte{0x2B}, bb.data()[5]);
519 EXPECT_EQ(byte{0x48}, bb.data()[6]);
520 EXPECT_EQ(byte{0x9A}, bb.data()[7]);
521 EXPECT_EQ(byte{0x1C}, bb.data()[8]);
522 EXPECT_EQ(byte{0x36}, bb.data()[9]);
523 EXPECT_EQ(byte{0x41}, bb.data()[10]);
524 EXPECT_EQ(byte{0x84}, bb.data()[11]);
525 EXPECT_EQ(byte{0x3D}, bb.data()[12]);
526 EXPECT_EQ(byte{0xF3}, bb.data()[13]);
527 EXPECT_EQ(byte{0x17}, bb.data()[14]);
528 EXPECT_EQ(byte{0xFB}, bb.data()[15]);
530 EXPECT_EQ(OkStatus(), bb.status());
533 TEST(ByteBuffer, Iterator) {
534 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
536 EXPECT_TRUE(bb.append(buffer).ok());
538 auto it = bb.begin();
539 EXPECT_EQ(*it, byte{0x01});
542 EXPECT_EQ(*it, byte{0x02});
543 EXPECT_EQ(it - bb.begin(), 1);
546 EXPECT_EQ(*it, byte{0x03});
547 EXPECT_EQ(it - bb.begin(), 2);
550 EXPECT_EQ(it, bb.end());
551 EXPECT_EQ(static_cast<size_t>(it - bb.begin()), bb.size());
554 TEST(ByteBuffer, Iterator_PreIncrement) {
555 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
557 EXPECT_TRUE(bb.append(buffer).ok());
559 auto it = bb.begin();
560 EXPECT_EQ(*(++it), byte{0x02});
563 TEST(ByteBuffer, Iterator_PostIncrement) {
564 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
566 EXPECT_TRUE(bb.append(buffer).ok());
568 auto it = bb.begin();
569 EXPECT_EQ(*(it++), byte{0x01});
570 EXPECT_EQ(*it, byte{0x02});
571 EXPECT_EQ(*(it++), byte{0x02});
572 EXPECT_EQ(*it, byte{0x03});
575 TEST(ByteBuffer, Iterator_PreDecrement) {
576 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
578 EXPECT_TRUE(bb.append(buffer).ok());
579 auto it = bb.begin();
581 EXPECT_EQ(*it, byte{0x01});
583 EXPECT_EQ(*it, byte{0x02});
585 EXPECT_EQ(*it, byte{0x03});
587 EXPECT_EQ(it, bb.end());
590 EXPECT_EQ(*it, byte{0x03});
592 EXPECT_EQ(*it, byte{0x02});
594 EXPECT_EQ(*it, byte{0x01});
595 EXPECT_EQ(it, bb.begin());
598 TEST(ByteBuffer, Iterator_PostDecrement) {
599 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
601 EXPECT_TRUE(bb.append(buffer).ok());
602 auto it = bb.begin();
605 EXPECT_EQ(*it, byte{0x03});
607 EXPECT_EQ(*(it--), byte{0x03});
608 EXPECT_EQ(*it, byte{0x02});
609 EXPECT_EQ(*(it--), byte{0x02});
610 EXPECT_EQ(*it, byte{0x01});
613 TEST(ByteBuffer, Iterator_PlusEquals) {
614 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
616 EXPECT_TRUE(bb.append(buffer).ok());
617 auto it = bb.begin();
620 EXPECT_EQ(*it, byte{0x03});
623 EXPECT_EQ(*it, byte{0x02});
626 EXPECT_EQ(*it, byte{0x03});
629 EXPECT_EQ(*it, byte{0x01});
632 TEST(ByteBuffer, Iterator_MinusEquals) {
633 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
635 EXPECT_TRUE(bb.append(buffer).ok());
636 auto it = bb.begin();
639 EXPECT_EQ(*it, byte{0x03});
642 EXPECT_EQ(*it, byte{0x02});
645 EXPECT_EQ(*it, byte{0x03});
648 EXPECT_EQ(*it, byte{0x01});
651 TEST(ByteBuffer, Iterator_Plus) {
652 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
654 EXPECT_TRUE(bb.append(buffer).ok());
655 auto it = bb.begin();
658 EXPECT_EQ(*test, byte{0x03});
661 EXPECT_EQ(*test, byte{0x02});
664 EXPECT_EQ(*test, byte{0x03});
667 EXPECT_EQ(*test, byte{0x01});
670 TEST(ByteBuffer, Iterator_Minus) {
671 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
673 EXPECT_TRUE(bb.append(buffer).ok());
674 auto it = bb.begin();
676 auto test = it - (-2);
677 EXPECT_EQ(*test, byte{0x03});
680 EXPECT_EQ(*test, byte{0x02});
683 EXPECT_EQ(*test, byte{0x03});
686 EXPECT_EQ(*test, byte{0x01});
689 TEST(ByteBuffer, Iterator_LessThan) {
690 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
692 EXPECT_TRUE(bb.append(buffer).ok());
694 auto it_1 = bb.begin();
695 auto it_2 = it_1 + 2;
696 EXPECT_EQ(*it_1, byte{0x01});
697 EXPECT_EQ(*it_2, byte{0x03});
698 EXPECT_TRUE(it_1 < it_2);
702 EXPECT_EQ(*it_1, byte{0x02});
703 EXPECT_EQ(*it_2, byte{0x02});
704 EXPECT_FALSE(it_1 < it_2);
708 EXPECT_EQ(*it_1, byte{0x03});
709 EXPECT_EQ(*it_2, byte{0x01});
710 EXPECT_FALSE(it_1 < it_2);
711 EXPECT_TRUE(it_2 < it_1);
714 TEST(ByteBuffer, Iterator_GreaterThan) {
715 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
717 EXPECT_TRUE(bb.append(buffer).ok());
719 auto it_1 = bb.begin();
720 auto it_2 = it_1 + 2;
721 EXPECT_EQ(*it_1, byte{0x01});
722 EXPECT_EQ(*it_2, byte{0x03});
723 EXPECT_FALSE(it_1 > it_2);
727 EXPECT_EQ(*it_1, byte{0x02});
728 EXPECT_EQ(*it_2, byte{0x02});
729 EXPECT_FALSE(it_1 > it_2);
733 EXPECT_EQ(*it_1, byte{0x03});
734 EXPECT_EQ(*it_2, byte{0x01});
735 EXPECT_TRUE(it_1 > it_2);
736 EXPECT_FALSE(it_2 > it_1);
739 TEST(ByteBuffer, Iterator_LessThanEqual_GreaterThanEqual) {
740 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
742 EXPECT_TRUE(bb.append(buffer).ok());
744 auto it_1 = bb.begin();
745 auto it_2 = it_1 + 2;
746 EXPECT_EQ(*it_1, byte{0x01});
747 EXPECT_EQ(*it_2, byte{0x03});
748 EXPECT_FALSE(it_1 >= it_2);
749 EXPECT_TRUE(it_1 <= it_2);
753 EXPECT_EQ(*it_1, byte{0x02});
754 EXPECT_EQ(*it_2, byte{0x02});
755 EXPECT_TRUE(it_1 >= it_2);
756 EXPECT_TRUE(it_1 <= it_2);
760 EXPECT_EQ(*it_1, byte{0x03});
761 EXPECT_EQ(*it_2, byte{0x01});
762 EXPECT_FALSE(it_1 <= it_2);
763 EXPECT_TRUE(it_1 >= it_2);
766 TEST(ByteBuffer, Iterator_Indexing) {
767 std::array<byte, 3> buffer = MakeBytes(0x01, 0x02, 0x03);
769 EXPECT_TRUE(bb.append(buffer).ok());
771 auto it = bb.begin();
772 EXPECT_EQ(it[0], byte{0x01});
773 EXPECT_EQ(it[1], byte{0x02});
774 EXPECT_EQ(it[2], byte{0x03});
777 TEST(ByteBuffer, Iterator_PeekValues_1Byte) {
783 auto it = bb.begin();
784 EXPECT_EQ(it.PeekInt8(), int8_t(0xF2));
786 EXPECT_EQ(it.PeekUint8(), uint8_t(0xE5));
788 EXPECT_EQ(it.PeekInt8(), int8_t(0x5F));
791 TEST(ByteBuffer, Iterator_PeekValues_2Bytes) {
794 bb.PutUint16(0xF929, std::endian::big);
796 auto it = bb.begin();
797 EXPECT_EQ(it.PeekInt16(), int16_t(0xA7F1));
799 EXPECT_EQ(it.PeekUint16(std::endian::big), uint16_t(0xF929));
802 TEST(ByteBuffer, Iterator_PeekValues_4Bytes) {
804 bb.PutInt32(0xFFFFFFF1);
805 bb.PutUint32(0xF92927B2, std::endian::big);
807 auto it = bb.begin();
808 EXPECT_EQ(it.PeekInt32(), int32_t(0xFFFFFFF1));
810 EXPECT_EQ(it.PeekUint32(std::endian::big), uint32_t(0xF92927B2));
813 TEST(ByteBuffer, Iterator_PeekValues_8Bytes) {
815 bb.PutUint64(0x000001E8A7A0D569);
816 bb.PutInt64(0xFFFFFE17585F2A97, std::endian::big);
818 auto it = bb.begin();
819 EXPECT_EQ(it.PeekUint64(), uint64_t(0x000001E8A7A0D569));
821 EXPECT_EQ(it.PeekInt64(std::endian::big), int64_t(0xFFFFFE17585F2A97));
824 TEST(ByteBuffer, Iterator_ReadValues_1Byte) {
830 auto it = bb.begin();
831 EXPECT_EQ(it.ReadInt8(), int8_t(0xF2));
832 EXPECT_EQ(it.ReadUint8(), uint8_t(0xE5));
833 EXPECT_EQ(it.ReadInt8(), int8_t(0x5F));
836 TEST(ByteBuffer, Iterator_ReadValues_2Bytes) {
839 bb.PutUint16(0xF929, std::endian::big);
841 auto it = bb.begin();
842 EXPECT_EQ(it.ReadInt16(), int16_t(0xA7F1));
843 EXPECT_EQ(it.ReadUint16(std::endian::big), uint16_t(0xF929));
846 TEST(ByteBuffer, Iterator_ReadValues_4Bytes) {
848 bb.PutInt32(0xFFFFFFF1);
849 bb.PutUint32(0xF92927B2, std::endian::big);
851 auto it = bb.begin();
852 EXPECT_EQ(it.ReadInt32(), int32_t(0xFFFFFFF1));
853 EXPECT_EQ(it.ReadUint32(std::endian::big), uint32_t(0xF92927B2));
856 TEST(ByteBuffer, Iterator_ReadValues_8Bytes) {
858 bb.PutUint64(0x000001E8A7A0D569);
859 bb.PutInt64(0xFFFFFE17585F2A97, std::endian::big);
861 auto it = bb.begin();
862 EXPECT_EQ(it.ReadUint64(), uint64_t(0x000001E8A7A0D569));
863 EXPECT_EQ(it.ReadInt64(std::endian::big), int64_t(0xFFFFFE17585F2A97));