File: hex_to_text_test.cpp

package info (click to toggle)
spirv-tools 2025.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 28,588 kB
  • sloc: cpp: 470,407; javascript: 5,893; python: 3,326; ansic: 488; sh: 450; ruby: 88; makefile: 18; lisp: 9
file content (429 lines) | stat: -rw-r--r-- 16,418 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
// Copyright (c) 2024 Google LLC.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include <vector>

#include "gmock/gmock.h"
#include "test/test_fixture.h"
#include "tools/io.h"

namespace spvtools {
namespace {

using spvtest::ScopedContext;

class HexToText : public ::testing::Test {
 public:
  void VerifyDisassembly(const char* hex_stream,
                         const char* expected_disassembly) {
    std::vector<char> stream(hex_stream, hex_stream + strlen(hex_stream));
    std::vector<uint32_t> binary;

    // Convert hext to binary first.
    EXPECT_TRUE(ConvertHexToBinary(stream, &binary));

    // Then disassemble it.
    spv_diagnostic diagnostic = nullptr;
    spv_text disassembly = nullptr;
    EXPECT_EQ(spvBinaryToText(ScopedContext().context, binary.data(),
                              binary.size(), SPV_BINARY_TO_TEXT_OPTION_NONE,
                              &disassembly, &diagnostic),
              SPV_SUCCESS);
    EXPECT_EQ(diagnostic, nullptr);

    // Verify disassembly is as expected and clean up.
    EXPECT_STREQ(disassembly->str, expected_disassembly);

    spvDiagnosticDestroy(diagnostic);
    spvTextDestroy(disassembly);
  }

  void EnsureError(const char* hex_stream) {
    std::vector<char> stream(hex_stream, hex_stream + strlen(hex_stream));
    std::vector<uint32_t> binary;

    // Make sure there is a parse error
    EXPECT_FALSE(ConvertHexToBinary(stream, &binary));
  }
};

// The actual assembly doesn't matter, just the hex parsing.  All the tests use
// the following SPIR-V.
constexpr char kDisassembly[] = R"(; SPIR-V
; Version: 1.6
; Generator: Khronos SPIR-V Tools Assembler; 0
; Bound: 11
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %1 "main" %2 %3
OpName %2 "fancy_attribute"
OpName %3 "useful_output"
OpDecorate %2 Location 4
OpDecorate %3 Location 2
%4 = OpTypeFloat 32
%5 = OpTypePointer Input %4
%2 = OpVariable %5 Input
%6 = OpTypePointer Output %4
%3 = OpVariable %6 Output
%7 = OpTypeVoid
%8 = OpTypeFunction %7
%1 = OpFunction %7 None %8
%9 = OpLabel
%10 = OpLoad %4 %2
OpStore %3 %10
OpReturn
OpFunctionEnd
)";

TEST_F(HexToText, Words) {
  constexpr char kHex[] = R"(0x07230203, 0x00010600, 0x00070000, 0x0000000b
0x00000000, 0x00020011, 0x00000001, 0x0003000e
0x00000000, 0x00000001, 0x0007000f, 0x00000000
0x00000001, 0x6e69616d, 0x00000000, 0x00000002
0x00000003, 0x00060005, 0x00000002, 0x636e6166
0x74615f79, 0x62697274, 0x00657475, 0x00060005
0x00000003, 0x66657375, 0x6f5f6c75, 0x75707475
0x00000074, 0x00040047, 0x00000002, 0x0000001e
0x00000004, 0x00040047, 0x00000003, 0x0000001e
0x00000002, 0x00030016, 0x00000004, 0x00000020
0x00040020, 0x00000005, 0x00000001, 0x00000004
0x0004003b, 0x00000005, 0x00000002, 0x00000001
0x00040020, 0x00000006, 0x00000003, 0x00000004
0x0004003b, 0x00000006, 0x00000003, 0x00000003
0x00020013, 0x00000007, 0x00030021, 0x00000008
0x00000007, 0x00050036, 0x00000007, 0x00000001
0x00000000, 0x00000008, 0x000200f8, 0x00000009
0x0004003d, 0x00000004, 0x0000000a, 0x00000002
0x0003003e, 0x00000003, 0x0000000a, 0x000100fd
0x00010038)";

