blob: d37f6a28dc5d617d7fc188fc62fe577f0ae2cdee [file] [log] [blame]
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +01001package eu.mulk.jgvariant.core;
2
3import static java.nio.ByteOrder.LITTLE_ENDIAN;
4import static java.nio.charset.StandardCharsets.UTF_8;
5import static org.junit.jupiter.api.Assertions.assertEquals;
6
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +01007import java.nio.ByteBuffer;
8import java.util.List;
9import java.util.Optional;
10import org.junit.jupiter.api.Test;
11
12/**
13 * Tests based on the examples given in <a
14 * href="https://people.gnome.org/~desrt/gvariant-serialisation.pdf">~desrt/gvariant-serialisation.pdf</a>.
15 */
16class DecoderTest {
17
18 @Test
19 void testString() {
20 var data = new byte[] {0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x00};
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010021 var decoder = Decoder.ofString(UTF_8);
22 assertEquals("hello world", decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010023 }
24
25 @Test
26 void testMaybe() {
27 var data =
28 new byte[] {0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x00, 0x00};
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010029 var decoder = Decoder.ofMaybe(Decoder.ofString(UTF_8));
30 assertEquals(Optional.of("hello world"), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010031 }
32
33 @Test
34 void testBooleanArray() {
35 var data = new byte[] {0x01, 0x00, 0x00, 0x01, 0x01};
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010036 var decoder = Decoder.ofArray(Decoder.ofBoolean());
37 assertEquals(List.of(true, false, false, true, true), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010038 }
39
40 @Test
41 void testStructure() {
42 var data =
43 new byte[] {
44 0x66, 0x6F, 0x6F, 0x00, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 0x04
45 };
46
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010047 record TestRecord(String s, int i) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010048
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010049 var decoder = Decoder.ofStructure(TestRecord.class, Decoder.ofString(UTF_8), Decoder.ofInt());
50 assertEquals(new TestRecord("foo", -1), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010051 }
52
53 @Test
54 void testComplexStructureArray() {
55 var data =
56 new byte[] {
57 0x68,
58 0x69,
59 0x00,
60 0x00,
61 (byte) 0xfe,
62 (byte) 0xff,
63 (byte) 0xff,
64 (byte) 0xff,
65 0x03,
66 0x00,
67 0x00,
68 0x00,
69 0x62,
70 0x79,
71 0x65,
72 0x00,
73 (byte) 0xff,
74 (byte) 0xff,
75 (byte) 0xff,
76 (byte) 0xff,
77 0x04,
78 0x09,
79 0x15
80 };
81
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010082 record TestRecord(String s, int i) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010083
84 var decoder =
85 Decoder.ofArray(
86 Decoder.ofStructure(
87 TestRecord.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010088 Decoder.ofString(UTF_8),
89 Decoder.ofInt().withByteOrder(LITTLE_ENDIAN)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010090 assertEquals(
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010091 List.of(new TestRecord("hi", -2), new TestRecord("bye", -1)),
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010092 decoder.decode(ByteBuffer.wrap(data)));
93 }
94
95 @Test
96 void testStringArray() {
97 var data =
98 new byte[] {
99 0x69, 0x00, 0x63, 0x61, 0x6E, 0x00, 0x68, 0x61, 0x73, 0x00, 0x73, 0x74, 0x72, 0x69, 0x6E,
100 0x67, 0x73, 0x3F, 0x00, 0x02, 0x06, 0x0a, 0x13
101 };
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100102 var decoder = Decoder.ofArray(Decoder.ofString(UTF_8));
103 assertEquals(List.of("i", "can", "has", "strings?"), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100104 }
105
106 @Test
107 void testNestedStructure() {
108 var data =
109 new byte[] {
110 0x69, 0x63, 0x61, 0x6E, 0x00, 0x68, 0x61, 0x73, 0x00, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
111 0x73, 0x3F, 0x00, 0x04, 0x0d, 0x05
112 };
113
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100114 record TestChild(byte b, String s) {}
115 record TestParent(TestChild tc, List<String> as) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100116
117 var decoder =
118 Decoder.ofStructure(
119 TestParent.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100120 Decoder.ofStructure(TestChild.class, Decoder.ofByte(), Decoder.ofString(UTF_8)),
121 Decoder.ofArray(Decoder.ofString(UTF_8)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100122
123 assertEquals(
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100124 new TestParent(new TestChild((byte) 0x69, "can"), List.of("has", "strings?")),
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100125 decoder.decode(ByteBuffer.wrap(data)));
126 }
127
128 @Test
129 void testSimpleStructure() {
130 var data = new byte[] {0x60, 0x70};
131
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100132 record TestRecord(byte b1, byte b2) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100133
134 var decoder =
135 Decoder.ofStructure(
136 TestRecord.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100137 Decoder.ofByte().withByteOrder(LITTLE_ENDIAN),
138 Decoder.ofByte().withByteOrder(LITTLE_ENDIAN));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100139
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100140 assertEquals(new TestRecord((byte) 0x60, (byte) 0x70), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100141 }
142
143 @Test
144 void testPaddedStructureRight() {
145 var data = new byte[] {0x60, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00};
146
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100147 record TestRecord(int b1, byte b2) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100148
149 var decoder =
150 Decoder.ofStructure(
151 TestRecord.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100152 Decoder.ofInt().withByteOrder(LITTLE_ENDIAN),
153 Decoder.ofByte().withByteOrder(LITTLE_ENDIAN));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100154
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100155 assertEquals(new TestRecord(0x60, (byte) 0x70), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100156 }
157
158 @Test
159 void testPaddedStructureLeft() {
160 var data = new byte[] {0x60, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00};
161
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100162 record TestRecord(byte b1, int b2) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100163
164 var decoder =
165 Decoder.ofStructure(
166 TestRecord.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100167 Decoder.ofByte().withByteOrder(LITTLE_ENDIAN),
168 Decoder.ofInt().withByteOrder(LITTLE_ENDIAN));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100169
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100170 assertEquals(new TestRecord((byte) 0x60, 0x70), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100171 }
172
173 @Test
174 void testSimpleStructureArray() {
175 var data =
176 new byte[] {
177 0x60,
178 0x00,
179 0x00,
180 0x00,
181 0x70,
182 0x00,
183 0x00,
184 0x00,
185 (byte) 0x88,
186 0x02,
187 0x00,
188 0x00,
189 (byte) 0xF7,
190 0x00,
191 0x00,
192 0x00
193 };
194
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100195 record TestRecord(int b1, byte b2) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100196
197 var decoder =
198 Decoder.ofArray(
199 Decoder.ofStructure(
200 TestRecord.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100201 Decoder.ofInt().withByteOrder(LITTLE_ENDIAN),
202 Decoder.ofByte().withByteOrder(LITTLE_ENDIAN)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100203
204 assertEquals(
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100205 List.of(new TestRecord(96, (byte) 0x70), new TestRecord(648, (byte) 0xf7)),
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100206 decoder.decode(ByteBuffer.wrap(data)));
207 }
208
209 @Test
210 void testByteArray() {
211 var data = new byte[] {0x04, 0x05, 0x06, 0x07};
212
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100213 var decoder = Decoder.ofArray(Decoder.ofByte());
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100214
215 assertEquals(
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100216 List.of((byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07),
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100217 decoder.decode(ByteBuffer.wrap(data)));
218 }
219
220 @Test
221 void testIntegerArray() {
222 var data = new byte[] {0x04, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00};
223
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100224 var decoder = Decoder.ofArray(Decoder.ofInt().withByteOrder(LITTLE_ENDIAN));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100225
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100226 assertEquals(List.of(4, 258), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100227 }
228
229 @Test
230 void testDictionaryEntry() {
231 var data =
232 new byte[] {0x61, 0x20, 0x6B, 0x65, 0x79, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x06};
233
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100234 record TestEntry(String key, int value) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100235
236 var decoder =
237 Decoder.ofStructure(
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100238 TestEntry.class, Decoder.ofString(UTF_8), Decoder.ofInt().withByteOrder(LITTLE_ENDIAN));
239 assertEquals(new TestEntry("a key", 514), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100240 }
241}