blob: ab7de4410131b8c0da5d462c2c39345923885f0a [file] [log] [blame]
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +01001package eu.mulk.jgvariant.core;
2
Matthias Andreas Benkarde5a5c752021-12-15 19:53:55 +01003import static java.nio.ByteOrder.BIG_ENDIAN;
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +01004import static java.nio.ByteOrder.LITTLE_ENDIAN;
5import static java.nio.charset.StandardCharsets.UTF_8;
Matthias Andreas Benkard55c34812021-12-14 21:51:10 +01006import static org.junit.jupiter.api.Assertions.assertAll;
7import static org.junit.jupiter.api.Assertions.assertArrayEquals;
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +01008import static org.junit.jupiter.api.Assertions.assertEquals;
Matthias Andreas Benkarde5a5c752021-12-15 19:53:55 +01009import static org.junit.jupiter.api.Assertions.assertThrows;
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010010
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010011import java.nio.ByteBuffer;
Matthias Andreas Benkard31c61e72021-12-16 20:06:39 +010012import java.text.ParseException;
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010013import java.util.List;
Matthias Andreas Benkardcd924f62021-12-28 00:46:06 +010014import java.util.Map;
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010015import java.util.Optional;
16import org.junit.jupiter.api.Test;
17
18/**
19 * Tests based on the examples given in <a
20 * href="https://people.gnome.org/~desrt/gvariant-serialisation.pdf">~desrt/gvariant-serialisation.pdf</a>.
21 */
22class DecoderTest {
23
24 @Test
25 void testString() {
26 var data = new byte[] {0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x00};
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010027 var decoder = Decoder.ofString(UTF_8);
28 assertEquals("hello world", decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010029 }
30
31 @Test
32 void testMaybe() {
33 var data =
34 new byte[] {0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x00, 0x00};
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010035 var decoder = Decoder.ofMaybe(Decoder.ofString(UTF_8));
36 assertEquals(Optional.of("hello world"), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010037 }
38
39 @Test
40 void testBooleanArray() {
41 var data = new byte[] {0x01, 0x00, 0x00, 0x01, 0x01};
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010042 var decoder = Decoder.ofArray(Decoder.ofBoolean());
43 assertEquals(List.of(true, false, false, true, true), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010044 }
45
46 @Test
47 void testStructure() {
48 var data =
49 new byte[] {
50 0x66, 0x6F, 0x6F, 0x00, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 0x04
51 };
52
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010053 record TestRecord(String s, int i) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010054
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010055 var decoder = Decoder.ofStructure(TestRecord.class, Decoder.ofString(UTF_8), Decoder.ofInt());
56 assertEquals(new TestRecord("foo", -1), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010057 }
58
59 @Test
60 void testComplexStructureArray() {
61 var data =
62 new byte[] {
63 0x68,
64 0x69,
65 0x00,
66 0x00,
67 (byte) 0xfe,
68 (byte) 0xff,
69 (byte) 0xff,
70 (byte) 0xff,
71 0x03,
72 0x00,
73 0x00,
74 0x00,
75 0x62,
76 0x79,
77 0x65,
78 0x00,
79 (byte) 0xff,
80 (byte) 0xff,
81 (byte) 0xff,
82 (byte) 0xff,
83 0x04,
84 0x09,
85 0x15
86 };
87
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010088 record TestRecord(String s, int i) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010089
90 var decoder =
91 Decoder.ofArray(
92 Decoder.ofStructure(
93 TestRecord.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010094 Decoder.ofString(UTF_8),
95 Decoder.ofInt().withByteOrder(LITTLE_ENDIAN)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010096 assertEquals(
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010097 List.of(new TestRecord("hi", -2), new TestRecord("bye", -1)),
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010098 decoder.decode(ByteBuffer.wrap(data)));
99 }
100
101 @Test
102 void testStringArray() {
103 var data =
104 new byte[] {
105 0x69, 0x00, 0x63, 0x61, 0x6E, 0x00, 0x68, 0x61, 0x73, 0x00, 0x73, 0x74, 0x72, 0x69, 0x6E,
106 0x67, 0x73, 0x3F, 0x00, 0x02, 0x06, 0x0a, 0x13
107 };
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100108 var decoder = Decoder.ofArray(Decoder.ofString(UTF_8));
109 assertEquals(List.of("i", "can", "has", "strings?"), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100110 }
111
112 @Test
113 void testNestedStructure() {
114 var data =
115 new byte[] {
116 0x69, 0x63, 0x61, 0x6E, 0x00, 0x68, 0x61, 0x73, 0x00, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
117 0x73, 0x3F, 0x00, 0x04, 0x0d, 0x05
118 };
119
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100120 record TestChild(byte b, String s) {}
121 record TestParent(TestChild tc, List<String> as) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100122
123 var decoder =
124 Decoder.ofStructure(
125 TestParent.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100126 Decoder.ofStructure(TestChild.class, Decoder.ofByte(), Decoder.ofString(UTF_8)),
127 Decoder.ofArray(Decoder.ofString(UTF_8)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100128
129 assertEquals(
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100130 new TestParent(new TestChild((byte) 0x69, "can"), List.of("has", "strings?")),
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100131 decoder.decode(ByteBuffer.wrap(data)));
132 }
133
134 @Test
Matthias Andreas Benkard55c34812021-12-14 21:51:10 +0100135 void testNestedStructureVariant() {
136 var data =
137 new byte[] {
138 0x69, 0x63, 0x61, 0x6E, 0x00, 0x68, 0x61, 0x73, 0x00, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
139 0x73, 0x3F, 0x00, 0x04, 0x0d, 0x05, 0x00, 0x28, 0x28, 0x79, 0x73, 0x29, 0x61, 0x73, 0x29
140 };
141
142 var decoder = Decoder.ofVariant();
Matthias Andreas Benkard31c61e72021-12-16 20:06:39 +0100143 var variant = decoder.decode(ByteBuffer.wrap(data));
144 var result = (Object[]) variant.value();
Matthias Andreas Benkard55c34812021-12-14 21:51:10 +0100145
146 assertAll(
Matthias Andreas Benkard31c61e72021-12-16 20:06:39 +0100147 () -> assertEquals(Signature.parse("((ys)as)"), variant.signature()),
Matthias Andreas Benkard55c34812021-12-14 21:51:10 +0100148 () -> assertEquals(2, result.length),
149 () -> assertArrayEquals(new Object[] {(byte) 0x69, "can"}, (Object[]) result[0]),
150 () -> assertEquals(List.of("has", "strings?"), result[1]));
151 }
152
153 @Test
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100154 void testSimpleStructure() {
155 var data = new byte[] {0x60, 0x70};
156
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100157 record TestRecord(byte b1, byte b2) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100158
159 var decoder =
160 Decoder.ofStructure(
161 TestRecord.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100162 Decoder.ofByte().withByteOrder(LITTLE_ENDIAN),
163 Decoder.ofByte().withByteOrder(LITTLE_ENDIAN));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100164
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100165 assertEquals(new TestRecord((byte) 0x60, (byte) 0x70), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100166 }
167
168 @Test
169 void testPaddedStructureRight() {
170 var data = new byte[] {0x60, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00};
171
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100172 record TestRecord(int b1, byte b2) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100173
174 var decoder =
175 Decoder.ofStructure(
176 TestRecord.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100177 Decoder.ofInt().withByteOrder(LITTLE_ENDIAN),
178 Decoder.ofByte().withByteOrder(LITTLE_ENDIAN));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100179
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100180 assertEquals(new TestRecord(0x60, (byte) 0x70), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100181 }
182
183 @Test
184 void testPaddedStructureLeft() {
185 var data = new byte[] {0x60, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00};
186
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100187 record TestRecord(byte b1, int b2) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100188
189 var decoder =
190 Decoder.ofStructure(
191 TestRecord.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100192 Decoder.ofByte().withByteOrder(LITTLE_ENDIAN),
193 Decoder.ofInt().withByteOrder(LITTLE_ENDIAN));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100194
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100195 assertEquals(new TestRecord((byte) 0x60, 0x70), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100196 }
197
198 @Test
199 void testSimpleStructureArray() {
200 var data =
201 new byte[] {
202 0x60,
203 0x00,
204 0x00,
205 0x00,
206 0x70,
207 0x00,
208 0x00,
209 0x00,
210 (byte) 0x88,
211 0x02,
212 0x00,
213 0x00,
214 (byte) 0xF7,
215 0x00,
216 0x00,
217 0x00
218 };
219
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100220 record TestRecord(int b1, byte b2) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100221
222 var decoder =
223 Decoder.ofArray(
224 Decoder.ofStructure(
225 TestRecord.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100226 Decoder.ofInt().withByteOrder(LITTLE_ENDIAN),
227 Decoder.ofByte().withByteOrder(LITTLE_ENDIAN)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100228
229 assertEquals(
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100230 List.of(new TestRecord(96, (byte) 0x70), new TestRecord(648, (byte) 0xf7)),
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100231 decoder.decode(ByteBuffer.wrap(data)));
232 }
233
234 @Test
235 void testByteArray() {
236 var data = new byte[] {0x04, 0x05, 0x06, 0x07};
237
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100238 var decoder = Decoder.ofArray(Decoder.ofByte());
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100239
240 assertEquals(
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100241 List.of((byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07),
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100242 decoder.decode(ByteBuffer.wrap(data)));
243 }
244
245 @Test
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +0100246 void testPrimitiveByteArray() {
247 var data = new byte[] {0x04, 0x05, 0x06, 0x07};
248
249 var decoder = Decoder.ofByteArray();
250
251 assertArrayEquals(data, decoder.decode(ByteBuffer.wrap(data)));
252 }
253
254 @Test
255 void testPrimitiveByteArrayRecord() {
256 var data = new byte[] {0x04, 0x05, 0x06, 0x07};
257
258 record TestRecord(byte[] bytes) {}
259
260 var decoder = Decoder.ofStructure(TestRecord.class, Decoder.ofByteArray());
261
262 assertArrayEquals(data, decoder.decode(ByteBuffer.wrap(data)).bytes());
263 }
264
265 @Test
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100266 void testIntegerArray() {
267 var data = new byte[] {0x04, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00};
268
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100269 var decoder = Decoder.ofArray(Decoder.ofInt().withByteOrder(LITTLE_ENDIAN));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100270
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100271 assertEquals(List.of(4, 258), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100272 }
273
274 @Test
Matthias Andreas Benkardcd924f62021-12-28 00:46:06 +0100275 void testDictionaryEntryAsMapEntry() {
276 var data =
277 new byte[] {0x61, 0x20, 0x6B, 0x65, 0x79, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x06};
278
279 var decoder =
280 Decoder.ofDictionaryEntry(
281 Decoder.ofString(UTF_8), Decoder.ofInt().withByteOrder(LITTLE_ENDIAN));
282 assertEquals(Map.entry("a key", 514), decoder.decode(ByteBuffer.wrap(data)));
283 }
284
285 @Test
286 void testDictionaryEntryAsRecord() {
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100287 var data =
288 new byte[] {0x61, 0x20, 0x6B, 0x65, 0x79, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x06};
289
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100290 record TestEntry(String key, int value) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100291
292 var decoder =
293 Decoder.ofStructure(
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100294 TestEntry.class, Decoder.ofString(UTF_8), Decoder.ofInt().withByteOrder(LITTLE_ENDIAN));
295 assertEquals(new TestEntry("a key", 514), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100296 }
Matthias Andreas Benkarde5a5c752021-12-15 19:53:55 +0100297
298 @Test
299 void testPaddedPrimitives() {
300 var data =
301 new byte[] {
302 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
303 0x00, 0x40, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
304 };
305
306 record TestRecord(short s, long l, double d) {}
307
308 var decoder =
309 Decoder.ofStructure(
310 TestRecord.class,
311 Decoder.ofShort().withByteOrder(BIG_ENDIAN),
312 Decoder.ofLong().withByteOrder(LITTLE_ENDIAN),
313 Decoder.ofDouble());
314 assertEquals(new TestRecord((short) 1, 2, 3.25), decoder.decode(ByteBuffer.wrap(data)));
315 }
316
317 @Test
318 void testEmbeddedMaybe() {
319 var data = new byte[] {0x01, 0x01};
320
321 record TestRecord(Optional<Byte> set, Optional<Byte> unset) {}
322
323 var decoder =
324 Decoder.ofStructure(
325 TestRecord.class, Decoder.ofMaybe(Decoder.ofByte()), Decoder.ofMaybe(Decoder.ofByte()));
326 assertEquals(
327 new TestRecord(Optional.of((byte) 1), Optional.empty()),
328 decoder.decode(ByteBuffer.wrap(data)));
329 }
330
331 @Test
332 void testRecordComponentMismatch() {
333 record TestRecord(Optional<Byte> set) {}
334
335 var maybeDecoder = Decoder.ofMaybe(Decoder.ofByte());
336 assertThrows(
337 IllegalArgumentException.class,
338 () -> Decoder.ofStructure(TestRecord.class, maybeDecoder, maybeDecoder));
339 }
340
341 @Test
342 void testTrivialRecord() {
343 var data = new byte[] {0x00};
344
345 record TestRecord() {}
346
347 var decoder = Decoder.ofStructure(TestRecord.class);
348 assertEquals(new TestRecord(), decoder.decode(ByteBuffer.wrap(data)));
349 }
350
351 @Test
352 void testTwoElementTrivialRecordArray() {
353 var data = new byte[] {0x00, 0x00};
354
355 record TestRecord() {}
356
357 var decoder = Decoder.ofArray(Decoder.ofStructure(TestRecord.class));
358 assertEquals(
359 List.of(new TestRecord(), new TestRecord()), decoder.decode(ByteBuffer.wrap(data)));
360 }
361
362 @Test
363 void testSingletonTrivialRecordArray() {
364 var data = new byte[] {0x00};
365
366 record TestRecord() {}
367
368 var decoder = Decoder.ofArray(Decoder.ofStructure(TestRecord.class));
369 assertEquals(List.of(new TestRecord()), decoder.decode(ByteBuffer.wrap(data)));
370 }
371
372 @Test
373 void testEmptyTrivialRecordArray() {
374 var data = new byte[] {};
375
376 record TestRecord() {}
377
378 var decoder = Decoder.ofArray(Decoder.ofStructure(TestRecord.class));
379 assertEquals(List.of(), decoder.decode(ByteBuffer.wrap(data)));
380 }
381
382 @Test
383 void testVariantArray() {
384 var data = new byte[] {};
385
386 record TestRecord() {}
387
388 var decoder = Decoder.ofArray(Decoder.ofStructure(TestRecord.class));
389 assertEquals(List.of(), decoder.decode(ByteBuffer.wrap(data)));
390 }
391
392 @Test
393 void testInvalidVariantSignature() {
394 var data = new byte[] {0x00, 0x00, 0x2E};
395
396 var decoder = Decoder.ofVariant();
397 assertThrows(IllegalArgumentException.class, () -> decoder.decode(ByteBuffer.wrap(data)));
398 }
399
400 @Test
401 void testMissingVariantSignature() {
402 var data = new byte[] {0x01};
403
404 var decoder = Decoder.ofVariant();
405 assertThrows(IllegalArgumentException.class, () -> decoder.decode(ByteBuffer.wrap(data)));
406 }
407
408 @Test
Matthias Andreas Benkard31c61e72021-12-16 20:06:39 +0100409 void testSimpleVariantRecord() throws ParseException {
Matthias Andreas Benkarde5a5c752021-12-15 19:53:55 +0100410 // signature: "(bynqiuxtdsogvmiai)"
411 var data =
412 new byte[] {
413 0x01, // b
414 0x02, // y
415 0x00, 0x03, // n
416 0x00, 0x04, // q
417 0x00, 0x00, // (padding)
418 0x00, 0x00, 0x00, 0x05, // i
419 0x00, 0x00, 0x00, 0x06, // u
420 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, // x
421 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, // t
422 0x40, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // d
423 0x68, 0x69, 0x00, // s
424 0x68, 0x69, 0x00, // o
425 0x68, 0x69, 0x00, // g
426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (padding)
427 0x00, 0x00, 0x00, 0x09, 0x00, 0x69, // v
428 0x00, 0x00, // (padding)
429 0x00, 0x00, 0x00, 0x0a, // mi
430 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, // ai
431 68, 62, 49, 46, 43, // framing offsets
432 0x00, 0x28, 0x62, 0x79, 0x6E, 0x71, 0x69, 0x75, 0x78, 0x74, 0x64, 0x73, 0x6F, 0x67, 0x76,
433 0x6D, 0x69, 0x61, 0x69, 0x29
434 };
435
436 var decoder = Decoder.ofVariant();
437 assertArrayEquals(
438 new Object[] {
439 true,
440 (byte) 2,
441 (short) 3,
442 (short) 4,
443 (int) 5,
444 (int) 6,
445 (long) 7,
446 (long) 8,
447 (double) 3.25,
448 "hi",
449 "hi",
450 "hi",
Matthias Andreas Benkard31c61e72021-12-16 20:06:39 +0100451 new Variant(Signature.parse("i"), 9),
Matthias Andreas Benkarde5a5c752021-12-15 19:53:55 +0100452 Optional.of(10),
453 List.of(11, 12)
454 },
Matthias Andreas Benkard31c61e72021-12-16 20:06:39 +0100455 (Object[]) decoder.decode(ByteBuffer.wrap(data)).value());
456 }
457
458 @Test
459 void testSignatureString() throws ParseException {
460 var data =
461 new byte[] {
462 0x28, 0x62, 0x79, 0x6E, 0x71, 0x69, 0x75, 0x78, 0x74, 0x64, 0x73, 0x6F, 0x67, 0x76, 0x6D,
463 0x69, 0x61, 0x69, 0x29
464 };
465
466 var signature = Signature.parse(ByteBuffer.wrap(data));
467 assertEquals("(bynqiuxtdsogvmiai)", signature.toString());
Matthias Andreas Benkarde5a5c752021-12-15 19:53:55 +0100468 }
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +0100469
470 @Test
471 void testMap() {
472 var data = new byte[] {0x0A, 0x0B, 0x0C};
473 var decoder = Decoder.ofByteArray().map(bytes -> bytes.length);
474 assertEquals(3, decoder.decode(ByteBuffer.wrap(data)));
475 }
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100476}