  VerifyDisassembly(kHex, kDisassembly);
}

TEST_F(HexToText, WordsLeadingSpace) {
  constexpr char kHex[] = R"(    
x07230203, x00010600, x00070000, x0000000b
x00000000, x00020011, x00000001, x0003000e
x00000000, x00000001, x0007000f, x00000000
x00000001, x6e69616d, x00000000, x00000002
x00000003, x00060005, x00000002, x636e6166
x74615f79, x62697274, x00657475, x00060005
x00000003, x66657375, x6f5f6c75, x75707475
x00000074, x00040047, x00000002, x0000001e
x00000004, x00040047, x00000003, x0000001e
x00000002, x00030016, x00000004, x00000020
x00040020, x00000005, x00000001, x00000004
x0004003b, x00000005, x00000002, x00000001
x00040020, x00000006, x00000003, x00000004
x0004003b, x00000006, x00000003, x00000003
x00020013, x00000007, x00030021, x00000008
x00000007, x00050036, x00000007, x00000001
x00000000, x00000008, x000200f8, x00000009
x0004003d, x00000004, x0000000a, x00000002
x0003003e, x00000003, x0000000a, x000100fd
x00010038)";

  VerifyDisassembly(kHex, kDisassembly);
}

TEST_F(HexToText, WordsTrailingSpace) {
  constexpr char kHex[] = R"(0X7230203, 0X10600, 0X70000, 0XB
0X0, 0X20011, 0X1, 0X3000E
0X0, 0X1, 0X7000F, 0X0
0X1, X6E69616D, 0X0, 0X2
0X3, 0X60005, 0X2, X636E6166
X74615F79, X62697274, 0X657475, 0X60005
0X3, X66657375, X6F5F6C75, X75707475
0X74, 0X40047, 0X2, 0X1E
0X4, 0X40047, 0X3, 0X1E
0X2, 0X30016, 0X4, 0X20
0X40020, 0X5, 0X1, 0X4
0X4003B, 0X5, 0X2, 0X1
0X40020, 0X6, 0X3, 0X4
0X4003B, 0X6, 0X3, 0X3
0X20013, 0X7, 0X30021, 0X8
0X7, 0X50036, 0X7, 0X1
0X0, 0X8, 0X200F8, 0X9
0X4003D, 0X4, 0XA, 0X2
0X3003E, 0X3, 0XA, 0X100FD
0X10038     

)";

  VerifyDisassembly(kHex, kDisassembly);
}

