@@ -63,8 +63,8 @@ private val testTlvSampleData: ByteArray =
63
63
.map { it.toByte() }
64
64
.toByteArray()
65
65
66
- private val testVendorId : UShort = 0xAABBu
67
- private val testProductId : UShort = 0xCCDDu
66
+ private const val TEST_VENDOR_ID : UShort = 0xAABBu
67
+ private const val TEST_PRODUCT_ID : UShort = 0xCCDDu
68
68
69
69
private val testLargeString: String =
70
70
"""
@@ -86,8 +86,8 @@ class TlvReadWriteTest {
86
86
@Test
87
87
fun testTlvSampleData_write () {
88
88
TlvWriter ().apply {
89
- startStructure(FullyQualifiedTag (6 , testVendorId, testProductId , 1u ))
90
- put(FullyQualifiedTag (6 , testVendorId, testProductId , 2u ), true )
89
+ startStructure(FullyQualifiedTag (6 , TEST_VENDOR_ID , TEST_PRODUCT_ID , 1u ))
90
+ put(FullyQualifiedTag (6 , TEST_VENDOR_ID , TEST_PRODUCT_ID , 2u ), true )
91
91
put(ImplicitProfileTag (2 , 2u ), false )
92
92
startArray(ContextSpecificTag (0 ))
93
93
put(AnonymousTag , 42 )
@@ -97,15 +97,15 @@ class TlvReadWriteTest {
97
97
startStructure(AnonymousTag )
98
98
endStructure()
99
99
startList(AnonymousTag )
100
- putNull(FullyQualifiedTag (6 , testVendorId, testProductId , 17u ))
100
+ putNull(FullyQualifiedTag (6 , TEST_VENDOR_ID , TEST_PRODUCT_ID , 17u ))
101
101
putNull(ImplicitProfileTag (4 , 900000u ))
102
102
putNull(AnonymousTag )
103
103
startStructure(ImplicitProfileTag (4 , 4000000000u ))
104
104
put(CommonProfileTag (4 , 70000u ), testLargeString)
105
105
endStructure()
106
106
endList()
107
107
endArray()
108
- put(FullyQualifiedTag (6 , testVendorId, testProductId , 5u ), " This is a test" )
108
+ put(FullyQualifiedTag (6 , TEST_VENDOR_ID , TEST_PRODUCT_ID , 5u ), " This is a test" )
109
109
put(ImplicitProfileTag (2 , 65535u ), 17.9f )
110
110
put(ImplicitProfileTag (4 , 65536u ), 17.9 )
111
111
endStructure()
@@ -117,8 +117,8 @@ class TlvReadWriteTest {
117
117
@Test
118
118
fun testTlvSampleData_read () {
119
119
TlvReader (testTlvSampleData).apply {
120
- enterStructure(FullyQualifiedTag (6 , testVendorId, testProductId , 1u ))
121
- assertThat(getBool(FullyQualifiedTag (6 , testVendorId, testProductId , 2u ))).isEqualTo(true )
120
+ enterStructure(FullyQualifiedTag (6 , TEST_VENDOR_ID , TEST_PRODUCT_ID , 1u ))
121
+ assertThat(getBool(FullyQualifiedTag (6 , TEST_VENDOR_ID , TEST_PRODUCT_ID , 2u ))).isEqualTo(true )
122
122
assertThat(getBool(ImplicitProfileTag (2 , 2u ))).isEqualTo(false )
123
123
enterArray(ContextSpecificTag (0 ))
124
124
assertThat(getInt(AnonymousTag )).isEqualTo(42 )
@@ -128,15 +128,15 @@ class TlvReadWriteTest {
128
128
enterStructure(AnonymousTag )
129
129
exitContainer()
130
130
enterList(AnonymousTag )
131
- getNull(FullyQualifiedTag (6 , testVendorId, testProductId , 17u ))
131
+ getNull(FullyQualifiedTag (6 , TEST_VENDOR_ID , TEST_PRODUCT_ID , 17u ))
132
132
getNull(ImplicitProfileTag (4 , 900000u ))
133
133
getNull(AnonymousTag )
134
134
enterStructure(ImplicitProfileTag (4 , 4000000000u ))
135
135
assertThat(getUtf8String(CommonProfileTag (4 , 70000u ))).isEqualTo(testLargeString)
136
136
exitContainer()
137
137
exitContainer()
138
138
exitContainer()
139
- assertThat(getUtf8String(FullyQualifiedTag (6 , testVendorId, testProductId , 5u )))
139
+ assertThat(getUtf8String(FullyQualifiedTag (6 , TEST_VENDOR_ID , TEST_PRODUCT_ID , 5u )))
140
140
.isEqualTo(" This is a test" )
141
141
assertThat(getFloat(ImplicitProfileTag (2 , 65535u ))).isEqualTo(17.9f )
142
142
assertThat(getDouble(ImplicitProfileTag (4 , 65536u ))).isEqualTo(17.9 )
@@ -149,13 +149,13 @@ class TlvReadWriteTest {
149
149
@Test
150
150
fun testTlvSampleData_read_useSkipElementAndExitContinerInTheMiddle () {
151
151
TlvReader (testTlvSampleData).apply {
152
- enterStructure(FullyQualifiedTag (6 , testVendorId, testProductId , 1u ))
152
+ enterStructure(FullyQualifiedTag (6 , TEST_VENDOR_ID , TEST_PRODUCT_ID , 1u ))
153
153
skipElement()
154
154
assertThat(getBool(ImplicitProfileTag (2 , 2u ))).isEqualTo(false )
155
155
enterArray(ContextSpecificTag (0 ))
156
156
assertThat(getInt(AnonymousTag )).isEqualTo(42 )
157
157
exitContainer()
158
- assertThat(getUtf8String(FullyQualifiedTag (6 , testVendorId, testProductId , 5u )))
158
+ assertThat(getUtf8String(FullyQualifiedTag (6 , TEST_VENDOR_ID , TEST_PRODUCT_ID , 5u )))
159
159
.isEqualTo(" This is a test" )
160
160
assertThat(getFloat(ImplicitProfileTag (2 , 65535u ))).isEqualTo(17.9f )
161
161
assertThat(getDouble(ImplicitProfileTag (4 , 65536u ))).isEqualTo(17.9 )
@@ -165,6 +165,77 @@ class TlvReadWriteTest {
165
165
}
166
166
}
167
167
168
+ @Test
169
+ fun testTlvSampleData_copyElement () {
170
+ val reader = TlvReader (testTlvSampleData)
171
+ val encoding = TlvWriter ().copyElement(reader).validateTlv().getEncoded()
172
+ assertThat(encoding).isEqualTo(testTlvSampleData)
173
+ }
174
+
175
+ @Test
176
+ fun testTlvSampleData_copyElementWithTag () {
177
+ val reader = TlvReader (testTlvSampleData)
178
+ val encoding =
179
+ TlvWriter ()
180
+ .copyElement(FullyQualifiedTag (6 , TEST_VENDOR_ID , TEST_PRODUCT_ID , 1u ), reader)
181
+ .validateTlv()
182
+ .getEncoded()
183
+ assertThat(encoding).isEqualTo(testTlvSampleData)
184
+ }
185
+
186
+ @Test
187
+ fun testCopyElement_throwsIllegalArgumentException () {
188
+ val encoding =
189
+ TlvWriter ().startStructure(AnonymousTag ).endStructure().validateTlv().getEncoded()
190
+ val reader = TlvReader (encoding)
191
+ reader.skipElement()
192
+
193
+ // Throws exception because the reader is positioned at the end of container element
194
+ assertFailsWith<IllegalArgumentException > { TlvWriter ().copyElement(reader) }
195
+ }
196
+
197
+ @Test
198
+ fun testCopyElement_replaceTag () {
199
+ val tag = CommonProfileTag (2 , 1000u )
200
+ val encoding =
201
+ TlvWriter ().startStructure(AnonymousTag ).endStructure().validateTlv().getEncoded()
202
+ val expectedEncoding = TlvWriter ().startStructure(tag).endStructure().validateTlv().getEncoded()
203
+
204
+ assertThat(TlvWriter ().copyElement(tag, TlvReader (encoding)).validateTlv().getEncoded())
205
+ .isEqualTo(expectedEncoding)
206
+ }
207
+
208
+ @Test
209
+ fun testCopyElementUInt_replaceTag () {
210
+ val value = 42U
211
+ val tag1 = CommonProfileTag (2 , 1u )
212
+ val tag2 = CommonProfileTag (2 , 2u )
213
+ val encoding = TlvWriter ().put(tag1, value).validateTlv().getEncoded()
214
+ val expectedEncoding = TlvWriter ().put(tag2, value).validateTlv().getEncoded()
215
+
216
+ assertThat(TlvWriter ().copyElement(tag2, TlvReader (encoding)).validateTlv().getEncoded())
217
+ .isEqualTo(expectedEncoding)
218
+ }
219
+
220
+ @Test
221
+ fun testTlvSampleData_copyElementsOneByOne () {
222
+ val reader = TlvReader (testTlvSampleData)
223
+ reader.skipElement()
224
+ val encoding =
225
+ TlvWriter ()
226
+ .startStructure(FullyQualifiedTag (6 , TEST_VENDOR_ID , TEST_PRODUCT_ID , 1u ))
227
+ .copyElement(reader)
228
+ .copyElement(reader)
229
+ .copyElement(reader)
230
+ .copyElement(FullyQualifiedTag (6 , TEST_VENDOR_ID , TEST_PRODUCT_ID , 5u ), reader)
231
+ .copyElement(reader)
232
+ .copyElement(reader)
233
+ .endStructure()
234
+ .validateTlv()
235
+ .getEncoded()
236
+ assertThat(encoding).isEqualTo(testTlvSampleData)
237
+ }
238
+
168
239
@Test
169
240
fun testData_IntMinMax () {
170
241
val encodedTlv =
@@ -378,7 +449,7 @@ class TlvReadWriteTest {
378
449
379
450
// Throws exception because the encoded value has AnonymousTag tag
380
451
assertFailsWith<IllegalArgumentException > {
381
- TlvReader (encoding).getLong(FullyQualifiedTag (6 , testVendorId, testProductId , 5u ))
452
+ TlvReader (encoding).getLong(FullyQualifiedTag (6 , TEST_VENDOR_ID , TEST_PRODUCT_ID , 5u ))
382
453
}
383
454
}
384
455
@@ -820,6 +891,16 @@ class TlvReadWriteTest {
820
891
}
821
892
}
822
893
894
+ @Test
895
+ fun encodeAnonymousTagInStructure_throwsIllegalArgumentException () {
896
+ // Anonymous tag 1, Unsigned Integer, 1-octet value, {1 = 42U}
897
+ TlvWriter ().apply {
898
+ startStructure(AnonymousTag )
899
+ // anonymous tags are not allowed within structure elements
900
+ assertFailsWith<IllegalArgumentException > { put(AnonymousTag , 42U ) }
901
+ }
902
+ }
903
+
823
904
@Test
824
905
fun encodeContextTag_withinList () {
825
906
// Context tag 1, Unsigned Integer, 1-octet value, [[1 = 42U]]
@@ -847,7 +928,7 @@ class TlvReadWriteTest {
847
928
val value = 42U
848
929
var tag = ContextSpecificTag (1 )
849
930
850
- // Array elements SHALL be of anonumous type
931
+ // Array elements SHALL be of anonymous type
851
932
TlvWriter ().apply {
852
933
startArray(AnonymousTag )
853
934
assertFailsWith<IllegalArgumentException > { put(tag, value) }
@@ -965,7 +1046,7 @@ class TlvReadWriteTest {
965
1046
966
1047
@Test
967
1048
fun putSignedLongArray () {
968
- // Anonumous Array of Signed Integers, [42, -17, -170000, 40000000000]
1049
+ // Anonymous Array of Signed Integers, [42, -17, -170000, 40000000000]
969
1050
val values = longArrayOf(42 , - 17 , - 170000 , 40000000000 )
970
1051
val encoding = " 16 00 2a 00 ef 02 f0 67 fd ff 03 00 90 2f 50 09 00 00 00 18" .octetsToByteArray()
971
1052
@@ -986,7 +1067,7 @@ class TlvReadWriteTest {
986
1067
987
1068
@Test
988
1069
fun putUnsignedLongArray () {
989
- // Anonumous Array of Signed Integers, [42, 170000, 40000000000]
1070
+ // Anonymous Array of Signed Integers, [42, 170000, 40000000000]
990
1071
val values = longArrayOf(42 , 170000 , 40000000000 )
991
1072
val encoding = " 16 04 2a 06 10 98 02 00 07 00 90 2f 50 09 00 00 00 18" .octetsToByteArray()
992
1073
0 commit comments