xref: /llvm-project/lldb/unittests/Utility/StringExtractorTest.cpp (revision 28529f607c4767cd848b910e58d0131adc47fa01)
1719ec93aSZachary Turner #include <limits.h>
2719ec93aSZachary Turner #include "gtest/gtest.h"
3719ec93aSZachary Turner 
4*28529f60SBruce Mitchener #include "lldb/Utility/StringExtractor.h"
5719ec93aSZachary Turner 
6719ec93aSZachary Turner namespace
7719ec93aSZachary Turner {
8719ec93aSZachary Turner     class StringExtractorTest: public ::testing::Test
9719ec93aSZachary Turner     {
10719ec93aSZachary Turner     };
11719ec93aSZachary Turner }
12719ec93aSZachary Turner 
13719ec93aSZachary Turner TEST_F (StringExtractorTest, InitEmpty)
14719ec93aSZachary Turner {
15719ec93aSZachary Turner     const char kEmptyString[] = "";
16719ec93aSZachary Turner     StringExtractor ex (kEmptyString);
17719ec93aSZachary Turner 
18719ec93aSZachary Turner     ASSERT_EQ (true, ex.IsGood());
193dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetFilePos());
20719ec93aSZachary Turner     ASSERT_STREQ (kEmptyString, ex.GetStringRef().c_str());
21719ec93aSZachary Turner     ASSERT_EQ (true, ex.Empty());
223dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetBytesLeft());
23719ec93aSZachary Turner     ASSERT_EQ (nullptr, ex.Peek());
24719ec93aSZachary Turner }
25719ec93aSZachary Turner 
26719ec93aSZachary Turner TEST_F (StringExtractorTest, InitMisc)
27719ec93aSZachary Turner {
28719ec93aSZachary Turner     const char kInitMiscString[] = "Hello, StringExtractor!";
29719ec93aSZachary Turner     StringExtractor ex (kInitMiscString);
30719ec93aSZachary Turner 
31719ec93aSZachary Turner     ASSERT_EQ (true, ex.IsGood());
323dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetFilePos());
33719ec93aSZachary Turner     ASSERT_STREQ (kInitMiscString, ex.GetStringRef().c_str());
34719ec93aSZachary Turner     ASSERT_EQ (false, ex.Empty());
35719ec93aSZachary Turner     ASSERT_EQ (sizeof(kInitMiscString)-1, ex.GetBytesLeft());
36719ec93aSZachary Turner     ASSERT_EQ (kInitMiscString[0], *ex.Peek());
37719ec93aSZachary Turner }
38719ec93aSZachary Turner 
39719ec93aSZachary Turner TEST_F (StringExtractorTest, DecodeHexU8_Underflow)
40719ec93aSZachary Turner {
41719ec93aSZachary Turner     const char kEmptyString[] = "";
42719ec93aSZachary Turner     StringExtractor ex (kEmptyString);
43719ec93aSZachary Turner 
44719ec93aSZachary Turner     ASSERT_EQ (-1, ex.DecodeHexU8());
45719ec93aSZachary Turner     ASSERT_EQ (true, ex.IsGood());
463dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetFilePos());
47719ec93aSZachary Turner     ASSERT_EQ (true, ex.Empty());
483dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetBytesLeft());
49719ec93aSZachary Turner     ASSERT_EQ (nullptr, ex.Peek());
50719ec93aSZachary Turner }
51719ec93aSZachary Turner 
52719ec93aSZachary Turner TEST_F (StringExtractorTest, DecodeHexU8_Underflow2)
53719ec93aSZachary Turner {
54719ec93aSZachary Turner     const char kEmptyString[] = "1";
55719ec93aSZachary Turner     StringExtractor ex (kEmptyString);
56719ec93aSZachary Turner 
57719ec93aSZachary Turner     ASSERT_EQ (-1, ex.DecodeHexU8());
58719ec93aSZachary Turner     ASSERT_EQ (true, ex.IsGood());
593dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetFilePos());
603dfb86b6SDavid Blaikie     ASSERT_EQ (1u, ex.GetBytesLeft());
61719ec93aSZachary Turner     ASSERT_EQ ('1', *ex.Peek());
62719ec93aSZachary Turner }
63719ec93aSZachary Turner 
64719ec93aSZachary Turner TEST_F (StringExtractorTest, DecodeHexU8_InvalidHex)
65719ec93aSZachary Turner {
66719ec93aSZachary Turner     const char kInvalidHex[] = "xa";
67719ec93aSZachary Turner     StringExtractor ex (kInvalidHex);
68719ec93aSZachary Turner 
69719ec93aSZachary Turner     ASSERT_EQ (-1, ex.DecodeHexU8());
70719ec93aSZachary Turner     ASSERT_EQ (true, ex.IsGood());
713dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetFilePos());
723dfb86b6SDavid Blaikie     ASSERT_EQ (2u, ex.GetBytesLeft());
73719ec93aSZachary Turner     ASSERT_EQ ('x', *ex.Peek());
74719ec93aSZachary Turner }
75719ec93aSZachary Turner 
76719ec93aSZachary Turner TEST_F (StringExtractorTest, DecodeHexU8_InvalidHex2)
77719ec93aSZachary Turner {
78719ec93aSZachary Turner     const char kInvalidHex[] = "ax";
79719ec93aSZachary Turner     StringExtractor ex (kInvalidHex);
80719ec93aSZachary Turner 
81719ec93aSZachary Turner     ASSERT_EQ (-1, ex.DecodeHexU8());
82719ec93aSZachary Turner     ASSERT_EQ (true, ex.IsGood());
833dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetFilePos());
843dfb86b6SDavid Blaikie     ASSERT_EQ (2u, ex.GetBytesLeft());
85719ec93aSZachary Turner     ASSERT_EQ ('a', *ex.Peek());
86719ec93aSZachary Turner }
87719ec93aSZachary Turner 
88719ec93aSZachary Turner TEST_F (StringExtractorTest, DecodeHexU8_Exact)
89719ec93aSZachary Turner {
90719ec93aSZachary Turner     const char kValidHexPair[] = "12";
91719ec93aSZachary Turner     StringExtractor ex (kValidHexPair);
92719ec93aSZachary Turner 
93719ec93aSZachary Turner     ASSERT_EQ (0x12, ex.DecodeHexU8());
94719ec93aSZachary Turner     ASSERT_EQ (true, ex.IsGood());
953dfb86b6SDavid Blaikie     ASSERT_EQ (2u, ex.GetFilePos());
963dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetBytesLeft());
97719ec93aSZachary Turner     ASSERT_EQ (nullptr, ex.Peek());
98719ec93aSZachary Turner }
99719ec93aSZachary Turner 
100719ec93aSZachary Turner TEST_F (StringExtractorTest, DecodeHexU8_Extra)
101719ec93aSZachary Turner {
102719ec93aSZachary Turner     const char kValidHexPair[] = "1234";
103719ec93aSZachary Turner     StringExtractor ex (kValidHexPair);
104719ec93aSZachary Turner 
105719ec93aSZachary Turner     ASSERT_EQ (0x12, ex.DecodeHexU8());
106719ec93aSZachary Turner     ASSERT_EQ (true, ex.IsGood());
1073dfb86b6SDavid Blaikie     ASSERT_EQ (2u, ex.GetFilePos());
1083dfb86b6SDavid Blaikie     ASSERT_EQ (2u, ex.GetBytesLeft());
109719ec93aSZachary Turner     ASSERT_EQ ('3', *ex.Peek());
110719ec93aSZachary Turner }
111719ec93aSZachary Turner 
112719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_Underflow)
113719ec93aSZachary Turner {
114719ec93aSZachary Turner     const char kEmptyString[] = "";
115719ec93aSZachary Turner     StringExtractor ex (kEmptyString);
116719ec93aSZachary Turner 
117719ec93aSZachary Turner     ASSERT_EQ (0xab, ex.GetHexU8(0xab));
118719ec93aSZachary Turner     ASSERT_EQ (false, ex.IsGood());
119719ec93aSZachary Turner     ASSERT_EQ (UINT64_MAX, ex.GetFilePos());
120719ec93aSZachary Turner     ASSERT_EQ (true, ex.Empty());
1213dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetBytesLeft());
122719ec93aSZachary Turner     ASSERT_EQ (nullptr, ex.Peek());
123719ec93aSZachary Turner }
124719ec93aSZachary Turner 
125719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_Underflow2)
126719ec93aSZachary Turner {
127719ec93aSZachary Turner     const char kOneNibble[] = "1";
128719ec93aSZachary Turner     StringExtractor ex (kOneNibble);
129719ec93aSZachary Turner 
130719ec93aSZachary Turner     ASSERT_EQ (0xbc, ex.GetHexU8(0xbc));
131719ec93aSZachary Turner     ASSERT_EQ (false, ex.IsGood());
132719ec93aSZachary Turner     ASSERT_EQ (UINT64_MAX, ex.GetFilePos());
1333dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetBytesLeft());
134719ec93aSZachary Turner     ASSERT_EQ (nullptr, ex.Peek());
135719ec93aSZachary Turner }
136719ec93aSZachary Turner 
137719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_InvalidHex)
138719ec93aSZachary Turner {
139719ec93aSZachary Turner     const char kInvalidHex[] = "xx";
140719ec93aSZachary Turner     StringExtractor ex (kInvalidHex);
141719ec93aSZachary Turner 
142719ec93aSZachary Turner     ASSERT_EQ (0xcd, ex.GetHexU8(0xcd));
143719ec93aSZachary Turner     ASSERT_EQ (false, ex.IsGood());
144719ec93aSZachary Turner     ASSERT_EQ (UINT64_MAX, ex.GetFilePos());
1453dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetBytesLeft());
146719ec93aSZachary Turner     ASSERT_EQ (nullptr, ex.Peek());
147719ec93aSZachary Turner }
148719ec93aSZachary Turner 
149719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_Exact)
150719ec93aSZachary Turner {
151719ec93aSZachary Turner     const char kValidHexPair[] = "12";
152719ec93aSZachary Turner     StringExtractor ex (kValidHexPair);
153719ec93aSZachary Turner 
154719ec93aSZachary Turner     ASSERT_EQ (0x12, ex.GetHexU8(0x12));
155719ec93aSZachary Turner     ASSERT_EQ (true, ex.IsGood());
1563dfb86b6SDavid Blaikie     ASSERT_EQ (2u, ex.GetFilePos());
1573dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetBytesLeft());
158719ec93aSZachary Turner     ASSERT_EQ (nullptr, ex.Peek());
159719ec93aSZachary Turner }
160719ec93aSZachary Turner 
161719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_Extra)
162719ec93aSZachary Turner {
163719ec93aSZachary Turner     const char kValidHexPair[] = "1234";
164719ec93aSZachary Turner     StringExtractor ex (kValidHexPair);
165719ec93aSZachary Turner 
166719ec93aSZachary Turner     ASSERT_EQ (0x12, ex.GetHexU8(0x12));
167719ec93aSZachary Turner     ASSERT_EQ (true, ex.IsGood());
1683dfb86b6SDavid Blaikie     ASSERT_EQ (2u, ex.GetFilePos());
1693dfb86b6SDavid Blaikie     ASSERT_EQ (2u, ex.GetBytesLeft());
170719ec93aSZachary Turner     ASSERT_EQ ('3', *ex.Peek());
171719ec93aSZachary Turner }
172719ec93aSZachary Turner 
173719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_Underflow_NoEof)
174719ec93aSZachary Turner {
175719ec93aSZachary Turner     const char kEmptyString[] = "";
176719ec93aSZachary Turner     StringExtractor ex (kEmptyString);
177719ec93aSZachary Turner     const bool kSetEofOnFail = false;
178719ec93aSZachary Turner 
179719ec93aSZachary Turner     ASSERT_EQ (0xab, ex.GetHexU8(0xab, kSetEofOnFail));
180719ec93aSZachary Turner     ASSERT_EQ (false, ex.IsGood()); // this result seems inconsistent with kSetEofOnFail == false
181719ec93aSZachary Turner     ASSERT_EQ (UINT64_MAX, ex.GetFilePos());
182719ec93aSZachary Turner     ASSERT_EQ (true, ex.Empty());
1833dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetBytesLeft());
184719ec93aSZachary Turner     ASSERT_EQ (nullptr, ex.Peek());
185719ec93aSZachary Turner }
186719ec93aSZachary Turner 
187719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_Underflow2_NoEof)
188719ec93aSZachary Turner {
189719ec93aSZachary Turner     const char kOneNibble[] = "1";
190719ec93aSZachary Turner     StringExtractor ex (kOneNibble);
191719ec93aSZachary Turner     const bool kSetEofOnFail = false;
192719ec93aSZachary Turner 
193719ec93aSZachary Turner     ASSERT_EQ (0xbc, ex.GetHexU8(0xbc, kSetEofOnFail));
194719ec93aSZachary Turner     ASSERT_EQ (true, ex.IsGood());
1953dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetFilePos());
1963dfb86b6SDavid Blaikie     ASSERT_EQ (1u, ex.GetBytesLeft());
197719ec93aSZachary Turner     ASSERT_EQ ('1', *ex.Peek());
198719ec93aSZachary Turner }
199719ec93aSZachary Turner 
200719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_InvalidHex_NoEof)
201719ec93aSZachary Turner {
202719ec93aSZachary Turner     const char kInvalidHex[] = "xx";
203719ec93aSZachary Turner     StringExtractor ex (kInvalidHex);
204719ec93aSZachary Turner     const bool kSetEofOnFail = false;
205719ec93aSZachary Turner 
206719ec93aSZachary Turner     ASSERT_EQ (0xcd, ex.GetHexU8(0xcd, kSetEofOnFail));
207719ec93aSZachary Turner     ASSERT_EQ (true, ex.IsGood());
2083dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetFilePos());
2093dfb86b6SDavid Blaikie     ASSERT_EQ (2u, ex.GetBytesLeft());
210719ec93aSZachary Turner     ASSERT_EQ ('x', *ex.Peek());
211719ec93aSZachary Turner }
212719ec93aSZachary Turner 
213719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_Exact_NoEof)
214719ec93aSZachary Turner {
215719ec93aSZachary Turner     const char kValidHexPair[] = "12";
216719ec93aSZachary Turner     StringExtractor ex (kValidHexPair);
217719ec93aSZachary Turner     const bool kSetEofOnFail = false;
218719ec93aSZachary Turner 
219719ec93aSZachary Turner     ASSERT_EQ (0x12, ex.GetHexU8(0x12, kSetEofOnFail));
220719ec93aSZachary Turner     ASSERT_EQ (true, ex.IsGood());
2213dfb86b6SDavid Blaikie     ASSERT_EQ (2u, ex.GetFilePos());
2223dfb86b6SDavid Blaikie     ASSERT_EQ (0u, ex.GetBytesLeft());
223719ec93aSZachary Turner     ASSERT_EQ (nullptr, ex.Peek());
224719ec93aSZachary Turner }
225719ec93aSZachary Turner 
226719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_Extra_NoEof)
227719ec93aSZachary Turner {
228719ec93aSZachary Turner     const char kValidHexPair[] = "1234";
229719ec93aSZachary Turner     StringExtractor ex (kValidHexPair);
230719ec93aSZachary Turner     const bool kSetEofOnFail = false;
231719ec93aSZachary Turner 
232719ec93aSZachary Turner     ASSERT_EQ (0x12, ex.GetHexU8(0x12, kSetEofOnFail));
233719ec93aSZachary Turner     ASSERT_EQ (true, ex.IsGood());
2343dfb86b6SDavid Blaikie     ASSERT_EQ (2u, ex.GetFilePos());
2353dfb86b6SDavid Blaikie     ASSERT_EQ (2u, ex.GetBytesLeft());
236719ec93aSZachary Turner     ASSERT_EQ ('3', *ex.Peek());
237719ec93aSZachary Turner }
238719ec93aSZachary Turner 
239719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexBytes)
240719ec93aSZachary Turner {
241719ec93aSZachary Turner     const char kHexEncodedBytes[] = "abcdef0123456789xyzw";
242719ec93aSZachary Turner     const size_t kValidHexPairs = 8;
243719ec93aSZachary Turner     StringExtractor ex(kHexEncodedBytes);
244719ec93aSZachary Turner 
245719ec93aSZachary Turner     uint8_t dst[kValidHexPairs];
246719ec93aSZachary Turner     ASSERT_EQ(kValidHexPairs, ex.GetHexBytes (dst, kValidHexPairs, 0xde));
247719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[0]);
248719ec93aSZachary Turner     EXPECT_EQ(0xcd,dst[1]);
249719ec93aSZachary Turner     EXPECT_EQ(0xef,dst[2]);
250719ec93aSZachary Turner     EXPECT_EQ(0x01,dst[3]);
251719ec93aSZachary Turner     EXPECT_EQ(0x23,dst[4]);
252719ec93aSZachary Turner     EXPECT_EQ(0x45,dst[5]);
253719ec93aSZachary Turner     EXPECT_EQ(0x67,dst[6]);
254719ec93aSZachary Turner     EXPECT_EQ(0x89,dst[7]);
255719ec93aSZachary Turner 
256719ec93aSZachary Turner     ASSERT_EQ(true, ex.IsGood());
257719ec93aSZachary Turner     ASSERT_EQ(2*kValidHexPairs, ex.GetFilePos());
258719ec93aSZachary Turner     ASSERT_EQ(false, ex.Empty());
2593dfb86b6SDavid Blaikie     ASSERT_EQ(4u, ex.GetBytesLeft());
260719ec93aSZachary Turner     ASSERT_EQ('x', *ex.Peek());
261719ec93aSZachary Turner }
262719ec93aSZachary Turner 
263719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexBytes_Underflow)
264719ec93aSZachary Turner {
265719ec93aSZachary Turner     const char kHexEncodedBytes[] = "abcdef0123456789xyzw";
266719ec93aSZachary Turner     const size_t kValidHexPairs = 8;
267719ec93aSZachary Turner     StringExtractor ex(kHexEncodedBytes);
268719ec93aSZachary Turner 
269719ec93aSZachary Turner     uint8_t dst[12];
270719ec93aSZachary Turner     ASSERT_EQ(kValidHexPairs, ex.GetHexBytes (dst, sizeof(dst), 0xde));
271719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[0]);
272719ec93aSZachary Turner     EXPECT_EQ(0xcd,dst[1]);
273719ec93aSZachary Turner     EXPECT_EQ(0xef,dst[2]);
274719ec93aSZachary Turner     EXPECT_EQ(0x01,dst[3]);
275719ec93aSZachary Turner     EXPECT_EQ(0x23,dst[4]);
276719ec93aSZachary Turner     EXPECT_EQ(0x45,dst[5]);
277719ec93aSZachary Turner     EXPECT_EQ(0x67,dst[6]);
278719ec93aSZachary Turner     EXPECT_EQ(0x89,dst[7]);
279719ec93aSZachary Turner     // these bytes should be filled with fail_fill_value 0xde
280719ec93aSZachary Turner     EXPECT_EQ(0xde,dst[8]);
281719ec93aSZachary Turner     EXPECT_EQ(0xde,dst[9]);
282719ec93aSZachary Turner     EXPECT_EQ(0xde,dst[10]);
283719ec93aSZachary Turner     EXPECT_EQ(0xde,dst[11]);
284719ec93aSZachary Turner 
285719ec93aSZachary Turner     ASSERT_EQ(false, ex.IsGood());
286719ec93aSZachary Turner     ASSERT_EQ(UINT64_MAX, ex.GetFilePos());
287719ec93aSZachary Turner     ASSERT_EQ(false, ex.Empty());
2883dfb86b6SDavid Blaikie     ASSERT_EQ(0u, ex.GetBytesLeft());
289719ec93aSZachary Turner     ASSERT_EQ(0, ex.Peek());
290719ec93aSZachary Turner }
291719ec93aSZachary Turner 
292719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexBytes_Partial)
293719ec93aSZachary Turner {
294719ec93aSZachary Turner     const char kHexEncodedBytes[] = "abcdef0123456789xyzw";
295719ec93aSZachary Turner     const size_t kReadBytes = 4;
296719ec93aSZachary Turner     StringExtractor ex(kHexEncodedBytes);
297719ec93aSZachary Turner 
298719ec93aSZachary Turner     uint8_t dst[12];
299719ec93aSZachary Turner     memset(dst, 0xab, sizeof(dst));
300719ec93aSZachary Turner     ASSERT_EQ(kReadBytes, ex.GetHexBytes (dst, kReadBytes, 0xde));
301719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[0]);
302719ec93aSZachary Turner     EXPECT_EQ(0xcd,dst[1]);
303719ec93aSZachary Turner     EXPECT_EQ(0xef,dst[2]);
304719ec93aSZachary Turner     EXPECT_EQ(0x01,dst[3]);
305719ec93aSZachary Turner     // these bytes should be unchanged
306719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[4]);
307719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[5]);
308719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[6]);
309719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[7]);
310719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[8]);
311719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[9]);
312719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[10]);
313719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[11]);
314719ec93aSZachary Turner 
315719ec93aSZachary Turner     ASSERT_EQ(true, ex.IsGood());
316719ec93aSZachary Turner     ASSERT_EQ(kReadBytes*2, ex.GetFilePos());
317719ec93aSZachary Turner     ASSERT_EQ(false, ex.Empty());
3183dfb86b6SDavid Blaikie     ASSERT_EQ(12u, ex.GetBytesLeft());
319719ec93aSZachary Turner     ASSERT_EQ('2', *ex.Peek());
320719ec93aSZachary Turner }
321719ec93aSZachary Turner 
322719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexBytesAvail)
323719ec93aSZachary Turner {
324719ec93aSZachary Turner     const char kHexEncodedBytes[] = "abcdef0123456789xyzw";
325719ec93aSZachary Turner     const size_t kValidHexPairs = 8;
326719ec93aSZachary Turner     StringExtractor ex(kHexEncodedBytes);
327719ec93aSZachary Turner 
328719ec93aSZachary Turner     uint8_t dst[kValidHexPairs];
329719ec93aSZachary Turner     ASSERT_EQ(kValidHexPairs, ex.GetHexBytesAvail (dst, kValidHexPairs));
330719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[0]);
331719ec93aSZachary Turner     EXPECT_EQ(0xcd,dst[1]);
332719ec93aSZachary Turner     EXPECT_EQ(0xef,dst[2]);
333719ec93aSZachary Turner     EXPECT_EQ(0x01,dst[3]);
334719ec93aSZachary Turner     EXPECT_EQ(0x23,dst[4]);
335719ec93aSZachary Turner     EXPECT_EQ(0x45,dst[5]);
336719ec93aSZachary Turner     EXPECT_EQ(0x67,dst[6]);
337719ec93aSZachary Turner     EXPECT_EQ(0x89,dst[7]);
338719ec93aSZachary Turner 
339719ec93aSZachary Turner     ASSERT_EQ(true, ex.IsGood());
340719ec93aSZachary Turner     ASSERT_EQ(2*kValidHexPairs, ex.GetFilePos());
341719ec93aSZachary Turner     ASSERT_EQ(false, ex.Empty());
3423dfb86b6SDavid Blaikie     ASSERT_EQ(4u, ex.GetBytesLeft());
343719ec93aSZachary Turner     ASSERT_EQ('x', *ex.Peek());
344719ec93aSZachary Turner }
345719ec93aSZachary Turner 
346719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexBytesAvail_Underflow)
347719ec93aSZachary Turner {
348719ec93aSZachary Turner     const char kHexEncodedBytes[] = "abcdef0123456789xyzw";
349719ec93aSZachary Turner     const size_t kValidHexPairs = 8;
350719ec93aSZachary Turner     StringExtractor ex(kHexEncodedBytes);
351719ec93aSZachary Turner 
352719ec93aSZachary Turner     uint8_t dst[12];
353719ec93aSZachary Turner     memset(dst, 0xef, sizeof(dst));
354719ec93aSZachary Turner     ASSERT_EQ(kValidHexPairs, ex.GetHexBytesAvail (dst, sizeof(dst)));
355719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[0]);
356719ec93aSZachary Turner     EXPECT_EQ(0xcd,dst[1]);
357719ec93aSZachary Turner     EXPECT_EQ(0xef,dst[2]);
358719ec93aSZachary Turner     EXPECT_EQ(0x01,dst[3]);
359719ec93aSZachary Turner     EXPECT_EQ(0x23,dst[4]);
360719ec93aSZachary Turner     EXPECT_EQ(0x45,dst[5]);
361719ec93aSZachary Turner     EXPECT_EQ(0x67,dst[6]);
362719ec93aSZachary Turner     EXPECT_EQ(0x89,dst[7]);
363719ec93aSZachary Turner     // these bytes should be unchanged
364719ec93aSZachary Turner     EXPECT_EQ(0xef,dst[8]);
365719ec93aSZachary Turner     EXPECT_EQ(0xef,dst[9]);
366719ec93aSZachary Turner     EXPECT_EQ(0xef,dst[10]);
367719ec93aSZachary Turner     EXPECT_EQ(0xef,dst[11]);
368719ec93aSZachary Turner 
369719ec93aSZachary Turner     ASSERT_EQ(true, ex.IsGood());
370719ec93aSZachary Turner     ASSERT_EQ(kValidHexPairs*2, ex.GetFilePos());
371719ec93aSZachary Turner     ASSERT_EQ(false, ex.Empty());
3723dfb86b6SDavid Blaikie     ASSERT_EQ(4u, ex.GetBytesLeft());
373719ec93aSZachary Turner     ASSERT_EQ('x', *ex.Peek());
374719ec93aSZachary Turner }
375719ec93aSZachary Turner 
376719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexBytesAvail_Partial)
377719ec93aSZachary Turner {
378719ec93aSZachary Turner     const char kHexEncodedBytes[] = "abcdef0123456789xyzw";
379719ec93aSZachary Turner     const size_t kReadBytes = 4;
380719ec93aSZachary Turner     StringExtractor ex(kHexEncodedBytes);
381719ec93aSZachary Turner 
382719ec93aSZachary Turner     uint8_t dst[12];
383719ec93aSZachary Turner     memset(dst, 0xab, sizeof(dst));
384719ec93aSZachary Turner     ASSERT_EQ(kReadBytes, ex.GetHexBytesAvail (dst, kReadBytes));
385719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[0]);
386719ec93aSZachary Turner     EXPECT_EQ(0xcd,dst[1]);
387719ec93aSZachary Turner     EXPECT_EQ(0xef,dst[2]);
388719ec93aSZachary Turner     EXPECT_EQ(0x01,dst[3]);
389719ec93aSZachary Turner     // these bytes should be unchanged
390719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[4]);
391719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[5]);
392719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[6]);
393719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[7]);
394719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[8]);
395719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[9]);
396719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[10]);
397719ec93aSZachary Turner     EXPECT_EQ(0xab,dst[11]);
398719ec93aSZachary Turner 
399719ec93aSZachary Turner     ASSERT_EQ(true, ex.IsGood());
400719ec93aSZachary Turner     ASSERT_EQ(kReadBytes*2, ex.GetFilePos());
401719ec93aSZachary Turner     ASSERT_EQ(false, ex.Empty());
4023dfb86b6SDavid Blaikie     ASSERT_EQ(12u, ex.GetBytesLeft());
403719ec93aSZachary Turner     ASSERT_EQ('2', *ex.Peek());
404719ec93aSZachary Turner }
405719ec93aSZachary Turner 
406719ec93aSZachary Turner 
407