TEST_F(HexToText, BytesLittleEndian) {
  constexpr char kHex[] = R"(
0x03  0x02  0x23  0x07  0x00  0x06  0x01  0x00  0x00  0x00  0x07  0x00  0x0b  0x00  0x00  0x00
0x00  0x00  0x00  0x00  0x11  0x00  0x02  0x00  0x01  0x00  0x00  0x00  0x0e  0x00  0x03  0x00
0x00  0x00  0x00  0x00  0x01  0x00  0x00  0x00  0x0f  0x00  0x07  0x00  0x00  0x00  0x00  0x00
0x01  0x00  0x00  0x00  0x6d  0x61  0x69  0x6e  0x00  0x00  0x00  0x00  0x02  0x00  0x00  0x00
0x03  0x00  0x00  0x00  0x05  0x00  0x06  0x00  0x02  0x00  0x00  0x00  0x66  0x61  0x6e  0x63
0x79  0x5f  0x61  0x74  0x74  0x72  0x69  0x62  0x75  0x74  0x65  0x00  0x05  0x00  0x06  0x00
0x03  0x00  0x00  0x00  0x75  0x73  0x65  0x66  0x75  0x6c  0x5f  0x6f  0x75  0x74  0x70  0x75
0x74  0x00  0x00  0x00  0x47  0x00  0x04  0x00  0x02  0x00  0x00  0x00  0x1e  0x00  0x00  0x00
0x04  0x00  0x00  0x00  0x47  0x00  0x04  0x00  0x03  0x00  0x00  0x00  0x1e  0x00  0x00  0x00
0x02  0x00  0x00  0x00  0x16  0x00  0x03  0x00  0x04  0x00  0x00  0x00  0x20  0x00  0x00  0x00
0x20  0x00  0x04  0x00  0x05  0x00  0x00  0x00  0x01  0x00  0x00  0x00  0x04  0x00  0x00  0x00
0x3b  0x00  0x04  0x00  0x05  0x00  0x00  0x00  0x02  0x00  0x00  0x00  0x01  0x00  0x00  0x00
0x20  0x00  0x04  0x00  0x06  0x00  0x00  0x00  0x03  0x00  0x00  0x00  0x04  0x00  0x00  0x00
0x3b  0x00  0x04  0x00  0x06  0x00  0x00  0x00  0x03  0x00  0x00  0x00  0x03  0x00  0x00  0x00
0x13  0x00  0x02  0x00  0x07  0x00  0x00  0x00  0x21  0x00  0x03  0x00  0x08  0x00  0x00  0x00
0x07  0x00  0x00  0x00  0x36  0x00  0x05  0x00  0x07  0x00  0x00  0x00  0x01  0x00  0x00  0x00
0x00  0x00  0x00  0x00  0x08  0x00  0x00  0x00  0xf8  0x00  0x02  0x00  0x09  0x00  0x00  0x00
0x3d  0x00  0x04  0x00  0x04  0x00  0x00  0x00  0x0a  0x00  0x00  0x00  0x02  0x00  0x00  0x00
0x3e  0x00  0x03  0x00  0x03  0x00  0x00  0x00  0x0a  0x00  0x00  0x00  0xfd  0x00  0x01  0x00
0x38  0x00  0x01  0x00
)";

  VerifyDisassembly(kHex, kDisassembly);
}

TEST_F(HexToText, BytesBigEndian) {
  constexpr char kHex[] = R"(
X07,X23,X02,X03, X00,X01,X06,X00, X00,X07,X00,X00, X00,X00,X00,X0B
X00,X00,X00,X00, X00,X02,X00,X11, X00,X00,X00,X01, X00,X03,X00,X0E
X00,X00,X00,X00, X00,X00,X00,X01, X00,X07,X00,X0F, X00,X00,X00,X00
X00,X00,X00,X01, X6E,X69,X61,X6D, X00,X00,X00,X00, X00,X00,X00,X02
X00,X00,X00,X03, X00,X06,X00,X05, X00,X00,X00,X02, X63,X6E,X61,X66
X74,X61,X5F,X79, X62,X69,X72,X74, X00,X65,X74,X75, X00,X06,X00,X05
X00,X00,X00,X03, X66,X65,X73,X75, X6F,X5F,X6C,X75, X75,X70,X74,X75
X00,X00,X00,X74, X00,X04,X00,X47, X00,X00,X00,X02, X00,X00,X00,X1E
X00,X00,X00,X04, X00,X04,X00,X47, X00,X00,X00,X03, X00,X00,X00,X1E
X00,X00,X00,X02, X00,X03,X00,X16, X00,X00,X00,X04, X00,X00,X00,X20
X00,X04,X00,X20, X00,X00,X00,X05, X00,X00,X00,X01, X00,X00,X00,X04
X00,X04,X00,X3B, X00,X00,X00,X05, X00,X00,X00,X02, X00,X00,X00,X01
X00,X04,X00,X20, X00,X00,X00,X06, X00,X00,X00,X03, X00,X00,X00,X04
X00,X04,X00,X3B, X00,X00,X00,X06, X00,X00,X00,X03, X00,X00,X00,X03
X00,X02,X00,X13, X00,X00,X00,X07, X00,X03,X00,X21, X00,X00,X00,X08
X00,X00,X00,X07, X00,X05,X00,X36, X00,X00,X00,X07, X00,X00,X00,X01
X00,X00,X00,X00, X00,X00,X00,X08, X00,X02,X00,XF8, X00,X00,X00,X09
X00,X04,X00,X3D, X00,X00,X00,X04, X00,X00,X00,X0A, X00,X00,X00,X02
X00,X03,X00,X3E, X00,X00,X00,X03, X00,X00,X00,X0A, X00,X01,X00,XFD
X00,X01,X00,X38,
)";

  VerifyDisassembly(kHex, kDisassembly);
}

