1*6777b538SAndroid Build Coastguard Worker // Copyright 2024 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/containers/span_reader.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
8*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker using testing::Optional;
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Worker namespace base {
13*6777b538SAndroid Build Coastguard Worker namespace {
14*6777b538SAndroid Build Coastguard Worker
TEST(SpanReaderTest,Construct)15*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, Construct) {
16*6777b538SAndroid Build Coastguard Worker std::array<const int, 5u> kArray = {1, 2, 3, 4, 5};
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kArray));
19*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 5u);
20*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining_span().data(), &kArray[0u]);
21*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining_span().size(), 5u);
22*6777b538SAndroid Build Coastguard Worker }
23*6777b538SAndroid Build Coastguard Worker
TEST(SpanReaderTest,Skip)24*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, Skip) {
25*6777b538SAndroid Build Coastguard Worker std::array<const int, 5u> kArray = {1, 2, 3, 4, 5};
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kArray));
28*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.num_read(), 0u);
29*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(r.Skip(6u));
30*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(r.Skip(2u), Optional(base::span(kArray).first(2u)));
31*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.num_read(), 2u);
32*6777b538SAndroid Build Coastguard Worker }
33*6777b538SAndroid Build Coastguard Worker
TEST(SpanReaderTest,Read)34*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, Read) {
35*6777b538SAndroid Build Coastguard Worker std::array<const int, 5u> kArray = {1, 2, 3, 4, 5};
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kArray));
38*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.num_read(), 0u);
39*6777b538SAndroid Build Coastguard Worker {
40*6777b538SAndroid Build Coastguard Worker auto o = r.Read(2u);
41*6777b538SAndroid Build Coastguard Worker static_assert(std::same_as<decltype(*o), span<const int>&>);
42*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(o.has_value());
43*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(*o == base::span(kArray).subspan(0u, 2u));
44*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 3u);
45*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.num_read(), 2u);
46*6777b538SAndroid Build Coastguard Worker }
47*6777b538SAndroid Build Coastguard Worker {
48*6777b538SAndroid Build Coastguard Worker auto o = r.Read(5u);
49*6777b538SAndroid Build Coastguard Worker static_assert(std::same_as<decltype(*o), span<const int>&>);
50*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(o.has_value());
51*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 3u);
52*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.num_read(), 2u);
53*6777b538SAndroid Build Coastguard Worker }
54*6777b538SAndroid Build Coastguard Worker {
55*6777b538SAndroid Build Coastguard Worker auto o = r.Read(1u);
56*6777b538SAndroid Build Coastguard Worker static_assert(std::same_as<decltype(*o), span<const int>&>);
57*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(o.has_value());
58*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(*o == base::span(kArray).subspan(2u, 1u));
59*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 2u);
60*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.num_read(), 3u);
61*6777b538SAndroid Build Coastguard Worker }
62*6777b538SAndroid Build Coastguard Worker {
63*6777b538SAndroid Build Coastguard Worker auto o = r.Read(2u);
64*6777b538SAndroid Build Coastguard Worker static_assert(std::same_as<decltype(*o), span<const int>&>);
65*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(o.has_value());
66*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(*o == base::span(kArray).subspan(3u, 2u));
67*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 0u);
68*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.num_read(), 5u);
69*6777b538SAndroid Build Coastguard Worker }
70*6777b538SAndroid Build Coastguard Worker }
71*6777b538SAndroid Build Coastguard Worker
TEST(SpanReaderTest,ReadFixed)72*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, ReadFixed) {
73*6777b538SAndroid Build Coastguard Worker std::array<const int, 5u> kArray = {1, 2, 3, 4, 5};
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kArray));
76*6777b538SAndroid Build Coastguard Worker {
77*6777b538SAndroid Build Coastguard Worker auto o = r.Read<2u>();
78*6777b538SAndroid Build Coastguard Worker static_assert(std::same_as<decltype(*o), span<const int, 2u>&>);
79*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(o.has_value());
80*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(*o == base::span(kArray).subspan(0u, 2u));
81*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 3u);
82*6777b538SAndroid Build Coastguard Worker }
83*6777b538SAndroid Build Coastguard Worker {
84*6777b538SAndroid Build Coastguard Worker auto o = r.Read<5u>();
85*6777b538SAndroid Build Coastguard Worker static_assert(std::same_as<decltype(*o), span<const int, 5u>&>);
86*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(o.has_value());
87*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 3u);
88*6777b538SAndroid Build Coastguard Worker }
89*6777b538SAndroid Build Coastguard Worker {
90*6777b538SAndroid Build Coastguard Worker auto o = r.Read<1u>();
91*6777b538SAndroid Build Coastguard Worker static_assert(std::same_as<decltype(*o), span<const int, 1u>&>);
92*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(o.has_value());
93*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(*o == base::span(kArray).subspan(2u, 1u));
94*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 2u);
95*6777b538SAndroid Build Coastguard Worker }
96*6777b538SAndroid Build Coastguard Worker {
97*6777b538SAndroid Build Coastguard Worker auto o = r.Read<2u>();
98*6777b538SAndroid Build Coastguard Worker static_assert(std::same_as<decltype(*o), span<const int, 2u>&>);
99*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(o.has_value());
100*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(*o == base::span(kArray).subspan(3u, 2u));
101*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 0u);
102*6777b538SAndroid Build Coastguard Worker }
103*6777b538SAndroid Build Coastguard Worker }
104*6777b538SAndroid Build Coastguard Worker
TEST(SpanReaderTest,ReadInto)105*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, ReadInto) {
106*6777b538SAndroid Build Coastguard Worker std::array<const int, 5u> kArray = {1, 2, 3, 4, 5};
107*6777b538SAndroid Build Coastguard Worker
108*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kArray));
109*6777b538SAndroid Build Coastguard Worker {
110*6777b538SAndroid Build Coastguard Worker base::span<const int> s;
111*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadInto(2u, s));
112*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(s == base::span(kArray).subspan(0u, 2u));
113*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 3u);
114*6777b538SAndroid Build Coastguard Worker }
115*6777b538SAndroid Build Coastguard Worker {
116*6777b538SAndroid Build Coastguard Worker base::span<const int> s;
117*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(r.ReadInto(5u, s));
118*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 3u);
119*6777b538SAndroid Build Coastguard Worker }
120*6777b538SAndroid Build Coastguard Worker {
121*6777b538SAndroid Build Coastguard Worker base::span<const int> s;
122*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadInto(1u, s));
123*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(s == base::span(kArray).subspan(2u, 1u));
124*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 2u);
125*6777b538SAndroid Build Coastguard Worker }
126*6777b538SAndroid Build Coastguard Worker {
127*6777b538SAndroid Build Coastguard Worker base::span<const int> s;
128*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadInto(2u, s));
129*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(s == base::span(kArray).subspan(3u, 2u));
130*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 0u);
131*6777b538SAndroid Build Coastguard Worker }
132*6777b538SAndroid Build Coastguard Worker }
133*6777b538SAndroid Build Coastguard Worker
TEST(SpanReaderTest,ReadCopy)134*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, ReadCopy) {
135*6777b538SAndroid Build Coastguard Worker std::array<const int, 5u> kArray = {1, 2, 3, 4, 5};
136*6777b538SAndroid Build Coastguard Worker
137*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kArray));
138*6777b538SAndroid Build Coastguard Worker {
139*6777b538SAndroid Build Coastguard Worker std::array<int, 2u> s;
140*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadCopy(s));
141*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(s == base::span(kArray).subspan(0u, 2u));
142*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 3u);
143*6777b538SAndroid Build Coastguard Worker }
144*6777b538SAndroid Build Coastguard Worker {
145*6777b538SAndroid Build Coastguard Worker std::array<int, 5u> s;
146*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(r.ReadCopy(s));
147*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 3u);
148*6777b538SAndroid Build Coastguard Worker }
149*6777b538SAndroid Build Coastguard Worker {
150*6777b538SAndroid Build Coastguard Worker std::array<int, 1u> s;
151*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadCopy(s));
152*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(s == base::span(kArray).subspan(2u, 1u));
153*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 2u);
154*6777b538SAndroid Build Coastguard Worker }
155*6777b538SAndroid Build Coastguard Worker {
156*6777b538SAndroid Build Coastguard Worker std::array<int, 2u> s;
157*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadCopy(s));
158*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(s == base::span(kArray).subspan(3u, 2u));
159*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 0u);
160*6777b538SAndroid Build Coastguard Worker }
161*6777b538SAndroid Build Coastguard Worker }
162*6777b538SAndroid Build Coastguard Worker
TEST(SpanReaderTest,ReadBigEndian)163*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, ReadBigEndian) {
164*6777b538SAndroid Build Coastguard Worker const std::array<uint8_t, 5u> kArray = {uint8_t{1}, uint8_t{2}, uint8_t{3},
165*6777b538SAndroid Build Coastguard Worker uint8_t{4}, uint8_t{5}};
166*6777b538SAndroid Build Coastguard Worker
167*6777b538SAndroid Build Coastguard Worker {
168*6777b538SAndroid Build Coastguard Worker uint8_t val;
169*6777b538SAndroid Build Coastguard Worker
170*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kArray));
171*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.Skip(1u));
172*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadU8BigEndian(val));
173*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 3u);
174*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(val, 0x02u);
175*6777b538SAndroid Build Coastguard Worker }
176*6777b538SAndroid Build Coastguard Worker
177*6777b538SAndroid Build Coastguard Worker {
178*6777b538SAndroid Build Coastguard Worker uint16_t val;
179*6777b538SAndroid Build Coastguard Worker
180*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kArray));
181*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.Skip(1u));
182*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadU16BigEndian(val));
183*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 2u);
184*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(val, 0x0203u);
185*6777b538SAndroid Build Coastguard Worker }
186*6777b538SAndroid Build Coastguard Worker
187*6777b538SAndroid Build Coastguard Worker {
188*6777b538SAndroid Build Coastguard Worker uint32_t val;
189*6777b538SAndroid Build Coastguard Worker
190*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kArray));
191*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.Skip(1u));
192*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadU32BigEndian(val));
193*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 0u);
194*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(val, 0x02030405u);
195*6777b538SAndroid Build Coastguard Worker }
196*6777b538SAndroid Build Coastguard Worker
197*6777b538SAndroid Build Coastguard Worker std::array<uint8_t, 9u> kBigArray = {uint8_t{1}, uint8_t{2}, uint8_t{3},
198*6777b538SAndroid Build Coastguard Worker uint8_t{4}, uint8_t{5}, uint8_t{6},
199*6777b538SAndroid Build Coastguard Worker uint8_t{7}, uint8_t{8}, uint8_t{9}};
200*6777b538SAndroid Build Coastguard Worker
201*6777b538SAndroid Build Coastguard Worker {
202*6777b538SAndroid Build Coastguard Worker uint64_t val;
203*6777b538SAndroid Build Coastguard Worker
204*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kBigArray));
205*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.Skip(1u));
206*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadU64BigEndian(val));
207*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 0u);
208*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(val, 0x0203040506070809llu);
209*6777b538SAndroid Build Coastguard Worker }
210*6777b538SAndroid Build Coastguard Worker }
211*6777b538SAndroid Build Coastguard Worker
TEST(SpanReaderTest,ReadLittleEndian)212*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, ReadLittleEndian) {
213*6777b538SAndroid Build Coastguard Worker const std::array<uint8_t, 5u> kArray = {uint8_t{1}, uint8_t{2}, uint8_t{3},
214*6777b538SAndroid Build Coastguard Worker uint8_t{4}, uint8_t{5}};
215*6777b538SAndroid Build Coastguard Worker
216*6777b538SAndroid Build Coastguard Worker {
217*6777b538SAndroid Build Coastguard Worker uint8_t val;
218*6777b538SAndroid Build Coastguard Worker
219*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kArray));
220*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.Skip(1u));
221*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadU8LittleEndian(val));
222*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 3u);
223*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(val, 0x02u);
224*6777b538SAndroid Build Coastguard Worker }
225*6777b538SAndroid Build Coastguard Worker
226*6777b538SAndroid Build Coastguard Worker {
227*6777b538SAndroid Build Coastguard Worker uint16_t val;
228*6777b538SAndroid Build Coastguard Worker
229*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kArray));
230*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.Skip(1u));
231*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadU16LittleEndian(val));
232*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 2u);
233*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(val, 0x0302u);
234*6777b538SAndroid Build Coastguard Worker }
235*6777b538SAndroid Build Coastguard Worker
236*6777b538SAndroid Build Coastguard Worker {
237*6777b538SAndroid Build Coastguard Worker uint32_t val;
238*6777b538SAndroid Build Coastguard Worker
239*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kArray));
240*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.Skip(1u));
241*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadU32LittleEndian(val));
242*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 0u);
243*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(val, 0x05040302u);
244*6777b538SAndroid Build Coastguard Worker }
245*6777b538SAndroid Build Coastguard Worker
246*6777b538SAndroid Build Coastguard Worker std::array<uint8_t, 9u> kBigArray = {uint8_t{1}, uint8_t{2}, uint8_t{3},
247*6777b538SAndroid Build Coastguard Worker uint8_t{4}, uint8_t{5}, uint8_t{6},
248*6777b538SAndroid Build Coastguard Worker uint8_t{7}, uint8_t{8}, uint8_t{9}};
249*6777b538SAndroid Build Coastguard Worker
250*6777b538SAndroid Build Coastguard Worker {
251*6777b538SAndroid Build Coastguard Worker uint64_t val;
252*6777b538SAndroid Build Coastguard Worker
253*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kBigArray));
254*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.Skip(1u));
255*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadU64LittleEndian(val));
256*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 0u);
257*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(val, 0x0908070605040302llu);
258*6777b538SAndroid Build Coastguard Worker }
259*6777b538SAndroid Build Coastguard Worker }
260*6777b538SAndroid Build Coastguard Worker
TEST(SpanReaderTest,ReadNativeEndian)261*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, ReadNativeEndian) {
262*6777b538SAndroid Build Coastguard Worker const std::array<uint8_t, 5u> kArray = {uint8_t{1}, uint8_t{2}, uint8_t{3},
263*6777b538SAndroid Build Coastguard Worker uint8_t{4}, uint8_t{5}};
264*6777b538SAndroid Build Coastguard Worker
265*6777b538SAndroid Build Coastguard Worker {
266*6777b538SAndroid Build Coastguard Worker uint8_t val;
267*6777b538SAndroid Build Coastguard Worker
268*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kArray));
269*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.Skip(1u));
270*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadU8NativeEndian(val));
271*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 3u);
272*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(val, 0x02u);
273*6777b538SAndroid Build Coastguard Worker }
274*6777b538SAndroid Build Coastguard Worker
275*6777b538SAndroid Build Coastguard Worker {
276*6777b538SAndroid Build Coastguard Worker uint16_t val;
277*6777b538SAndroid Build Coastguard Worker
278*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kArray));
279*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.Skip(1u));
280*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadU16NativeEndian(val));
281*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 2u);
282*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(val, 0x0302u);
283*6777b538SAndroid Build Coastguard Worker }
284*6777b538SAndroid Build Coastguard Worker
285*6777b538SAndroid Build Coastguard Worker {
286*6777b538SAndroid Build Coastguard Worker uint32_t val;
287*6777b538SAndroid Build Coastguard Worker
288*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kArray));
289*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.Skip(1u));
290*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadU32NativeEndian(val));
291*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 0u);
292*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(val, 0x05040302u);
293*6777b538SAndroid Build Coastguard Worker }
294*6777b538SAndroid Build Coastguard Worker
295*6777b538SAndroid Build Coastguard Worker std::array<uint8_t, 9u> kBigArray = {uint8_t{1}, uint8_t{2}, uint8_t{3},
296*6777b538SAndroid Build Coastguard Worker uint8_t{4}, uint8_t{5}, uint8_t{6},
297*6777b538SAndroid Build Coastguard Worker uint8_t{7}, uint8_t{8}, uint8_t{9}};
298*6777b538SAndroid Build Coastguard Worker
299*6777b538SAndroid Build Coastguard Worker {
300*6777b538SAndroid Build Coastguard Worker uint64_t val;
301*6777b538SAndroid Build Coastguard Worker
302*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kBigArray));
303*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.Skip(1u));
304*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadU64NativeEndian(val));
305*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.remaining(), 0u);
306*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(val, 0x0908070605040302llu);
307*6777b538SAndroid Build Coastguard Worker }
308*6777b538SAndroid Build Coastguard Worker }
309*6777b538SAndroid Build Coastguard Worker
TEST(SpanReaderTest,ReadChar)310*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, ReadChar) {
311*6777b538SAndroid Build Coastguard Worker std::array<const uint8_t, 5u> kArray = {uint8_t{1}, uint8_t{2}, uint8_t{3},
312*6777b538SAndroid Build Coastguard Worker uint8_t{4}, uint8_t{5}};
313*6777b538SAndroid Build Coastguard Worker
314*6777b538SAndroid Build Coastguard Worker auto r = SpanReader(base::span(kArray));
315*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(r.num_read(), 0u);
316*6777b538SAndroid Build Coastguard Worker
317*6777b538SAndroid Build Coastguard Worker char c;
318*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadChar(c));
319*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(c, char{1});
320*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.Skip(3u));
321*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(r.ReadChar(c));
322*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(c, char{5});
323*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(r.ReadChar(c));
324*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(c, char{5});
325*6777b538SAndroid Build Coastguard Worker }
326*6777b538SAndroid Build Coastguard Worker
327*6777b538SAndroid Build Coastguard Worker } // namespace
328*6777b538SAndroid Build Coastguard Worker } // namespace base
329