13#include <gtest/gtest.h>
26TEST(WireWriterTest, PutBigEndianU8)
28 std::vector<std::uint8_t> data;
30 PutBigEndian<std::uint8_t>(data, 0x42U);
32 EXPECT_EQ(data, (std::vector<std::uint8_t>{0x42U}));
37TEST(WireWriterTest, PutBigEndianU16)
39 std::vector<std::uint8_t> data;
41 PutBigEndian<std::uint16_t>(data, 0x1234U);
43 EXPECT_EQ(data, (std::vector<std::uint8_t>{0x12U, 0x34U}));
48TEST(WireWriterTest, PutBigEndianU32)
50 std::vector<std::uint8_t> data;
52 PutBigEndian<std::uint32_t>(data, 0x12345678U);
56 (std::vector<std::uint8_t>{
66TEST(WireWriterTest, PutBigEndianU64)
68 std::vector<std::uint8_t> data;
70 PutBigEndian<std::uint64_t>(data, 0x0123456789ABCDEFULL);
74 (std::vector<std::uint8_t>{
87TEST(WireWriterTest, PutBigEndianZero)
89 std::vector<std::uint8_t> data;
91 PutBigEndian<std::uint32_t>(data, 0U);
95 (std::vector<std::uint8_t>{
104TEST(WireWriterTest, PutBigEndianMaximumU32)
106 std::vector<std::uint8_t> data;
108 PutBigEndian<std::uint32_t>(data, UINT32_MAX);
112 (std::vector<std::uint8_t>{
122TEST(WireWriterTest, PutBigEndianAppends)
124 std::vector<std::uint8_t> data = {
129 PutBigEndian<std::uint16_t>(data, 0x1234U);
133 (std::vector<std::uint8_t>{
142TEST(WireWriterTest, PutLittleEndianU8)
144 std::vector<std::uint8_t> data;
146 PutLittleEndian<std::uint8_t>(data, 0x42U);
148 EXPECT_EQ(data, (std::vector<std::uint8_t>{0x42U}));
153TEST(WireWriterTest, PutLittleEndianU16)
155 std::vector<std::uint8_t> data;
157 PutLittleEndian<std::uint16_t>(data, 0x1234U);
159 EXPECT_EQ(data, (std::vector<std::uint8_t>{0x34U, 0x12U}));
164TEST(WireWriterTest, PutLittleEndianU32)
166 std::vector<std::uint8_t> data;
168 PutLittleEndian<std::uint32_t>(data, 0x12345678U);
172 (std::vector<std::uint8_t>{
182TEST(WireWriterTest, PutLittleEndianU64)
184 std::vector<std::uint8_t> data;
186 PutLittleEndian<std::uint64_t>(data, 0x0123456789ABCDEFULL);
190 (std::vector<std::uint8_t>{
203TEST(WireWriterTest, PutLittleEndianZero)
205 std::vector<std::uint8_t> data;
207 PutLittleEndian<std::uint32_t>(data, 0U);
211 (std::vector<std::uint8_t>{
220TEST(WireWriterTest, PutLittleEndianMaximumU32)
222 std::vector<std::uint8_t> data;
224 PutLittleEndian<std::uint32_t>(data, UINT32_MAX);
228 (std::vector<std::uint8_t>{
238TEST(WireWriterTest, PutLittleEndianAppends)
240 std::vector<std::uint8_t> data = {
245 PutLittleEndian<std::uint16_t>(data, 0x1234U);
249 (std::vector<std::uint8_t>{
259TEST(WireWriterTest, PutLittleEndianPointerU16)
261 std::array<std::uint8_t, 4U> data = {
268 PutLittleEndian<std::uint16_t>(data.data() + 1U, 0x1234U);
272 (std::array<std::uint8_t, 4U>{
282TEST(WireWriterTest, PutLittleEndianPointerU32)
284 std::array<std::uint8_t, 6U> data = {
293 PutLittleEndian<std::uint32_t>(data.data() + 1U, 0x12345678U);
297 (std::array<std::uint8_t, 6U>{
310 std::vector<std::uint8_t> data = {0xAAU};
314 EXPECT_EQ(data, (std::vector<std::uint8_t>{0xAAU, 0x42U}));
321 std::vector<std::uint8_t> data;
325 EXPECT_EQ(data, (std::vector<std::uint8_t>{0x12U, 0x34U}));
332 std::vector<std::uint8_t> data;
334 PutU32(data, 0x12345678U);
338 (std::vector<std::uint8_t>{
349 const std::array<std::uint8_t, 3U> source = {
354 std::vector<std::uint8_t> data = {0xAAU};
356 PutBytes(data, source.data(), source.size());
360 (std::vector<std::uint8_t>{
370TEST(WireWriterTest, PutBytesZeroLength)
372 const std::array<std::uint8_t, 1U> source = {0x42U};
373 std::vector<std::uint8_t> data = {0xAAU};
377 EXPECT_EQ(data, (std::vector<std::uint8_t>{0xAAU}));
381TEST(WireWriterTest, PutFixedArray)
383 const std::array<std::uint8_t, 3U> source = {
388 std::vector<std::uint8_t> data = {0xAAU};
394 (std::vector<std::uint8_t>{
403TEST(WireWriterTest, PutFixedEmptyArray)
405 const std::array<std::uint8_t, 0U> source{};
406 std::vector<std::uint8_t> data = {0xAAU};
410 EXPECT_EQ(data, (std::vector<std::uint8_t>{0xAAU}));
414TEST(WireWriterTest, PutFixedVector)
416 const std::vector<std::uint8_t> source = {
421 std::vector<std::uint8_t> data = {0xAAU};
427 (std::vector<std::uint8_t>{
436TEST(WireWriterTest, PutFixedEmptyVector)
438 const std::vector<std::uint8_t> source;
439 std::vector<std::uint8_t> data = {0xAAU};
443 EXPECT_EQ(data, (std::vector<std::uint8_t>{0xAAU}));
448TEST(WireWriterTest, PutFixedString)
450 const std::string source =
"ABC";
451 std::vector<std::uint8_t> data;
457 (std::vector<std::uint8_t>{
465TEST(WireWriterTest, PutFixedEmptyString)
467 const std::string source;
468 std::vector<std::uint8_t> data = {0xAAU};
472 EXPECT_EQ(data, (std::vector<std::uint8_t>{0xAAU}));
476TEST(WireReaderTest, ReadBigEndianU8)
478 const std::array<std::uint8_t, 1U> data = {0x42U};
480 EXPECT_EQ(ReadBigEndian<std::uint8_t>(data.data()), 0x42U);
484TEST(WireReaderTest, ReadBigEndianU16)
486 const std::array<std::uint8_t, 2U> data = {
491 EXPECT_EQ(ReadBigEndian<std::uint16_t>(data.data()), 0x1234U);
495TEST(WireReaderTest, ReadBigEndianU32)
497 const std::array<std::uint8_t, 4U> data = {
504 EXPECT_EQ(ReadBigEndian<std::uint32_t>(data.data()), 0x12345678U);
508TEST(WireReaderTest, ReadBigEndianU64)
510 const std::array<std::uint8_t, 8U> data = {
522 ReadBigEndian<std::uint64_t>(data.data()),
523 0x0123456789ABCDEFULL);
527TEST(WireReaderTest, ReadBigEndianZero)
529 const std::array<std::uint8_t, 4U> data = {
536 EXPECT_EQ(ReadBigEndian<std::uint32_t>(data.data()), 0U);
540TEST(WireReaderTest, ReadBigEndianMaximumU32)
542 const std::array<std::uint8_t, 4U> data = {
549 EXPECT_EQ(ReadBigEndian<std::uint32_t>(data.data()), UINT32_MAX);
553TEST(WireReaderTest, ReadLittleEndianU8)
555 const std::array<std::uint8_t, 1U> data = {0x42U};
557 EXPECT_EQ(ReadLittleEndian<std::uint8_t>(data.data()), 0x42U);
561TEST(WireReaderTest, ReadLittleEndianU16)
563 const std::array<std::uint8_t, 2U> data = {
568 EXPECT_EQ(ReadLittleEndian<std::uint16_t>(data.data()), 0x1234U);
572TEST(WireReaderTest, ReadLittleEndianU32)
574 const std::array<std::uint8_t, 4U> data = {
581 EXPECT_EQ(ReadLittleEndian<std::uint32_t>(data.data()), 0x12345678U);
585TEST(WireReaderTest, ReadLittleEndianU64)
587 const std::array<std::uint8_t, 8U> data = {
599 ReadLittleEndian<std::uint64_t>(data.data()),
600 0x0123456789ABCDEFULL);
604TEST(WireReaderTest, ReadLittleEndianZero)
606 const std::array<std::uint8_t, 4U> data = {
613 EXPECT_EQ(ReadLittleEndian<std::uint32_t>(data.data()), 0U);
617TEST(WireReaderTest, ReadLittleEndianMaximumU32)
619 const std::array<std::uint8_t, 4U> data = {
626 EXPECT_EQ(ReadLittleEndian<std::uint32_t>(data.data()), UINT32_MAX);
630TEST(WireReaderTest, ReaderReadsU8)
632 const std::vector<std::uint8_t> data = {0x42U};
636 EXPECT_EQ(reader.
U8(), 0x42U);
642TEST(WireReaderTest, ReaderRejectsU8PastEnd)
644 const std::vector<std::uint8_t> data;
648 EXPECT_THROW((
void)reader.
U8(), std::out_of_range);
655TEST(WireReaderTest, ReaderReadsBigEndianU16)
657 const std::vector<std::uint8_t> data = {
665 EXPECT_EQ(reader.
U16(), 0x1234U);
672TEST(WireReaderTest, ReaderReadsBigEndianU32)
674 const std::vector<std::uint8_t> data = {
684 EXPECT_EQ(reader.
U32(), 0x12345678U);
691TEST(WireReaderTest, ReaderReadsLittleEndianU16)
693 const std::vector<std::uint8_t> data = {
708TEST(WireReaderTest, ReaderReadsLittleEndianU32)
710 const std::vector<std::uint8_t> data = {
727TEST(WireReaderTest, ReaderReadsConsecutiveLittleEndianValues)
729 const std::vector<std::uint8_t> data = {
748TEST(WireReaderTest, ReaderMixesEndianReads)
750 const std::vector<std::uint8_t> data = {
761 EXPECT_EQ(reader.
U16(), 0x1234U);
763 EXPECT_EQ(reader.
U16(), 0xABCDU);
769TEST(WireReaderTest, ReaderRejectsLittleEndianU16PastEnd)
771 const std::vector<std::uint8_t> data = {
784TEST(WireReaderTest, ReaderRejectsLittleEndianU32PastEnd)
786 const std::vector<std::uint8_t> data = {
801TEST(WireReaderTest, ReaderRejectsU16PastEnd)
803 const std::vector<std::uint8_t> data = {
809 EXPECT_THROW((
void)reader.
U16(), std::out_of_range);
816TEST(WireReaderTest, ReaderRejectsU32PastEnd)
818 const std::vector<std::uint8_t> data = {
826 EXPECT_THROW((
void)reader.
U32(), std::out_of_range);
833TEST(WireReaderTest, ReaderReadBytes)
835 const std::vector<std::uint8_t> data = {
844 const std::vector<std::uint8_t> result = reader.
ReadBytes(2U);
846 EXPECT_EQ(result, (std::vector<std::uint8_t>{0x10U, 0x20U}));
853TEST(WireReaderTest, ReaderReadBytesZeroLength)
855 const std::vector<std::uint8_t> data = {
862 const std::vector<std::uint8_t> result = reader.
ReadBytes(0U);
864 EXPECT_TRUE(result.empty());
871TEST(WireReaderTest, ReaderRejectsReadBytesPastEnd)
873 const std::vector<std::uint8_t> data = {
881 EXPECT_THROW((
void)reader.
ReadBytes(4U), std::out_of_range);
887TEST(WireReaderTest, ReaderFixedArray)
889 const std::vector<std::uint8_t> data = {
898 const std::array<std::uint8_t, 3U> result = reader.
Fixed<3U>();
902 (std::array<std::uint8_t, 3U>{
913TEST(WireReaderTest, ReaderFixedEmptyArray)
915 const std::vector<std::uint8_t> data = {
922 const auto result = reader.
Fixed<0U>();
924 EXPECT_EQ(result, (std::array<std::uint8_t, 0U>{}));
931TEST(WireReaderTest, ReaderRejectsFixedArrayPastEnd)
933 const std::vector<std::uint8_t> data = {
940 EXPECT_THROW((
void)reader.
Fixed<3U>(), std::out_of_range);
946TEST(WireReaderTest, ReaderSkip)
948 const std::vector<std::uint8_t> data = {
962 EXPECT_EQ(reader.
U16(), 0x1234U);
965 EXPECT_EQ(reader.
U8(), 0x56U);
971TEST(WireReaderTest, ReaderSkipZero)
973 const std::vector<std::uint8_t> data = {
988TEST(WireReaderTest, ReaderRejectsSkipPastEnd)
990 const std::vector<std::uint8_t> data = {
998 EXPECT_THROW(reader.
Skip(4U), std::out_of_range);
1006 const std::vector<std::uint8_t> data = {
1019 EXPECT_EQ(reader.
U16(), 0x1234U);
1024TEST(WireReaderTest, ReaderSkipToMovesBackwards)
1026 const std::vector<std::uint8_t> data = {
1039 EXPECT_EQ(reader.
U16(), 0x3456U);
1043TEST(WireReaderTest, ReaderRejectsSkipToPastEnd)
1045 const std::vector<std::uint8_t> data = {
1053 EXPECT_THROW(reader.
SkipTo(4U), std::out_of_range);
1058TEST(WireReaderTest, ReaderAllowsSkipToEnd)
1060 const std::vector<std::uint8_t> data = {
1068 reader.
SkipTo(data.size());
1070 EXPECT_EQ(reader.
Position(), data.size());
1076TEST(WireReaderTest, ReaderNeedExactRemaining)
1078 const std::vector<std::uint8_t> data = {
1085 EXPECT_NO_THROW(reader.
Need(2U));
1090TEST(WireReaderTest, ReaderNeedZero)
1092 const std::vector<std::uint8_t> data;
1096 EXPECT_NO_THROW(reader.
Need(0U));
1100TEST(WireReaderTest, ReaderCursorPointsToCurrentPosition)
1102 const std::vector<std::uint8_t> data = {
1110 EXPECT_EQ(*reader.
Cursor(), 0xAAU);
1114 EXPECT_EQ(*reader.
Cursor(), 0xCCU);
1119TEST(WireReaderTest, ReaderRemainingTracksPosition)
1121 const std::vector<std::uint8_t> data = {
1148TEST(WireReaderTest, ReaderRawPointerConstructor)
1150 const std::array<std::uint8_t, 3U> data = {
1156 Reader reader(data.data(), data.size());
1158 EXPECT_EQ(reader.
U16(), 0x1234U);
1159 EXPECT_EQ(reader.
U8(), 0x56U);
1164TEST(WireReaderTest, ReaderSpanConstructor)
1166 const std::array<std::uint8_t, 2U> data = {
1171 const std::span<const std::uint8_t> bytes(data);
1175 EXPECT_EQ(reader.
U16(), 0x1234U);
1181TEST(WireReaderTest, ReaderEmptyVector)
1183 const std::vector<std::uint8_t> data;
1189 EXPECT_THROW((
void)reader.
U8(), std::out_of_range);
Lightweight cursor for parsing a big-endian byte buffer without copies.
std::uint8_t U8()
Read and consume one byte.
const std::uint8_t * Cursor() const
Pointer to the next unread byte.
std::size_t Position() const
Current read offset from the start of the buffer.
std::uint32_t U32()
Read and consume a big-endian 32-bit value.
std::size_t Remaining() const
Number of bytes not yet consumed.
std::array< std::uint8_t, N > Fixed()
Read and consume a fixed-size byte array.
void SkipTo(std::size_t offset)
Move the read position to an absolute byte offset.
std::uint32_t U32LittleEndian()
Read and consume a little-endian 32-bit value.
void Need(std::size_t n) const
Assert that at least n bytes remain.
void Skip(std::size_t n)
Advance the read position without returning the skipped bytes.
std::vector< std::uint8_t > ReadBytes(std::size_t n)
Read and consume a variable-length byte range.
std::uint16_t U16()
Read and consume a big-endian 16-bit value.
std::uint16_t U16LittleEndian()
Read and consume a little-endian 16-bit value.
void PutBytes(std::vector< std::uint8_t > &out, const std::uint8_t *data, std::size_t len)
Append a raw byte range to a buffer.
void PutFixed(std::vector< std::uint8_t > &out, const std::array< std::uint8_t, N > &data)
Append a fixed-size byte array to a buffer.
void PutU8(std::vector< std::uint8_t > &out, std::uint8_t value)
Append a single byte to a buffer.
void PutU16(std::vector< std::uint8_t > &out, std::uint16_t value)
Append a 16-bit value to a buffer in big-endian order.
TEST(WireWriterTest, PutBigEndianU8)
void PutU32(std::vector< std::uint8_t > &out, std::uint32_t value)
Append a 32-bit value to a buffer in big-endian order.
Generic helpers for reading and writing integer and byte data in big- and little-endian wire formats.