TEST_F(HexToText, StreamLittleEndian) {
  constexpr char kHex[] = R"(
03  02  23  07  00  06  01  00  00  00  07  00  0b  00  00  00
00  00  00  00  11  00  02  00  01  00  00  00  0e  00  03  00
00  00  00  00  01  00  00  00  0f  00  07  00  00  00  00  00
01  00  00  00  6d  61  69  6e  00  00  00  00  02  00  00  00
03  00  00  00  05  00  06  00  02  00  00  00  66  61  6e  63
79  5f  61  74  74  72  69  62  75  74  65  00  05  00  06  00
03  00  00  00  75  73  65  66  75  6c  5f  6f  75  74  70  75
74  00  00  00  47  00  04  00  02  00  00  00  1e  00  00  00
04  00  00  00  47  00  04  00  03  00  00  00  1e  00  00  00
02  00  00  00  16  00  03  00  04  00  00  00  20  00  00  00
20  00  04  00  05  00  00  00  01  00  00  00  04  00  00  00
3b  00  04  00  05  00  00  00  02  00  00  00  01  00  00  00
20  00  04  00  06  00  00  00  03  00  00  00  04  00  00  00
3b  00  04  00  06  00  00  00  03  00  00  00  03  00  00  00
13  00  02  00  07  00  00  00  21  00  03  00  08  00  00  00
07  00  00  00  36  00  05  00  07  00  00  00  01  00  00  00
00  00  00  00  08  00  00  00  f8  00  02  00  09  00  00  00
3d  00  04  00  04  00  00  00  0a  00  00  00  02  00  00  00
3e  00  03  00  03  00  00  00  0a  00  00  00  fd  00  01  00
38  00  01  00
)";

  VerifyDisassembly(kHex, kDisassembly);
}

TEST_F(HexToText, StreamLittleEndianNoDelim) {
  constexpr char kHex[] = R"(
0302230700060100000007000B000000
0000000011000200010000000E000300
00000000010000000F00070000000000
010000006D61696E0000000002000000
03000000050006000200000066616E63
795F6174747269627574650005000600
0300000075736566756C5F6F75747075
7400000047000400020000001E000000
0400000047000400030000001E000000
02000000160003000400000020000000
20000400050000000100000004000000
3B000400050000000200000001000000
20000400060000000300000004000000
3B000400060000000300000003000000
13000200070000002100030008000000
07000000360005000700000001000000
0000000008000000F800020009000000
3D000400040000000A00000002000000
3E000300030000000A000000FD000100
38000100
)";

  VerifyDisassembly(kHex, kDisassembly);
}

