1*61c4878aSAndroid Build Coastguard Worker // Copyright 2019 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker #include "pw_varint/varint.h"
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Worker #include <cinttypes>
18*61c4878aSAndroid Build Coastguard Worker #include <cstdint>
19*61c4878aSAndroid Build Coastguard Worker #include <cstring>
20*61c4878aSAndroid Build Coastguard Worker #include <limits>
21*61c4878aSAndroid Build Coastguard Worker
22*61c4878aSAndroid Build Coastguard Worker #include "pw_fuzzer/fuzztest.h"
23*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
24*61c4878aSAndroid Build Coastguard Worker
25*61c4878aSAndroid Build Coastguard Worker namespace pw::varint {
26*61c4878aSAndroid Build Coastguard Worker namespace {
27*61c4878aSAndroid Build Coastguard Worker
28*61c4878aSAndroid Build Coastguard Worker extern "C" {
29*61c4878aSAndroid Build Coastguard Worker
30*61c4878aSAndroid Build Coastguard Worker // Functions defined in varint_test.c which call the varint API from C.
31*61c4878aSAndroid Build Coastguard Worker size_t pw_varint_CallEncode32(uint32_t integer,
32*61c4878aSAndroid Build Coastguard Worker void* output,
33*61c4878aSAndroid Build Coastguard Worker size_t output_size_bytes);
34*61c4878aSAndroid Build Coastguard Worker size_t pw_varint_CallEncode64(uint64_t integer,
35*61c4878aSAndroid Build Coastguard Worker void* output,
36*61c4878aSAndroid Build Coastguard Worker size_t output_size_bytes);
37*61c4878aSAndroid Build Coastguard Worker size_t pw_varint_CallZigZagAndVarintEncode64(int64_t integer,
38*61c4878aSAndroid Build Coastguard Worker void* output,
39*61c4878aSAndroid Build Coastguard Worker size_t output_size_bytes);
40*61c4878aSAndroid Build Coastguard Worker size_t pw_varint_CallDecode32(void* input, size_t input_size, uint32_t* output);
41*61c4878aSAndroid Build Coastguard Worker size_t pw_varint_CallDecode64(void* input, size_t input_size, uint64_t* output);
42*61c4878aSAndroid Build Coastguard Worker size_t pw_varint_CallZigZagAndVarintDecode64(void* input,
43*61c4878aSAndroid Build Coastguard Worker size_t input_size,
44*61c4878aSAndroid Build Coastguard Worker int64_t* output);
45*61c4878aSAndroid Build Coastguard Worker
46*61c4878aSAndroid Build Coastguard Worker } // extern "C"
47*61c4878aSAndroid Build Coastguard Worker
48*61c4878aSAndroid Build Coastguard Worker class VarintWithBuffer : public ::testing::Test {
49*61c4878aSAndroid Build Coastguard Worker protected:
VarintWithBuffer()50*61c4878aSAndroid Build Coastguard Worker VarintWithBuffer()
51*61c4878aSAndroid Build Coastguard Worker : buffer_{std::byte{'a'},
52*61c4878aSAndroid Build Coastguard Worker std::byte{'b'},
53*61c4878aSAndroid Build Coastguard Worker std::byte{'c'},
54*61c4878aSAndroid Build Coastguard Worker std::byte{'d'},
55*61c4878aSAndroid Build Coastguard Worker std::byte{'e'},
56*61c4878aSAndroid Build Coastguard Worker std::byte{'f'},
57*61c4878aSAndroid Build Coastguard Worker std::byte{'g'},
58*61c4878aSAndroid Build Coastguard Worker std::byte{'h'},
59*61c4878aSAndroid Build Coastguard Worker std::byte{'i'},
60*61c4878aSAndroid Build Coastguard Worker std::byte{'j'}} {}
61*61c4878aSAndroid Build Coastguard Worker std::byte buffer_[10];
62*61c4878aSAndroid Build Coastguard Worker };
63*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeUnsigned32_SmallSingleByte)64*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeUnsigned32_SmallSingleByte) {
65*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(UINT32_C(0), buffer_));
66*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{0}, buffer_[0]);
67*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(UINT32_C(1), buffer_));
68*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{1}, buffer_[0]);
69*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(UINT32_C(2), buffer_));
70*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{2}, buffer_[0]);
71*61c4878aSAndroid Build Coastguard Worker }
72*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeUnsigned32_SmallSingleByte_C)73*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeUnsigned32_SmallSingleByte_C) {
74*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, pw_varint_CallEncode64(UINT32_C(0), buffer_, sizeof(buffer_)));
75*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{0}, buffer_[0]);
76*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, pw_varint_CallEncode64(UINT32_C(1), buffer_, sizeof(buffer_)));
77*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{1}, buffer_[0]);
78*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, pw_varint_CallEncode64(UINT32_C(2), buffer_, sizeof(buffer_)));
79*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{2}, buffer_[0]);
80*61c4878aSAndroid Build Coastguard Worker }
81*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeUnsigned32_LargeSingleByte)82*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeUnsigned32_LargeSingleByte) {
83*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(UINT32_C(63), buffer_));
84*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{63}, buffer_[0]);
85*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(UINT32_C(64), buffer_));
86*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{64}, buffer_[0]);
87*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(UINT32_C(126), buffer_));
88*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{126}, buffer_[0]);
89*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(UINT32_C(127), buffer_));
90*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{127}, buffer_[0]);
91*61c4878aSAndroid Build Coastguard Worker }
92*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeUnsigned32_LargeSingleByte_C)93*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeUnsigned32_LargeSingleByte_C) {
94*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, pw_varint_CallEncode64(UINT32_C(63), buffer_, sizeof(buffer_)));
95*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{63}, buffer_[0]);
96*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, pw_varint_CallEncode64(UINT32_C(64), buffer_, sizeof(buffer_)));
97*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{64}, buffer_[0]);
98*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
99*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode64(UINT32_C(126), buffer_, sizeof(buffer_)));
100*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{126}, buffer_[0]);
101*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
102*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode64(UINT32_C(127), buffer_, sizeof(buffer_)));
103*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{127}, buffer_[0]);
104*61c4878aSAndroid Build Coastguard Worker }
105*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeUnsigned32_MultiByte)106*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeUnsigned32_MultiByte) {
107*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u, Encode(UINT32_C(128), buffer_));
108*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x80\x01", buffer_, 2), 0);
109*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u, Encode(UINT32_C(129), buffer_));
110*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x81\x01", buffer_, 2), 0);
111*61c4878aSAndroid Build Coastguard Worker
112*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(5u, Encode(std::numeric_limits<uint32_t>::max() - 1, buffer_));
113*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xfe\xff\xff\xff\x0f", buffer_, 5), 0);
114*61c4878aSAndroid Build Coastguard Worker
115*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(5u, Encode(std::numeric_limits<uint32_t>::max(), buffer_));
116*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xff\xff\xff\xff\x0f", buffer_, 5), 0);
117*61c4878aSAndroid Build Coastguard Worker }
118*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeUnsigned32_MultiByte_C)119*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeUnsigned32_MultiByte_C) {
120*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u,
121*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode64(UINT32_C(128), buffer_, sizeof(buffer_)));
122*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x80\x01", buffer_, 2), 0);
123*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u,
124*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode64(UINT32_C(129), buffer_, sizeof(buffer_)));
125*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x81\x01", buffer_, 2), 0);
126*61c4878aSAndroid Build Coastguard Worker
127*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(
128*61c4878aSAndroid Build Coastguard Worker 5u,
129*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode32(
130*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<uint32_t>::max() - 1, buffer_, sizeof(buffer_)));
131*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xfe\xff\xff\xff\x0f", buffer_, 5), 0);
132*61c4878aSAndroid Build Coastguard Worker
133*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(
134*61c4878aSAndroid Build Coastguard Worker 5u,
135*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode32(
136*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<uint32_t>::max(), buffer_, sizeof(buffer_)));
137*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xff\xff\xff\xff\x0f", buffer_, 5), 0);
138*61c4878aSAndroid Build Coastguard Worker
139*61c4878aSAndroid Build Coastguard Worker // Call with 64-bit function as well
140*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u,
141*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode64(UINT32_C(128), buffer_, sizeof(buffer_)));
142*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x80\x01", buffer_, 2), 0);
143*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u,
144*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode64(UINT32_C(129), buffer_, sizeof(buffer_)));
145*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x81\x01", buffer_, 2), 0);
146*61c4878aSAndroid Build Coastguard Worker
147*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(
148*61c4878aSAndroid Build Coastguard Worker 5u,
149*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode64(
150*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<uint32_t>::max() - 1, buffer_, sizeof(buffer_)));
151*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xfe\xff\xff\xff\x0f", buffer_, 5), 0);
152*61c4878aSAndroid Build Coastguard Worker
153*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(
154*61c4878aSAndroid Build Coastguard Worker 5u,
155*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode64(
156*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<uint32_t>::max(), buffer_, sizeof(buffer_)));
157*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xff\xff\xff\xff\x0f", buffer_, 5), 0);
158*61c4878aSAndroid Build Coastguard Worker }
159*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeSigned32_SmallSingleByte)160*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeSigned32_SmallSingleByte) {
161*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(INT32_C(0), buffer_));
162*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{0}, buffer_[0]);
163*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(INT32_C(-1), buffer_));
164*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{1}, buffer_[0]);
165*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(INT32_C(1), buffer_));
166*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{2}, buffer_[0]);
167*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(INT32_C(-2), buffer_));
168*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{3}, buffer_[0]);
169*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(INT32_C(2), buffer_));
170*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{4}, buffer_[0]);
171*61c4878aSAndroid Build Coastguard Worker }
172*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeSigned32_SmallSingleByte_C)173*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeSigned32_SmallSingleByte_C) {
174*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
175*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
176*61c4878aSAndroid Build Coastguard Worker INT32_C(0), buffer_, sizeof(buffer_)));
177*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{0}, buffer_[0]);
178*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
179*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
180*61c4878aSAndroid Build Coastguard Worker INT32_C(-1), buffer_, sizeof(buffer_)));
181*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{1}, buffer_[0]);
182*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
183*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
184*61c4878aSAndroid Build Coastguard Worker INT32_C(1), buffer_, sizeof(buffer_)));
185*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{2}, buffer_[0]);
186*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
187*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
188*61c4878aSAndroid Build Coastguard Worker INT32_C(-2), buffer_, sizeof(buffer_)));
189*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{3}, buffer_[0]);
190*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
191*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
192*61c4878aSAndroid Build Coastguard Worker INT32_C(2), buffer_, sizeof(buffer_)));
193*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{4}, buffer_[0]);
194*61c4878aSAndroid Build Coastguard Worker }
195*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeSigned32_LargeSingleByte)196*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeSigned32_LargeSingleByte) {
197*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(INT32_C(-63), buffer_));
198*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{125}, buffer_[0]);
199*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(INT32_C(63), buffer_));
200*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{126}, buffer_[0]);
201*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(INT32_C(-64), buffer_));
202*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{127}, buffer_[0]);
203*61c4878aSAndroid Build Coastguard Worker }
204*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeSigned32_LargeSingleByte_C)205*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeSigned32_LargeSingleByte_C) {
206*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
207*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
208*61c4878aSAndroid Build Coastguard Worker INT32_C(-63), buffer_, sizeof(buffer_)));
209*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{125}, buffer_[0]);
210*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
211*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
212*61c4878aSAndroid Build Coastguard Worker INT32_C(63), buffer_, sizeof(buffer_)));
213*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{126}, buffer_[0]);
214*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
215*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
216*61c4878aSAndroid Build Coastguard Worker INT32_C(-64), buffer_, sizeof(buffer_)));
217*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{127}, buffer_[0]);
218*61c4878aSAndroid Build Coastguard Worker }
219*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeSigned32_MultiByte)220*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeSigned32_MultiByte) {
221*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u, Encode(INT32_C(64), buffer_));
222*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x80\x01", buffer_, 2), 0);
223*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u, Encode(INT32_C(-65), buffer_));
224*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x81\x01", buffer_, 2), 0);
225*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u, Encode(INT32_C(65), buffer_));
226*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x82\x01", buffer_, 2), 0);
227*61c4878aSAndroid Build Coastguard Worker
228*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(5u, Encode(std::numeric_limits<int32_t>::min(), buffer_));
229*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xff\xff\xff\xff\x0f", buffer_, 5), 0);
230*61c4878aSAndroid Build Coastguard Worker
231*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(5u, Encode(std::numeric_limits<int32_t>::max(), buffer_));
232*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xfe\xff\xff\xff\x0f", buffer_, 5), 0);
233*61c4878aSAndroid Build Coastguard Worker }
234*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeSigned32_MultiByte_C)235*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeSigned32_MultiByte_C) {
236*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u,
237*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
238*61c4878aSAndroid Build Coastguard Worker INT32_C(64), buffer_, sizeof(buffer_)));
239*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x80\x01", buffer_, 2), 0);
240*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u,
241*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
242*61c4878aSAndroid Build Coastguard Worker INT32_C(-65), buffer_, sizeof(buffer_)));
243*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x81\x01", buffer_, 2), 0);
244*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u,
245*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
246*61c4878aSAndroid Build Coastguard Worker INT32_C(65), buffer_, sizeof(buffer_)));
247*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x82\x01", buffer_, 2), 0);
248*61c4878aSAndroid Build Coastguard Worker
249*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(5u,
250*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
251*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int32_t>::min(), buffer_, sizeof(buffer_)));
252*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xff\xff\xff\xff\x0f", buffer_, 5), 0);
253*61c4878aSAndroid Build Coastguard Worker
254*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(5u,
255*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
256*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int32_t>::max(), buffer_, sizeof(buffer_)));
257*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xfe\xff\xff\xff\x0f", buffer_, 5), 0);
258*61c4878aSAndroid Build Coastguard Worker }
259*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeUnsigned64_SmallSingleByte)260*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeUnsigned64_SmallSingleByte) {
261*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(UINT64_C(0), buffer_));
262*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{0}, buffer_[0]);
263*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(UINT64_C(1), buffer_));
264*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{1}, buffer_[0]);
265*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(UINT64_C(2), buffer_));
266*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{2}, buffer_[0]);
267*61c4878aSAndroid Build Coastguard Worker }
268*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeUnsigned64_SmallSingleByte_C)269*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeUnsigned64_SmallSingleByte_C) {
270*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, pw_varint_CallEncode64(UINT64_C(0), buffer_, sizeof(buffer_)));
271*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{0}, buffer_[0]);
272*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, pw_varint_CallEncode64(UINT64_C(1), buffer_, sizeof(buffer_)));
273*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{1}, buffer_[0]);
274*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, pw_varint_CallEncode64(UINT64_C(2), buffer_, sizeof(buffer_)));
275*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{2}, buffer_[0]);
276*61c4878aSAndroid Build Coastguard Worker }
277*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeUnsigned64_LargeSingleByte)278*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeUnsigned64_LargeSingleByte) {
279*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(UINT64_C(63), buffer_));
280*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{63}, buffer_[0]);
281*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(UINT64_C(64), buffer_));
282*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{64}, buffer_[0]);
283*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(UINT64_C(126), buffer_));
284*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{126}, buffer_[0]);
285*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(UINT64_C(127), buffer_));
286*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{127}, buffer_[0]);
287*61c4878aSAndroid Build Coastguard Worker }
288*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeUnsigned64_LargeSingleByte_C)289*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeUnsigned64_LargeSingleByte_C) {
290*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, pw_varint_CallEncode64(UINT64_C(63), buffer_, sizeof(buffer_)));
291*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{63}, buffer_[0]);
292*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, pw_varint_CallEncode64(UINT64_C(64), buffer_, sizeof(buffer_)));
293*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{64}, buffer_[0]);
294*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
295*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode64(UINT64_C(126), buffer_, sizeof(buffer_)));
296*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{126}, buffer_[0]);
297*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
298*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode64(UINT64_C(127), buffer_, sizeof(buffer_)));
299*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{127}, buffer_[0]);
300*61c4878aSAndroid Build Coastguard Worker }
301*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeUnsigned64_MultiByte)302*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeUnsigned64_MultiByte) {
303*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u, Encode(UINT64_C(128), buffer_));
304*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x80\x01", buffer_, 2), 0);
305*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u, Encode(UINT64_C(129), buffer_));
306*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x81\x01", buffer_, 2), 0);
307*61c4878aSAndroid Build Coastguard Worker
308*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(5u, Encode(std::numeric_limits<uint32_t>::max() - 1, buffer_));
309*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xfe\xff\xff\xff\x0f", buffer_, 5), 0);
310*61c4878aSAndroid Build Coastguard Worker
311*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(5u, Encode(std::numeric_limits<uint32_t>::max(), buffer_));
312*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xff\xff\xff\xff\x0f", buffer_, 5), 0);
313*61c4878aSAndroid Build Coastguard Worker
314*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(10u, Encode(std::numeric_limits<uint64_t>::max() - 1, buffer_));
315*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
316*61c4878aSAndroid Build Coastguard Worker std::memcmp("\xfe\xff\xff\xff\xff\xff\xff\xff\xff\x01", buffer_, 10), 0);
317*61c4878aSAndroid Build Coastguard Worker
318*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(10u, Encode(std::numeric_limits<uint64_t>::max(), buffer_));
319*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
320*61c4878aSAndroid Build Coastguard Worker std::memcmp("\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01", buffer_, 10), 0);
321*61c4878aSAndroid Build Coastguard Worker }
322*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeUnsigned64_MultiByte_C)323*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeUnsigned64_MultiByte_C) {
324*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u,
325*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode64(UINT64_C(128), buffer_, sizeof(buffer_)));
326*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x80\x01", buffer_, 2), 0);
327*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u,
328*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode64(UINT64_C(129), buffer_, sizeof(buffer_)));
329*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x81\x01", buffer_, 2), 0);
330*61c4878aSAndroid Build Coastguard Worker
331*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(
332*61c4878aSAndroid Build Coastguard Worker 5u,
333*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode64(
334*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<uint32_t>::max() - 1, buffer_, sizeof(buffer_)));
335*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xfe\xff\xff\xff\x0f", buffer_, 5), 0);
336*61c4878aSAndroid Build Coastguard Worker
337*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(
338*61c4878aSAndroid Build Coastguard Worker 5u,
339*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode64(
340*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<uint32_t>::max(), buffer_, sizeof(buffer_)));
341*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xff\xff\xff\xff\x0f", buffer_, 5), 0);
342*61c4878aSAndroid Build Coastguard Worker
343*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(
344*61c4878aSAndroid Build Coastguard Worker 10u,
345*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode64(
346*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<uint64_t>::max() - 1, buffer_, sizeof(buffer_)));
347*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
348*61c4878aSAndroid Build Coastguard Worker std::memcmp("\xfe\xff\xff\xff\xff\xff\xff\xff\xff\x01", buffer_, 10), 0);
349*61c4878aSAndroid Build Coastguard Worker
350*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(
351*61c4878aSAndroid Build Coastguard Worker 10u,
352*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode64(
353*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<uint64_t>::max(), buffer_, sizeof(buffer_)));
354*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
355*61c4878aSAndroid Build Coastguard Worker std::memcmp("\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01", buffer_, 10), 0);
356*61c4878aSAndroid Build Coastguard Worker }
357*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeSigned64_SmallSingleByte)358*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeSigned64_SmallSingleByte) {
359*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(INT64_C(0), buffer_));
360*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{0}, buffer_[0]);
361*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(INT64_C(-1), buffer_));
362*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{1}, buffer_[0]);
363*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(INT64_C(1), buffer_));
364*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{2}, buffer_[0]);
365*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(INT64_C(-2), buffer_));
366*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{3}, buffer_[0]);
367*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(INT64_C(2), buffer_));
368*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{4}, buffer_[0]);
369*61c4878aSAndroid Build Coastguard Worker }
370*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeSigned64_SmallSingleByte_C)371*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeSigned64_SmallSingleByte_C) {
372*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
373*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
374*61c4878aSAndroid Build Coastguard Worker INT64_C(0), buffer_, sizeof(buffer_)));
375*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{0}, buffer_[0]);
376*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
377*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
378*61c4878aSAndroid Build Coastguard Worker INT64_C(-1), buffer_, sizeof(buffer_)));
379*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{1}, buffer_[0]);
380*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
381*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
382*61c4878aSAndroid Build Coastguard Worker INT64_C(1), buffer_, sizeof(buffer_)));
383*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{2}, buffer_[0]);
384*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
385*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
386*61c4878aSAndroid Build Coastguard Worker INT64_C(-2), buffer_, sizeof(buffer_)));
387*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{3}, buffer_[0]);
388*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
389*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
390*61c4878aSAndroid Build Coastguard Worker INT64_C(2), buffer_, sizeof(buffer_)));
391*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{4}, buffer_[0]);
392*61c4878aSAndroid Build Coastguard Worker }
393*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeSigned64_LargeSingleByte)394*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeSigned64_LargeSingleByte) {
395*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(INT64_C(-63), buffer_));
396*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{125}, buffer_[0]);
397*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(INT64_C(63), buffer_));
398*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{126}, buffer_[0]);
399*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u, Encode(INT64_C(-64), buffer_));
400*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{127}, buffer_[0]);
401*61c4878aSAndroid Build Coastguard Worker }
402*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeSigned64_LargeSingleByte_C)403*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeSigned64_LargeSingleByte_C) {
404*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
405*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
406*61c4878aSAndroid Build Coastguard Worker INT64_C(-63), buffer_, sizeof(buffer_)));
407*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{125}, buffer_[0]);
408*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
409*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
410*61c4878aSAndroid Build Coastguard Worker INT64_C(63), buffer_, sizeof(buffer_)));
411*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{126}, buffer_[0]);
412*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(1u,
413*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
414*61c4878aSAndroid Build Coastguard Worker INT64_C(-64), buffer_, sizeof(buffer_)));
415*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::byte{127}, buffer_[0]);
416*61c4878aSAndroid Build Coastguard Worker }
417*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeSigned64_MultiByte)418*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeSigned64_MultiByte) {
419*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u, Encode(INT64_C(64), buffer_));
420*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x80\x01", buffer_, 2), 0);
421*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u, Encode(INT64_C(-65), buffer_));
422*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x81\x01", buffer_, 2), 0);
423*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u, Encode(INT64_C(65), buffer_));
424*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x82\x01", buffer_, 2), 0);
425*61c4878aSAndroid Build Coastguard Worker
426*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(5u,
427*61c4878aSAndroid Build Coastguard Worker Encode(static_cast<int64_t>(std::numeric_limits<int32_t>::min()),
428*61c4878aSAndroid Build Coastguard Worker buffer_));
429*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xff\xff\xff\xff\x0f", buffer_, 5), 0);
430*61c4878aSAndroid Build Coastguard Worker
431*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(5u,
432*61c4878aSAndroid Build Coastguard Worker Encode(static_cast<int64_t>(std::numeric_limits<int32_t>::max()),
433*61c4878aSAndroid Build Coastguard Worker buffer_));
434*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xfe\xff\xff\xff\x0f", buffer_, 5), 0);
435*61c4878aSAndroid Build Coastguard Worker
436*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(10u, Encode(std::numeric_limits<int64_t>::min(), buffer_));
437*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
438*61c4878aSAndroid Build Coastguard Worker std::memcmp("\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01", buffer_, 10), 0);
439*61c4878aSAndroid Build Coastguard Worker
440*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(10u, Encode(std::numeric_limits<int64_t>::max(), buffer_));
441*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
442*61c4878aSAndroid Build Coastguard Worker std::memcmp("\xfe\xff\xff\xff\xff\xff\xff\xff\xff\x01", buffer_, 10), 0);
443*61c4878aSAndroid Build Coastguard Worker }
444*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeSizeSigned64_MultiByte_C)445*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeSizeSigned64_MultiByte_C) {
446*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u,
447*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
448*61c4878aSAndroid Build Coastguard Worker INT64_C(64), buffer_, sizeof(buffer_)));
449*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x80\x01", buffer_, 2), 0);
450*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u,
451*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
452*61c4878aSAndroid Build Coastguard Worker INT64_C(-65), buffer_, sizeof(buffer_)));
453*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x81\x01", buffer_, 2), 0);
454*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(2u,
455*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
456*61c4878aSAndroid Build Coastguard Worker INT64_C(65), buffer_, sizeof(buffer_)));
457*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x82\x01", buffer_, 2), 0);
458*61c4878aSAndroid Build Coastguard Worker
459*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(5u,
460*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
461*61c4878aSAndroid Build Coastguard Worker static_cast<int64_t>(std::numeric_limits<int32_t>::min()),
462*61c4878aSAndroid Build Coastguard Worker buffer_,
463*61c4878aSAndroid Build Coastguard Worker sizeof(buffer_)));
464*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xff\xff\xff\xff\x0f", buffer_, 5), 0);
465*61c4878aSAndroid Build Coastguard Worker
466*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(5u,
467*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
468*61c4878aSAndroid Build Coastguard Worker static_cast<int64_t>(std::numeric_limits<int32_t>::max()),
469*61c4878aSAndroid Build Coastguard Worker buffer_,
470*61c4878aSAndroid Build Coastguard Worker sizeof(buffer_)));
471*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xfe\xff\xff\xff\x0f", buffer_, 5), 0);
472*61c4878aSAndroid Build Coastguard Worker
473*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(10u,
474*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
475*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int64_t>::min(), buffer_, sizeof(buffer_)));
476*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
477*61c4878aSAndroid Build Coastguard Worker std::memcmp("\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01", buffer_, 10), 0);
478*61c4878aSAndroid Build Coastguard Worker
479*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(10u,
480*61c4878aSAndroid Build Coastguard Worker pw_varint_CallZigZagAndVarintEncode64(
481*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int64_t>::max(), buffer_, sizeof(buffer_)));
482*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
483*61c4878aSAndroid Build Coastguard Worker std::memcmp("\xfe\xff\xff\xff\xff\xff\xff\xff\xff\x01", buffer_, 10), 0);
484*61c4878aSAndroid Build Coastguard Worker }
485*61c4878aSAndroid Build Coastguard Worker
486*61c4878aSAndroid Build Coastguard Worker // How much to increment by for each iteration of the exhaustive encode/decode
487*61c4878aSAndroid Build Coastguard Worker // tests. Set the increment to 1 to test every number (this is slow).
488*61c4878aSAndroid Build Coastguard Worker constexpr int kIncrement = 100'000'009;
489*61c4878aSAndroid Build Coastguard Worker
490*61c4878aSAndroid Build Coastguard Worker template <typename T, typename U = T>
EncodeDecode(T value)491*61c4878aSAndroid Build Coastguard Worker void EncodeDecode(T value) {
492*61c4878aSAndroid Build Coastguard Worker std::byte buffer[10];
493*61c4878aSAndroid Build Coastguard Worker size_t encoded = Encode(value, buffer);
494*61c4878aSAndroid Build Coastguard Worker
495*61c4878aSAndroid Build Coastguard Worker U result;
496*61c4878aSAndroid Build Coastguard Worker size_t decoded = Decode(buffer, &result);
497*61c4878aSAndroid Build Coastguard Worker
498*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(encoded, decoded);
499*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(value, result);
500*61c4878aSAndroid Build Coastguard Worker }
501*61c4878aSAndroid Build Coastguard Worker
EncodeDecodeSigned32(int32_t value)502*61c4878aSAndroid Build Coastguard Worker void EncodeDecodeSigned32(int32_t value) {
503*61c4878aSAndroid Build Coastguard Worker EncodeDecode<int32_t, int64_t>(value);
504*61c4878aSAndroid Build Coastguard Worker }
505*61c4878aSAndroid Build Coastguard Worker
TEST(Varint,EncodeDecodeSigned32Incremental)506*61c4878aSAndroid Build Coastguard Worker TEST(Varint, EncodeDecodeSigned32Incremental) {
507*61c4878aSAndroid Build Coastguard Worker int32_t i = std::numeric_limits<int32_t>::min();
508*61c4878aSAndroid Build Coastguard Worker while (true) {
509*61c4878aSAndroid Build Coastguard Worker EncodeDecodeSigned32(i);
510*61c4878aSAndroid Build Coastguard Worker
511*61c4878aSAndroid Build Coastguard Worker if (i > std::numeric_limits<int32_t>::max() - kIncrement) {
512*61c4878aSAndroid Build Coastguard Worker break;
513*61c4878aSAndroid Build Coastguard Worker }
514*61c4878aSAndroid Build Coastguard Worker
515*61c4878aSAndroid Build Coastguard Worker i += kIncrement;
516*61c4878aSAndroid Build Coastguard Worker }
517*61c4878aSAndroid Build Coastguard Worker }
518*61c4878aSAndroid Build Coastguard Worker
519*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(Varint, EncodeDecodeSigned32);
520*61c4878aSAndroid Build Coastguard Worker
EncodeDecodeUnsigned32(uint32_t value)521*61c4878aSAndroid Build Coastguard Worker void EncodeDecodeUnsigned32(uint32_t value) {
522*61c4878aSAndroid Build Coastguard Worker EncodeDecode<uint32_t, uint64_t>(value);
523*61c4878aSAndroid Build Coastguard Worker }
524*61c4878aSAndroid Build Coastguard Worker
TEST(Varint,EncodeDecodeUnsigned32Incremental)525*61c4878aSAndroid Build Coastguard Worker TEST(Varint, EncodeDecodeUnsigned32Incremental) {
526*61c4878aSAndroid Build Coastguard Worker uint32_t i = 0;
527*61c4878aSAndroid Build Coastguard Worker while (true) {
528*61c4878aSAndroid Build Coastguard Worker EncodeDecodeUnsigned32(i);
529*61c4878aSAndroid Build Coastguard Worker
530*61c4878aSAndroid Build Coastguard Worker if (i > std::numeric_limits<uint32_t>::max() - kIncrement) {
531*61c4878aSAndroid Build Coastguard Worker break;
532*61c4878aSAndroid Build Coastguard Worker }
533*61c4878aSAndroid Build Coastguard Worker
534*61c4878aSAndroid Build Coastguard Worker i += kIncrement;
535*61c4878aSAndroid Build Coastguard Worker }
536*61c4878aSAndroid Build Coastguard Worker }
537*61c4878aSAndroid Build Coastguard Worker
538*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(Varint, EncodeDecodeUnsigned32);
539*61c4878aSAndroid Build Coastguard Worker
540*61c4878aSAndroid Build Coastguard Worker #define ENCODE_DECODE_C_TEST(bits) \
541*61c4878aSAndroid Build Coastguard Worker void EncodeDecode##bits##_C(uint##bits##_t value) { \
542*61c4878aSAndroid Build Coastguard Worker std::byte buffer[kMaxVarint##bits##SizeBytes]; \
543*61c4878aSAndroid Build Coastguard Worker size_t encoded = \
544*61c4878aSAndroid Build Coastguard Worker pw_varint_CallEncode##bits(value, buffer, sizeof(buffer)); \
545*61c4878aSAndroid Build Coastguard Worker \
546*61c4878aSAndroid Build Coastguard Worker uint##bits##_t result; \
547*61c4878aSAndroid Build Coastguard Worker size_t decoded = \
548*61c4878aSAndroid Build Coastguard Worker pw_varint_CallDecode##bits(buffer, sizeof(buffer), &result); \
549*61c4878aSAndroid Build Coastguard Worker \
550*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(encoded, decoded); \
551*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(value, result); \
552*61c4878aSAndroid Build Coastguard Worker } \
553*61c4878aSAndroid Build Coastguard Worker \
554*61c4878aSAndroid Build Coastguard Worker TEST(Varint, EncodeDecode##bits##Signed32Incremental_C) { \
555*61c4878aSAndroid Build Coastguard Worker int32_t i = std::numeric_limits<int32_t>::min(); \
556*61c4878aSAndroid Build Coastguard Worker while (true) { \
557*61c4878aSAndroid Build Coastguard Worker EncodeDecode##bits##_C(static_cast<uint##bits##_t>(i)); \
558*61c4878aSAndroid Build Coastguard Worker \
559*61c4878aSAndroid Build Coastguard Worker if (i > std::numeric_limits<int32_t>::max() - kIncrement) { \
560*61c4878aSAndroid Build Coastguard Worker break; \
561*61c4878aSAndroid Build Coastguard Worker } \
562*61c4878aSAndroid Build Coastguard Worker \
563*61c4878aSAndroid Build Coastguard Worker i += kIncrement; \
564*61c4878aSAndroid Build Coastguard Worker } \
565*61c4878aSAndroid Build Coastguard Worker } \
566*61c4878aSAndroid Build Coastguard Worker \
567*61c4878aSAndroid Build Coastguard Worker TEST(Varint, EncodeDecode##bits##Unsigned32Incremental_C) { \
568*61c4878aSAndroid Build Coastguard Worker uint32_t i = 0; \
569*61c4878aSAndroid Build Coastguard Worker while (true) { \
570*61c4878aSAndroid Build Coastguard Worker EncodeDecode##bits##_C(static_cast<uint##bits##_t>(i)); \
571*61c4878aSAndroid Build Coastguard Worker \
572*61c4878aSAndroid Build Coastguard Worker if (i > std::numeric_limits<uint32_t>::max() - kIncrement) { \
573*61c4878aSAndroid Build Coastguard Worker break; \
574*61c4878aSAndroid Build Coastguard Worker } \
575*61c4878aSAndroid Build Coastguard Worker \
576*61c4878aSAndroid Build Coastguard Worker i += kIncrement; \
577*61c4878aSAndroid Build Coastguard Worker } \
578*61c4878aSAndroid Build Coastguard Worker } \
579*61c4878aSAndroid Build Coastguard Worker \
580*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(Varint, EncodeDecode##bits##_C)
581*61c4878aSAndroid Build Coastguard Worker
582*61c4878aSAndroid Build Coastguard Worker ENCODE_DECODE_C_TEST(32);
583*61c4878aSAndroid Build Coastguard Worker ENCODE_DECODE_C_TEST(64);
584*61c4878aSAndroid Build Coastguard Worker
585*61c4878aSAndroid Build Coastguard Worker template <size_t kStringSize>
MakeBuffer(const char (& data)[kStringSize])586*61c4878aSAndroid Build Coastguard Worker auto MakeBuffer(const char (&data)[kStringSize]) {
587*61c4878aSAndroid Build Coastguard Worker constexpr size_t kSizeBytes = kStringSize - 1;
588*61c4878aSAndroid Build Coastguard Worker static_assert(kSizeBytes <= 10, "Varint arrays never need be larger than 10");
589*61c4878aSAndroid Build Coastguard Worker
590*61c4878aSAndroid Build Coastguard Worker std::array<std::byte, kSizeBytes> array;
591*61c4878aSAndroid Build Coastguard Worker std::memcpy(array.data(), data, kSizeBytes);
592*61c4878aSAndroid Build Coastguard Worker return array;
593*61c4878aSAndroid Build Coastguard Worker }
594*61c4878aSAndroid Build Coastguard Worker
TEST(VarintDecode,DecodeSigned64_SingleByte)595*61c4878aSAndroid Build Coastguard Worker TEST(VarintDecode, DecodeSigned64_SingleByte) {
596*61c4878aSAndroid Build Coastguard Worker int64_t value = -1234;
597*61c4878aSAndroid Build Coastguard Worker
598*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x00"), &value), 1u);
599*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0);
600*61c4878aSAndroid Build Coastguard Worker
601*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x01"), &value), 1u);
602*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, -1);
603*61c4878aSAndroid Build Coastguard Worker
604*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x02"), &value), 1u);
605*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 1);
606*61c4878aSAndroid Build Coastguard Worker
607*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x03"), &value), 1u);
608*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, -2);
609*61c4878aSAndroid Build Coastguard Worker
610*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x04"), &value), 1u);
611*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 2);
612*61c4878aSAndroid Build Coastguard Worker
613*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x04"), &value), 1u);
614*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 2);
615*61c4878aSAndroid Build Coastguard Worker }
616*61c4878aSAndroid Build Coastguard Worker
TEST(VarintDecode,DecodeSigned64_SingleByte_C)617*61c4878aSAndroid Build Coastguard Worker TEST(VarintDecode, DecodeSigned64_SingleByte_C) {
618*61c4878aSAndroid Build Coastguard Worker int64_t value = -1234;
619*61c4878aSAndroid Build Coastguard Worker
620*61c4878aSAndroid Build Coastguard Worker auto buffer = MakeBuffer("\x00");
621*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pw_varint_CallZigZagAndVarintDecode64(
622*61c4878aSAndroid Build Coastguard Worker buffer.data(), buffer.size(), &value),
623*61c4878aSAndroid Build Coastguard Worker 1u);
624*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0);
625*61c4878aSAndroid Build Coastguard Worker
626*61c4878aSAndroid Build Coastguard Worker buffer = MakeBuffer("\x01");
627*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pw_varint_CallZigZagAndVarintDecode64(
628*61c4878aSAndroid Build Coastguard Worker buffer.data(), buffer.size(), &value),
629*61c4878aSAndroid Build Coastguard Worker 1u);
630*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, -1);
631*61c4878aSAndroid Build Coastguard Worker
632*61c4878aSAndroid Build Coastguard Worker buffer = MakeBuffer("\x02");
633*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pw_varint_CallZigZagAndVarintDecode64(
634*61c4878aSAndroid Build Coastguard Worker buffer.data(), buffer.size(), &value),
635*61c4878aSAndroid Build Coastguard Worker 1u);
636*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 1);
637*61c4878aSAndroid Build Coastguard Worker
638*61c4878aSAndroid Build Coastguard Worker buffer = MakeBuffer("\x03");
639*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pw_varint_CallZigZagAndVarintDecode64(
640*61c4878aSAndroid Build Coastguard Worker buffer.data(), buffer.size(), &value),
641*61c4878aSAndroid Build Coastguard Worker 1u);
642*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, -2);
643*61c4878aSAndroid Build Coastguard Worker
644*61c4878aSAndroid Build Coastguard Worker buffer = MakeBuffer("\x04");
645*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pw_varint_CallZigZagAndVarintDecode64(
646*61c4878aSAndroid Build Coastguard Worker buffer.data(), buffer.size(), &value),
647*61c4878aSAndroid Build Coastguard Worker 1u);
648*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 2);
649*61c4878aSAndroid Build Coastguard Worker
650*61c4878aSAndroid Build Coastguard Worker buffer = MakeBuffer("\x04");
651*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pw_varint_CallZigZagAndVarintDecode64(
652*61c4878aSAndroid Build Coastguard Worker buffer.data(), buffer.size(), &value),
653*61c4878aSAndroid Build Coastguard Worker 1u);
654*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 2);
655*61c4878aSAndroid Build Coastguard Worker }
656*61c4878aSAndroid Build Coastguard Worker
TEST(VarintDecode,DecodeSigned64_MultiByte)657*61c4878aSAndroid Build Coastguard Worker TEST(VarintDecode, DecodeSigned64_MultiByte) {
658*61c4878aSAndroid Build Coastguard Worker int64_t value = -1234;
659*61c4878aSAndroid Build Coastguard Worker
660*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x80\x01"), &value), 2u);
661*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 64);
662*61c4878aSAndroid Build Coastguard Worker
663*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x81\x01"), &value), 2u);
664*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, -65);
665*61c4878aSAndroid Build Coastguard Worker
666*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x82\x01"), &value), 2u);
667*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 65);
668*61c4878aSAndroid Build Coastguard Worker
669*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\xff\xff\xff\xff\x0f"), &value), 5u);
670*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, std::numeric_limits<int32_t>::min());
671*61c4878aSAndroid Build Coastguard Worker
672*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\xfe\xff\xff\xff\x0f"), &value), 5u);
673*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, std::numeric_limits<int32_t>::max());
674*61c4878aSAndroid Build Coastguard Worker
675*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
676*61c4878aSAndroid Build Coastguard Worker Decode(MakeBuffer("\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01"), &value),
677*61c4878aSAndroid Build Coastguard Worker 10u);
678*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, std::numeric_limits<int64_t>::min());
679*61c4878aSAndroid Build Coastguard Worker
680*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
681*61c4878aSAndroid Build Coastguard Worker Decode(MakeBuffer("\xfe\xff\xff\xff\xff\xff\xff\xff\xff\x01"), &value),
682*61c4878aSAndroid Build Coastguard Worker 10u);
683*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, std::numeric_limits<int64_t>::max());
684*61c4878aSAndroid Build Coastguard Worker }
685*61c4878aSAndroid Build Coastguard Worker
TEST(VarintDecode,DecodeSigned64_MultiByte_C)686*61c4878aSAndroid Build Coastguard Worker TEST(VarintDecode, DecodeSigned64_MultiByte_C) {
687*61c4878aSAndroid Build Coastguard Worker int64_t value = -1234;
688*61c4878aSAndroid Build Coastguard Worker
689*61c4878aSAndroid Build Coastguard Worker auto buffer2 = MakeBuffer("\x80\x01");
690*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pw_varint_CallZigZagAndVarintDecode64(
691*61c4878aSAndroid Build Coastguard Worker buffer2.data(), buffer2.size(), &value),
692*61c4878aSAndroid Build Coastguard Worker 2u);
693*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 64);
694*61c4878aSAndroid Build Coastguard Worker
695*61c4878aSAndroid Build Coastguard Worker buffer2 = MakeBuffer("\x81\x01");
696*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pw_varint_CallZigZagAndVarintDecode64(
697*61c4878aSAndroid Build Coastguard Worker buffer2.data(), buffer2.size(), &value),
698*61c4878aSAndroid Build Coastguard Worker 2u);
699*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, -65);
700*61c4878aSAndroid Build Coastguard Worker
701*61c4878aSAndroid Build Coastguard Worker buffer2 = MakeBuffer("\x82\x01");
702*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pw_varint_CallZigZagAndVarintDecode64(
703*61c4878aSAndroid Build Coastguard Worker buffer2.data(), buffer2.size(), &value),
704*61c4878aSAndroid Build Coastguard Worker 2u);
705*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 65);
706*61c4878aSAndroid Build Coastguard Worker
707*61c4878aSAndroid Build Coastguard Worker auto buffer4 = MakeBuffer("\xff\xff\xff\xff\x0f");
708*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pw_varint_CallZigZagAndVarintDecode64(
709*61c4878aSAndroid Build Coastguard Worker buffer4.data(), buffer4.size(), &value),
710*61c4878aSAndroid Build Coastguard Worker 5u);
711*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, std::numeric_limits<int32_t>::min());
712*61c4878aSAndroid Build Coastguard Worker
713*61c4878aSAndroid Build Coastguard Worker buffer4 = MakeBuffer("\xfe\xff\xff\xff\x0f");
714*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pw_varint_CallZigZagAndVarintDecode64(
715*61c4878aSAndroid Build Coastguard Worker buffer4.data(), buffer4.size(), &value),
716*61c4878aSAndroid Build Coastguard Worker 5u);
717*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, std::numeric_limits<int32_t>::max());
718*61c4878aSAndroid Build Coastguard Worker
719*61c4878aSAndroid Build Coastguard Worker auto buffer8 = MakeBuffer("\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01");
720*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pw_varint_CallZigZagAndVarintDecode64(
721*61c4878aSAndroid Build Coastguard Worker buffer8.data(), buffer8.size(), &value),
722*61c4878aSAndroid Build Coastguard Worker 10u);
723*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, std::numeric_limits<int64_t>::min());
724*61c4878aSAndroid Build Coastguard Worker
725*61c4878aSAndroid Build Coastguard Worker buffer8 = MakeBuffer("\xfe\xff\xff\xff\xff\xff\xff\xff\xff\x01");
726*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pw_varint_CallZigZagAndVarintDecode64(
727*61c4878aSAndroid Build Coastguard Worker buffer8.data(), buffer8.size(), &value),
728*61c4878aSAndroid Build Coastguard Worker 10u);
729*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, std::numeric_limits<int64_t>::max());
730*61c4878aSAndroid Build Coastguard Worker }
731*61c4878aSAndroid Build Coastguard Worker
TEST(Varint,ZigZagEncode_Int8)732*61c4878aSAndroid Build Coastguard Worker TEST(Varint, ZigZagEncode_Int8) {
733*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int8_t(0)), uint8_t(0));
734*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int8_t(-1)), uint8_t(1));
735*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int8_t(1)), uint8_t(2));
736*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int8_t(-2)), uint8_t(3));
737*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int8_t(2)), uint8_t(4));
738*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int8_t(-33)), uint8_t(65));
739*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int8_t(33)), uint8_t(66));
740*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(std::numeric_limits<int8_t>::min()),
741*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<uint8_t>::max());
742*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(std::numeric_limits<int8_t>::max()),
743*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<uint8_t>::max() - 1u);
744*61c4878aSAndroid Build Coastguard Worker }
745*61c4878aSAndroid Build Coastguard Worker
TEST(Varint,ZigZagEncode_Int16)746*61c4878aSAndroid Build Coastguard Worker TEST(Varint, ZigZagEncode_Int16) {
747*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int16_t(0)), uint16_t(0));
748*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int16_t(-1)), uint16_t(1));
749*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int16_t(1)), uint16_t(2));
750*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int16_t(-2)), uint16_t(3));
751*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int16_t(2)), uint16_t(4));
752*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int16_t(-3333)), uint16_t(6665));
753*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int16_t(3333)), uint16_t(6666));
754*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(std::numeric_limits<int16_t>::min()),
755*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<uint16_t>::max());
756*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(std::numeric_limits<int16_t>::max()),
757*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<uint16_t>::max() - 1u);
758*61c4878aSAndroid Build Coastguard Worker }
759*61c4878aSAndroid Build Coastguard Worker
TEST(Varint,ZigZagEncode_Int32)760*61c4878aSAndroid Build Coastguard Worker TEST(Varint, ZigZagEncode_Int32) {
761*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int32_t(0)), uint32_t(0));
762*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int32_t(-1)), uint32_t(1));
763*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int32_t(1)), uint32_t(2));
764*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int32_t(-2)), uint32_t(3));
765*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int32_t(2)), uint32_t(4));
766*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int32_t(-128)), uint32_t(255));
767*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int32_t(128)), uint32_t(256));
768*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int32_t(-333333)), uint32_t(666665));
769*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int32_t(333333)), uint32_t(666666));
770*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(std::numeric_limits<int32_t>::min()),
771*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<uint32_t>::max());
772*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(std::numeric_limits<int32_t>::max()),
773*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<uint32_t>::max() - 1u);
774*61c4878aSAndroid Build Coastguard Worker }
775*61c4878aSAndroid Build Coastguard Worker
TEST(Varint,ZigZagEncode_Int64)776*61c4878aSAndroid Build Coastguard Worker TEST(Varint, ZigZagEncode_Int64) {
777*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int64_t(0)), uint64_t(0));
778*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int64_t(-1)), uint64_t(1));
779*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int64_t(1)), uint64_t(2));
780*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int64_t(-2)), uint64_t(3));
781*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int64_t(2)), uint64_t(4));
782*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int64_t(-3333333333)), uint64_t(6666666665));
783*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(int64_t(3333333333)), uint64_t(6666666666));
784*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(std::numeric_limits<int64_t>::min()),
785*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<uint64_t>::max());
786*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagEncode(std::numeric_limits<int64_t>::max()),
787*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<uint64_t>::max() - 1u);
788*61c4878aSAndroid Build Coastguard Worker }
789*61c4878aSAndroid Build Coastguard Worker
TEST(Varint,ZigZagDecode_Int8)790*61c4878aSAndroid Build Coastguard Worker TEST(Varint, ZigZagDecode_Int8) {
791*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint8_t(0)), int8_t(0));
792*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint8_t(1)), int8_t(-1));
793*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint8_t(2)), int8_t(1));
794*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint8_t(3)), int8_t(-2));
795*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint8_t(4)), int8_t(2));
796*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint8_t(65)), int8_t(-33));
797*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint8_t(66)), int8_t(33));
798*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(std::numeric_limits<uint8_t>::max()),
799*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int8_t>::min());
800*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(std::numeric_limits<uint8_t>::max() - 1u),
801*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int8_t>::max());
802*61c4878aSAndroid Build Coastguard Worker }
803*61c4878aSAndroid Build Coastguard Worker
TEST(Varint,ZigZagDecode_Int16)804*61c4878aSAndroid Build Coastguard Worker TEST(Varint, ZigZagDecode_Int16) {
805*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint16_t(0)), int16_t(0));
806*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint16_t(1)), int16_t(-1));
807*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint16_t(2)), int16_t(1));
808*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint16_t(3)), int16_t(-2));
809*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint16_t(4)), int16_t(2));
810*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint16_t(6665)), int16_t(-3333));
811*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint16_t(6666)), int16_t(3333));
812*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(std::numeric_limits<uint16_t>::max()),
813*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int16_t>::min());
814*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(std::numeric_limits<uint16_t>::max() - 1u),
815*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int16_t>::max());
816*61c4878aSAndroid Build Coastguard Worker }
817*61c4878aSAndroid Build Coastguard Worker
TEST(Varint,ZigZagDecode_Int32)818*61c4878aSAndroid Build Coastguard Worker TEST(Varint, ZigZagDecode_Int32) {
819*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint32_t(0)), int32_t(0));
820*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint32_t(1)), int32_t(-1));
821*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint32_t(2)), int32_t(1));
822*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint32_t(3)), int32_t(-2));
823*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint32_t(4)), int32_t(2));
824*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint32_t(255)), int32_t(-128));
825*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint32_t(256)), int32_t(128));
826*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint32_t(666665)), int32_t(-333333));
827*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint32_t(666666)), int32_t(333333));
828*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(std::numeric_limits<uint32_t>::max()),
829*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int32_t>::min());
830*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(std::numeric_limits<uint32_t>::max() - 1u),
831*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int32_t>::max());
832*61c4878aSAndroid Build Coastguard Worker }
833*61c4878aSAndroid Build Coastguard Worker
TEST(Varint,ZigZagDecode_Int64)834*61c4878aSAndroid Build Coastguard Worker TEST(Varint, ZigZagDecode_Int64) {
835*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint64_t(0)), int64_t(0));
836*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint64_t(1)), int64_t(-1));
837*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint64_t(2)), int64_t(1));
838*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint64_t(3)), int64_t(-2));
839*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint64_t(4)), int64_t(2));
840*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint64_t(6666666665)), int64_t(-3333333333));
841*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(uint64_t(6666666666)), int64_t(3333333333));
842*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(std::numeric_limits<uint64_t>::max()),
843*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int64_t>::min());
844*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(std::numeric_limits<uint64_t>::max() - 1llu),
845*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int64_t>::max());
846*61c4878aSAndroid Build Coastguard Worker }
847*61c4878aSAndroid Build Coastguard Worker
TEST(Varint,ZigZagEncodeDecode)848*61c4878aSAndroid Build Coastguard Worker TEST(Varint, ZigZagEncodeDecode) {
849*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(ZigZagEncode(0)), 0);
850*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(ZigZagEncode(1)), 1);
851*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(ZigZagEncode(-1)), -1);
852*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(ZigZagEncode(8675309)), 8675309);
853*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(ZigZagEncode(std::numeric_limits<int8_t>::min())),
854*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int8_t>::min());
855*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(ZigZagEncode(std::numeric_limits<int8_t>::max())),
856*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int8_t>::max());
857*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(ZigZagEncode(std::numeric_limits<int16_t>::min())),
858*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int16_t>::min());
859*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(ZigZagEncode(std::numeric_limits<int16_t>::max())),
860*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int16_t>::max());
861*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(ZigZagEncode(std::numeric_limits<int32_t>::min())),
862*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int32_t>::min());
863*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(ZigZagEncode(std::numeric_limits<int32_t>::max())),
864*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int32_t>::max());
865*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(ZigZagEncode(std::numeric_limits<int64_t>::min())),
866*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int64_t>::min());
867*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ZigZagDecode(ZigZagEncode(std::numeric_limits<int64_t>::max())),
868*61c4878aSAndroid Build Coastguard Worker std::numeric_limits<int64_t>::max());
869*61c4878aSAndroid Build Coastguard Worker }
870*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeWithOptions_SingleByte)871*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeWithOptions_SingleByte) {
872*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(0u, buffer_, Format::kZeroTerminatedLeastSignificant), 1u);
873*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(buffer_[0], std::byte{0x00});
874*61c4878aSAndroid Build Coastguard Worker
875*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(1u, buffer_, Format::kZeroTerminatedLeastSignificant), 1u);
876*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(buffer_[0], std::byte{0x02});
877*61c4878aSAndroid Build Coastguard Worker
878*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(0x7f, buffer_, Format::kZeroTerminatedLeastSignificant), 1u);
879*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(buffer_[0], std::byte{0xfe});
880*61c4878aSAndroid Build Coastguard Worker
881*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(0u, buffer_, Format::kOneTerminatedLeastSignificant), 1u);
882*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(buffer_[0], std::byte{0x01});
883*61c4878aSAndroid Build Coastguard Worker
884*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(2u, buffer_, Format::kOneTerminatedLeastSignificant), 1u);
885*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(buffer_[0], std::byte{0x05});
886*61c4878aSAndroid Build Coastguard Worker
887*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(0x7f, buffer_, Format::kOneTerminatedLeastSignificant), 1u);
888*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(buffer_[0], std::byte{0xff});
889*61c4878aSAndroid Build Coastguard Worker
890*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(0u, buffer_, Format::kZeroTerminatedMostSignificant), 1u);
891*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(buffer_[0], std::byte{0x00});
892*61c4878aSAndroid Build Coastguard Worker
893*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(7u, buffer_, Format::kZeroTerminatedMostSignificant), 1u);
894*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(buffer_[0], std::byte{0x07});
895*61c4878aSAndroid Build Coastguard Worker
896*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(0x7f, buffer_, Format::kZeroTerminatedMostSignificant), 1u);
897*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(buffer_[0], std::byte{0x7f});
898*61c4878aSAndroid Build Coastguard Worker
899*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(0u, buffer_, Format::kOneTerminatedMostSignificant), 1u);
900*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(buffer_[0], std::byte{0x80});
901*61c4878aSAndroid Build Coastguard Worker
902*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(15u, buffer_, Format::kOneTerminatedMostSignificant), 1u);
903*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(buffer_[0], std::byte{0x8f});
904*61c4878aSAndroid Build Coastguard Worker
905*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(0x7f, buffer_, Format::kOneTerminatedMostSignificant), 1u);
906*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(buffer_[0], std::byte{0xff});
907*61c4878aSAndroid Build Coastguard Worker }
908*61c4878aSAndroid Build Coastguard Worker
TEST_F(VarintWithBuffer,EncodeWithOptions_MultiByte)909*61c4878aSAndroid Build Coastguard Worker TEST_F(VarintWithBuffer, EncodeWithOptions_MultiByte) {
910*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(128u, buffer_, Format::kZeroTerminatedLeastSignificant), 2u);
911*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x01\x02", buffer_, 2), 0);
912*61c4878aSAndroid Build Coastguard Worker
913*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(
914*61c4878aSAndroid Build Coastguard Worker Encode(0xffffffff, buffer_, Format::kZeroTerminatedLeastSignificant), 5u);
915*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xff\xff\xff\xff\x1e", buffer_, 5), 0);
916*61c4878aSAndroid Build Coastguard Worker
917*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(128u, buffer_, Format::kOneTerminatedLeastSignificant), 2u);
918*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x00\x03", buffer_, 2), 0);
919*61c4878aSAndroid Build Coastguard Worker
920*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(0xffffffff, buffer_, Format::kOneTerminatedLeastSignificant),
921*61c4878aSAndroid Build Coastguard Worker 5u);
922*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xfe\xfe\xfe\xfe\x1f", buffer_, 5), 0);
923*61c4878aSAndroid Build Coastguard Worker
924*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(128u, buffer_, Format::kZeroTerminatedMostSignificant), 2u);
925*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x80\x01", buffer_, 2), 0);
926*61c4878aSAndroid Build Coastguard Worker
927*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(0xffffffff, buffer_, Format::kZeroTerminatedMostSignificant),
928*61c4878aSAndroid Build Coastguard Worker 5u);
929*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\xff\xff\xff\xff\x0f", buffer_, 5), 0);
930*61c4878aSAndroid Build Coastguard Worker
931*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(128u, buffer_, Format::kOneTerminatedMostSignificant), 2u);
932*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x00\x81", buffer_, 2), 0);
933*61c4878aSAndroid Build Coastguard Worker
934*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(Encode(0xffffffff, buffer_, Format::kOneTerminatedMostSignificant),
935*61c4878aSAndroid Build Coastguard Worker 5u);
936*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp("\x7f\x7f\x7f\x7f\x8f", buffer_, 5), 0);
937*61c4878aSAndroid Build Coastguard Worker }
938*61c4878aSAndroid Build Coastguard Worker
TEST(Varint,DecodeWithOptions_SingleByte)939*61c4878aSAndroid Build Coastguard Worker TEST(Varint, DecodeWithOptions_SingleByte) {
940*61c4878aSAndroid Build Coastguard Worker uint64_t value;
941*61c4878aSAndroid Build Coastguard Worker
942*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
943*61c4878aSAndroid Build Coastguard Worker Decode(
944*61c4878aSAndroid Build Coastguard Worker MakeBuffer("\x00"), &value, Format::kZeroTerminatedLeastSignificant),
945*61c4878aSAndroid Build Coastguard Worker 1u);
946*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0u);
947*61c4878aSAndroid Build Coastguard Worker
948*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
949*61c4878aSAndroid Build Coastguard Worker Decode(
950*61c4878aSAndroid Build Coastguard Worker MakeBuffer("\x04"), &value, Format::kZeroTerminatedLeastSignificant),
951*61c4878aSAndroid Build Coastguard Worker 1u);
952*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 2u);
953*61c4878aSAndroid Build Coastguard Worker
954*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
955*61c4878aSAndroid Build Coastguard Worker Decode(
956*61c4878aSAndroid Build Coastguard Worker MakeBuffer("\xaa"), &value, Format::kZeroTerminatedLeastSignificant),
957*61c4878aSAndroid Build Coastguard Worker 1u);
958*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 85u);
959*61c4878aSAndroid Build Coastguard Worker
960*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
961*61c4878aSAndroid Build Coastguard Worker Decode(
962*61c4878aSAndroid Build Coastguard Worker MakeBuffer("\x01"), &value, Format::kZeroTerminatedLeastSignificant),
963*61c4878aSAndroid Build Coastguard Worker 0u);
964*61c4878aSAndroid Build Coastguard Worker
965*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
966*61c4878aSAndroid Build Coastguard Worker Decode(
967*61c4878aSAndroid Build Coastguard Worker MakeBuffer("\x01"), &value, Format::kOneTerminatedLeastSignificant),
968*61c4878aSAndroid Build Coastguard Worker 1u);
969*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0u);
970*61c4878aSAndroid Build Coastguard Worker
971*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
972*61c4878aSAndroid Build Coastguard Worker Decode(
973*61c4878aSAndroid Build Coastguard Worker MakeBuffer("\x13"), &value, Format::kOneTerminatedLeastSignificant),
974*61c4878aSAndroid Build Coastguard Worker 1u);
975*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 9u);
976*61c4878aSAndroid Build Coastguard Worker
977*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
978*61c4878aSAndroid Build Coastguard Worker Decode(
979*61c4878aSAndroid Build Coastguard Worker MakeBuffer("\x00"), &value, Format::kOneTerminatedLeastSignificant),
980*61c4878aSAndroid Build Coastguard Worker 0u);
981*61c4878aSAndroid Build Coastguard Worker
982*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
983*61c4878aSAndroid Build Coastguard Worker Decode(
984*61c4878aSAndroid Build Coastguard Worker MakeBuffer("\x00"), &value, Format::kZeroTerminatedMostSignificant),
985*61c4878aSAndroid Build Coastguard Worker 1u);
986*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0u);
987*61c4878aSAndroid Build Coastguard Worker
988*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
989*61c4878aSAndroid Build Coastguard Worker Decode(
990*61c4878aSAndroid Build Coastguard Worker MakeBuffer("\x04"), &value, Format::kZeroTerminatedMostSignificant),
991*61c4878aSAndroid Build Coastguard Worker 1u);
992*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 4u);
993*61c4878aSAndroid Build Coastguard Worker
994*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
995*61c4878aSAndroid Build Coastguard Worker Decode(
996*61c4878aSAndroid Build Coastguard Worker MakeBuffer("\xff"), &value, Format::kZeroTerminatedMostSignificant),
997*61c4878aSAndroid Build Coastguard Worker 0u);
998*61c4878aSAndroid Build Coastguard Worker
999*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
1000*61c4878aSAndroid Build Coastguard Worker Decode(MakeBuffer("\x80"), &value, Format::kOneTerminatedMostSignificant),
1001*61c4878aSAndroid Build Coastguard Worker 1u);
1002*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0u);
1003*61c4878aSAndroid Build Coastguard Worker
1004*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
1005*61c4878aSAndroid Build Coastguard Worker Decode(MakeBuffer("\x83"), &value, Format::kOneTerminatedMostSignificant),
1006*61c4878aSAndroid Build Coastguard Worker 1u);
1007*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 3u);
1008*61c4878aSAndroid Build Coastguard Worker
1009*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
1010*61c4878aSAndroid Build Coastguard Worker Decode(MakeBuffer("\xaa"), &value, Format::kOneTerminatedMostSignificant),
1011*61c4878aSAndroid Build Coastguard Worker 1u);
1012*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 42u);
1013*61c4878aSAndroid Build Coastguard Worker
1014*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
1015*61c4878aSAndroid Build Coastguard Worker Decode(MakeBuffer("\xff"), &value, Format::kOneTerminatedMostSignificant),
1016*61c4878aSAndroid Build Coastguard Worker 1u);
1017*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 127u);
1018*61c4878aSAndroid Build Coastguard Worker
1019*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
1020*61c4878aSAndroid Build Coastguard Worker Decode(MakeBuffer("\x00"), &value, Format::kOneTerminatedMostSignificant),
1021*61c4878aSAndroid Build Coastguard Worker 0u);
1022*61c4878aSAndroid Build Coastguard Worker }
1023*61c4878aSAndroid Build Coastguard Worker
TEST(Varint,DecodeWithOptions_MultiByte)1024*61c4878aSAndroid Build Coastguard Worker TEST(Varint, DecodeWithOptions_MultiByte) {
1025*61c4878aSAndroid Build Coastguard Worker uint64_t value;
1026*61c4878aSAndroid Build Coastguard Worker
1027*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x01\x10"),
1028*61c4878aSAndroid Build Coastguard Worker &value,
1029*61c4878aSAndroid Build Coastguard Worker Format::kZeroTerminatedLeastSignificant),
1030*61c4878aSAndroid Build Coastguard Worker 2u);
1031*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 1024u);
1032*61c4878aSAndroid Build Coastguard Worker
1033*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\xff\xff\xff\xfe"),
1034*61c4878aSAndroid Build Coastguard Worker &value,
1035*61c4878aSAndroid Build Coastguard Worker Format::kZeroTerminatedLeastSignificant),
1036*61c4878aSAndroid Build Coastguard Worker 4u);
1037*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0x0fffffffu);
1038*61c4878aSAndroid Build Coastguard Worker
1039*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x01\x01\x01\x01\x00"),
1040*61c4878aSAndroid Build Coastguard Worker &value,
1041*61c4878aSAndroid Build Coastguard Worker Format::kZeroTerminatedLeastSignificant),
1042*61c4878aSAndroid Build Coastguard Worker 5u);
1043*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0u);
1044*61c4878aSAndroid Build Coastguard Worker
1045*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x82\x2d"),
1046*61c4878aSAndroid Build Coastguard Worker &value,
1047*61c4878aSAndroid Build Coastguard Worker Format::kOneTerminatedLeastSignificant),
1048*61c4878aSAndroid Build Coastguard Worker 2u);
1049*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 2881u);
1050*61c4878aSAndroid Build Coastguard Worker
1051*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\xfe\xfe\xfe\xff"),
1052*61c4878aSAndroid Build Coastguard Worker &value,
1053*61c4878aSAndroid Build Coastguard Worker Format::kOneTerminatedLeastSignificant),
1054*61c4878aSAndroid Build Coastguard Worker 4u);
1055*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0x0fffffffu);
1056*61c4878aSAndroid Build Coastguard Worker
1057*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x00\x00\x00\x00\x01"),
1058*61c4878aSAndroid Build Coastguard Worker &value,
1059*61c4878aSAndroid Build Coastguard Worker Format::kOneTerminatedLeastSignificant),
1060*61c4878aSAndroid Build Coastguard Worker 5u);
1061*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0u);
1062*61c4878aSAndroid Build Coastguard Worker
1063*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x83\x6a"),
1064*61c4878aSAndroid Build Coastguard Worker &value,
1065*61c4878aSAndroid Build Coastguard Worker Format::kZeroTerminatedMostSignificant),
1066*61c4878aSAndroid Build Coastguard Worker 2u);
1067*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0b1101010'0000011u);
1068*61c4878aSAndroid Build Coastguard Worker
1069*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\xff\xff\xff\x7f"),
1070*61c4878aSAndroid Build Coastguard Worker &value,
1071*61c4878aSAndroid Build Coastguard Worker Format::kZeroTerminatedMostSignificant),
1072*61c4878aSAndroid Build Coastguard Worker 4u);
1073*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0x0fffffffu);
1074*61c4878aSAndroid Build Coastguard Worker
1075*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x80\x80\x80\x80\x00"),
1076*61c4878aSAndroid Build Coastguard Worker &value,
1077*61c4878aSAndroid Build Coastguard Worker Format::kZeroTerminatedMostSignificant),
1078*61c4878aSAndroid Build Coastguard Worker 5u);
1079*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0u);
1080*61c4878aSAndroid Build Coastguard Worker
1081*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x6a\x83"),
1082*61c4878aSAndroid Build Coastguard Worker &value,
1083*61c4878aSAndroid Build Coastguard Worker Format::kOneTerminatedMostSignificant),
1084*61c4878aSAndroid Build Coastguard Worker 2u);
1085*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0b0000011'1101010u);
1086*61c4878aSAndroid Build Coastguard Worker
1087*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x7f\x7f\x7f\xff"),
1088*61c4878aSAndroid Build Coastguard Worker &value,
1089*61c4878aSAndroid Build Coastguard Worker Format::kOneTerminatedMostSignificant),
1090*61c4878aSAndroid Build Coastguard Worker 4u);
1091*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0x0fffffffu);
1092*61c4878aSAndroid Build Coastguard Worker
1093*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Decode(MakeBuffer("\x00\x00\x00\x00\x80"),
1094*61c4878aSAndroid Build Coastguard Worker &value,
1095*61c4878aSAndroid Build Coastguard Worker Format::kOneTerminatedMostSignificant),
1096*61c4878aSAndroid Build Coastguard Worker 5u);
1097*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0u);
1098*61c4878aSAndroid Build Coastguard Worker }
1099*61c4878aSAndroid Build Coastguard Worker
1100*61c4878aSAndroid Build Coastguard Worker #define ENCODED_SIZE_TEST(function) \
1101*61c4878aSAndroid Build Coastguard Worker TEST(Varint, function) { \
1102*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(0u)), 1u); \
1103*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(1u)), 1u); \
1104*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(127u)), 1u); \
1105*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(128u)), 2u); \
1106*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(16383u)), 2u); \
1107*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(16384u)), 3u); \
1108*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(2097151u)), 3u); \
1109*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(2097152u)), 4u); \
1110*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(268435455u)), 4u); \
1111*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(268435456u)), 5u); \
1112*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(34359738367u)), 5u); \
1113*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(34359738368u)), 6u); \
1114*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(4398046511103u)), 6u); \
1115*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(4398046511104u)), 7u); \
1116*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(562949953421311u)), 7u); \
1117*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(562949953421312u)), 8u); \
1118*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(72057594037927935u)), 8u); \
1119*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(72057594037927936u)), 9u); \
1120*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(9223372036854775807u)), 9u); \
1121*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(9223372036854775808u)), 10u); \
1122*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(std::numeric_limits<uint64_t>::max()), 10u); \
1123*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ( \
1124*61c4878aSAndroid Build Coastguard Worker static_cast<uint64_t>(function(std::numeric_limits<int64_t>::max())), \
1125*61c4878aSAndroid Build Coastguard Worker 9u); \
1126*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(function(uint64_t(-1)), 10u); \
1127*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ( \
1128*61c4878aSAndroid Build Coastguard Worker function(static_cast<uint64_t>(std::numeric_limits<int64_t>::min())), \
1129*61c4878aSAndroid Build Coastguard Worker 10u); \
1130*61c4878aSAndroid Build Coastguard Worker } \
1131*61c4878aSAndroid Build Coastguard Worker static_assert(true)
1132*61c4878aSAndroid Build Coastguard Worker
1133*61c4878aSAndroid Build Coastguard Worker ENCODED_SIZE_TEST(EncodedSize);
1134*61c4878aSAndroid Build Coastguard Worker ENCODED_SIZE_TEST(pw_varint_EncodedSizeBytes);
1135*61c4878aSAndroid Build Coastguard Worker ENCODED_SIZE_TEST(PW_VARINT_ENCODED_SIZE_BYTES);
1136*61c4878aSAndroid Build Coastguard Worker
CalculateMaxValueInBytes(size_t bytes)1137*61c4878aSAndroid Build Coastguard Worker constexpr uint64_t CalculateMaxValueInBytes(size_t bytes) {
1138*61c4878aSAndroid Build Coastguard Worker uint64_t value = 0;
1139*61c4878aSAndroid Build Coastguard Worker for (size_t i = 0; i < bytes; ++i) {
1140*61c4878aSAndroid Build Coastguard Worker value |= uint64_t(0x7f) << (7 * i);
1141*61c4878aSAndroid Build Coastguard Worker }
1142*61c4878aSAndroid Build Coastguard Worker return value;
1143*61c4878aSAndroid Build Coastguard Worker }
1144*61c4878aSAndroid Build Coastguard Worker
TEST(Varint,MaxValueInBytes)1145*61c4878aSAndroid Build Coastguard Worker TEST(Varint, MaxValueInBytes) {
1146*61c4878aSAndroid Build Coastguard Worker static_assert(MaxValueInBytes(0) == 0);
1147*61c4878aSAndroid Build Coastguard Worker static_assert(MaxValueInBytes(1) == 0x7f);
1148*61c4878aSAndroid Build Coastguard Worker static_assert(MaxValueInBytes(2) == 0x3fff);
1149*61c4878aSAndroid Build Coastguard Worker static_assert(MaxValueInBytes(3) == 0x1fffff);
1150*61c4878aSAndroid Build Coastguard Worker static_assert(MaxValueInBytes(4) == 0x0fffffff);
1151*61c4878aSAndroid Build Coastguard Worker static_assert(MaxValueInBytes(5) == CalculateMaxValueInBytes(5));
1152*61c4878aSAndroid Build Coastguard Worker static_assert(MaxValueInBytes(6) == CalculateMaxValueInBytes(6));
1153*61c4878aSAndroid Build Coastguard Worker static_assert(MaxValueInBytes(7) == CalculateMaxValueInBytes(7));
1154*61c4878aSAndroid Build Coastguard Worker static_assert(MaxValueInBytes(8) == CalculateMaxValueInBytes(8));
1155*61c4878aSAndroid Build Coastguard Worker static_assert(MaxValueInBytes(9) == CalculateMaxValueInBytes(9));
1156*61c4878aSAndroid Build Coastguard Worker static_assert(MaxValueInBytes(10) == std::numeric_limits<uint64_t>::max());
1157*61c4878aSAndroid Build Coastguard Worker static_assert(MaxValueInBytes(11) == std::numeric_limits<uint64_t>::max());
1158*61c4878aSAndroid Build Coastguard Worker static_assert(MaxValueInBytes(100) == std::numeric_limits<uint64_t>::max());
1159*61c4878aSAndroid Build Coastguard Worker }
1160*61c4878aSAndroid Build Coastguard Worker
1161*61c4878aSAndroid Build Coastguard Worker } // namespace
1162*61c4878aSAndroid Build Coastguard Worker } // namespace pw::varint
1163