@@ -51,6 +51,19 @@ class JsonObjectReaderTest {
5151 nextName()
5252 }
5353
54+ private fun <T > assertNextMapOrNullRecoversAfterFailedPrimitiveRead (
55+ badValue : String ,
56+ goodValue : String ,
57+ expectedValue : T ,
58+ deserializer : JsonDeserializer <T >,
59+ ) {
60+ val actual =
61+ getValuesReader(" {\" bad\" : $badValue , \" good\" : $goodValue }" )
62+ .nextMapOrNull(fixture.logger, deserializer)
63+
64+ assertEquals(mapOf (" good" to expectedValue), actual)
65+ }
66+
5467 // nextStringOrNull
5568
5669 @Test
@@ -313,6 +326,52 @@ class JsonObjectReaderTest {
313326 assertEquals(emptyMap(), actual)
314327 }
315328
329+ @Test(timeout = 1000L )
330+ fun `nextMapOrNull recovers after failed primitive reads` () {
331+ assertNextMapOrNullRecoversAfterFailedPrimitiveRead(
332+ badValue = " true" ,
333+ goodValue = " 2" ,
334+ expectedValue = 2 ,
335+ deserializer = JsonDeserializer { reader, _ -> reader.nextInt() },
336+ )
337+ assertNextMapOrNullRecoversAfterFailedPrimitiveRead(
338+ badValue = " true" ,
339+ goodValue = " 2" ,
340+ expectedValue = 2L ,
341+ deserializer = JsonDeserializer { reader, _ -> reader.nextLong() },
342+ )
343+ assertNextMapOrNullRecoversAfterFailedPrimitiveRead(
344+ badValue = " true" ,
345+ goodValue = " \" two\" " ,
346+ expectedValue = " two" ,
347+ deserializer = JsonDeserializer { reader, _ -> reader.nextString() },
348+ )
349+ assertNextMapOrNullRecoversAfterFailedPrimitiveRead(
350+ badValue = " 1" ,
351+ goodValue = " false" ,
352+ expectedValue = false ,
353+ deserializer = JsonDeserializer { reader, _ -> reader.nextBoolean() },
354+ )
355+ assertNextMapOrNullRecoversAfterFailedPrimitiveRead(
356+ badValue = " true" ,
357+ goodValue = " 2.5" ,
358+ expectedValue = 2.5 ,
359+ deserializer = JsonDeserializer { reader, _ -> reader.nextDouble() },
360+ )
361+ assertNextMapOrNullRecoversAfterFailedPrimitiveRead(
362+ badValue = " true" ,
363+ goodValue = " null" ,
364+ expectedValue = Unit ,
365+ deserializer = JsonDeserializer { reader, _ -> reader.nextNull() },
366+ )
367+ assertNextMapOrNullRecoversAfterFailedPrimitiveRead(
368+ badValue = " true" ,
369+ goodValue = " 2.5" ,
370+ expectedValue = 2.5f ,
371+ deserializer = JsonDeserializer { reader, _ -> reader.nextFloat() },
372+ )
373+ }
374+
316375 @Test(timeout = 1000L )
317376 fun `nextMapOrNull keeps values before a failing value` () {
318377 val actual =
0 commit comments