TEST_F(HexToText, StreamBigEndian) {
  constexpr char kHex[] = R"(
07230203, 00010600, 00070000, 0000000b
00000000, 00020011, 00000001, 0003000e
00000000, 00000001, 0007000f, 00000000
00000001, 6e69616d, 00000000, 00000002
00000003, 00060005, 00000002, 636e6166
74615f79, 62697274, 00657475, 00060005
00000003, 66657375, 6f5f6c75, 75707475
00000074, 00040047, 00000002, 0000001e
00000004, 00040047, 00000003, 0000001e
00000002, 00030016, 00000004, 00000020
00040020, 00000005, 00000001, 00000004
0004003b, 00000005, 00000002, 00000001
00040020, 00000006, 00000003, 00000004
0004003b, 00000006, 00000003, 00000003
00020013, 00000007, 00030021, 00000008
00000007, 00050036, 00000007, 00000001
00000000, 00000008, 000200f8, 00000009
0004003d, 00000004, 0000000a, 00000002
0003003e, 00000003, 0000000a, 000100fd
00010038,
)";

  VerifyDisassembly(kHex, kDisassembly);
}

TEST_F(HexToText, WordsNoDelimieter) {
  constexpr char kHex[] = R"(0x07230203 0x00010600 0x00070000 0x0000000b
0x00000000 0x00020011 0x00000001 0x0003000e
0x00000000 0x00000001 0x0007000f 0x00000000
0x00000001 0x6e69616d 0x00000000 0x00000002
0x00000003 0x00060005 0x00000002 0x636e6166
0x74615f79 0x62697274 0x00657475 0x00060005
0x00000003 0x666573750x6f5f6c75 0x75707475
0x00000074 0x00040047 0x00000002 0x0000001e
0x00000004 0x00040047 0x00000003 0x0000001e
0x00000002 0x00030016 0x00000004 0x00000020
0x00040020 0x00000005 0x00000001 0x00000004
0x0004003b 0x00000005 0x00000002 0x00000001
0x00040020 0x00000006 0x00000003 0x00000004
0x0004003b 0x00000006 0x00000003 0x00000003
0x00020013 0x00000007 0x00030021 0x00000008
0x00000007 0x00050036 0x00000007 0x00000001
0x00000000 0x00000008 0x000200f8 0x00000009
0x0004003d 0x00000004 0x0000000a 0x00000002
0x0003003e 0x00000003 0x0000000a 0x000100fd
0x00010038)";

  EnsureError(kHex);
}

TEST_F(HexToText, InvalidFirstToken) {
  constexpr char kHex[] = R"(0x17230203, 0x00010600, 0x00070000, 0x0000000b
0x00000000, 0x00020011, 0x00000001, 0x0003000e
0x00000000, 0x00000001, 0x0007000f, 0x00000000
0x00000001, 0x6e69616d, 0x00000000, 0x00000002
0x00000003, 0x00060005, 0x00000002, 0x636e6166
0x74615f79, 0x62697274, 0x00657475, 0x00060005
0x00000003, 0x66657375, 0x6f5f6c75, 0x75707475
0x00000074, 0x00040047, 0x00000002, 0x0000001e
0x00000004, 0x00040047, 0x00000003, 0x0000001e
0x00000002, 0x00030016, 0x00000004, 0x00000020
0x00040020, 0x00000005, 0x00000001, 0x00000004
0x0004003b, 0x00000005, 0x00000002, 0x00000001
0x00040020, 0x00000006, 0x00000003, 0x00000004
0x0004003b, 0x00000006, 0x00000003, 0x00000003
0x00020013, 0x00000007, 0x00030021, 0x00000008
0x00000007, 0x00050036, 0x00000007, 0x00000001
0x00000000, 0x00000008, 0x000200f8, 0x00000009
0x0004003d, 0x00000004, 0x0000000a, 0x00000002
0x0003003e, 0x00000003, 0x0000000a, 0x000100fd
0x00010038)";

  EnsureError(kHex);
}

TEST_F(HexToText, NonHexCharacter) {
  // Note: a 6 is replaced with G in this stream
  constexpr char kHex[] = R"(0x07230203, 0x00010600, 0x00070000, 0x0000000b
0x00000000, 0x00020011, 0x00000001, 0x0003000e
0x00000000, 0x00000001, 0x0007000f, 0x00000000
0x00000001, 0x6e69616d, 0x00000000, 0x00000002
0x00000003, 0x00060005, 0x00000002, 0x636e6166
0x74615f79, 0x62697274, 0x00657475, 0x00060005
0x00000003, 0x66657375, 0x6f5f6c75, 0x75707475
0x00000074, 0x00040047, 0x00000002, 0x0000001e
0x00000004, 0x00040047, 0x00000003, 0x0000001e
0x00000002, 0x0003001G, 0x00000004, 0x00000020
0x00040020, 0x00000005, 0x00000001, 0x00000004
0x0004003b, 0x00000005, 0x00000002, 0x00000001
0x00040020, 0x00000006, 0x00000003, 0x00000004
0x0004003b, 0x00000006, 0x00000003, 0x00000003
0x00020013, 0x00000007, 0x00030021, 0x00000008
0x00000007, 0x00050036, 0x00000007, 0x00000001
0x00000000, 0x00000008, 0x000200f8, 0x00000009
0x0004003d, 0x00000004, 0x0000000a, 0x00000002
0x0003003e, 0x00000003, 0x0000000a, 0x000100fd
0x00010038)";

  EnsureError(kHex);
}

TEST_F(HexToText, MissingExpectedPrefix) {
  constexpr char kHex[] = R"(0x07230203, 0x00010600, 0x00070000, 0x0000000b
0x00000000, 0x00020011, 0x00000001, 0x0003000e
0x00000000, 0x00000001, 0x0007000f, 0x00000000
0x00000001, 0x6e69616d, 0x00000000, 0x00000002
0x00000003, 0x00060005, 0x00000002, 0x636e6166
0x74615f79, 0x62697274, 0x00657475, 0x00060005
0x00000003, 0x66657375, 0x6f5f6c75, 0x75707475
0x00000074, 0x00040047, 0x00000002, 0x0000001e
0x00000004, 0x00040047, 0x00000003, 0x0000001e
0x00000002, 0x00030016, 0x00000004, 0x00000020
0x00040020, 0x00000005,   00000001, 0x00000004
0x0004003b, 0x00000005, 0x00000002, 0x00000001
0x00040020, 0x00000006, 0x00000003, 0x00000004
0x0004003b, 0x00000006, 0x00000003, 0x00000003
0x00020013, 0x00000007, 0x00030021, 0x00000008
0x00000007, 0x00050036, 0x00000007, 0x00000001
0x00000000, 0x00000008, 0x000200f8, 0x00000009
0x0004003d, 0x00000004, 0x0000000a, 0x00000002
0x0003003e, 0x00000003, 0x0000000a, 0x000100fd
0x00010038)";

  EnsureError(kHex);
}

TEST_F(HexToText, UnexpectedPrefix) {
  constexpr char kHex[] = R"(07230203, 00010600, 00070000, 0000000b
00000000, 00020011, 00000001, 0003000e
00000000, 00000001, 0007000f, 00000000
00000001, 6e69616d, 00000000, 00000002
00000003, 00060005, 00000002, 636e6166
74615f79, 62697274, 00657475, 00060005
00000003, 66657375, 6f5f6c75, 75707475
00000074, 00040047, 00000002, 0000001e
00000004, 00040047, 00000003, 0000001e
00000002, 00030016, 00000004, 00000020
00040020, 00000005, 0x00000001, 00000004
0004003b, 00000005, 00000002, 00000001
00040020, 00000006, 00000003, 00000004
0004003b, 00000006, 00000003, 00000003
00020013, 00000007, 00030021, 00000008
00000007, 00050036, 00000007, 00000001
00000000, 00000008, 000200f8, 00000009
0004003d, 00000004, 0000000a, 00000002
0003003e, 00000003, 0000000a, 000100fd
00010038)";

  EnsureError(kHex);
}
}  // namespace
}  // namespace spvtools