@@ -26,7 +26,8 @@ enum class JsonTestingMode {
26
26
TREE ,
27
27
OKIO_STREAMS ,
28
28
JAVA_STREAMS ,
29
- KXIO_STREAMS ;
29
+ KXIO_STREAMS ,
30
+ EFFICIENT_BINARY ;
30
31
31
32
companion object {
32
33
fun value (i : Int ) = values()[i]
@@ -42,6 +43,7 @@ abstract class JsonTestBase {
42
43
return encodeToString(serializer, value, jsonTestingMode)
43
44
}
44
45
46
+ @OptIn(ExperimentalStdlibApi ::class )
45
47
internal fun <T > Json.encodeToString (
46
48
serializer : SerializationStrategy <T >,
47
49
value : T ,
@@ -68,13 +70,26 @@ abstract class JsonTestBase {
68
70
encodeToSink(serializer, value, buffer)
69
71
buffer.readString()
70
72
}
73
+ JsonTestingMode .EFFICIENT_BINARY -> {
74
+ val ebf = EfficientBinaryFormat ()
75
+ val bytes = runCatching { ebf.encodeToByteArray(serializer, value) }.getOrElse { e->
76
+ null // throw e
77
+ }
78
+ if (bytes != null && serializer is KSerializer <* >) {
79
+ val decoded = ebf.decodeFromByteArray((serializer as KSerializer <T >), bytes)
80
+ encodeToString(serializer, decoded)
81
+ } else {
82
+ encodeToString(serializer, value)
83
+ }
84
+ }
71
85
}
72
86
73
87
internal inline fun <reified T : Any > Json.decodeFromString (source : String , jsonTestingMode : JsonTestingMode ): T {
74
88
val deserializer = serializersModule.serializer<T >()
75
89
return decodeFromString(deserializer, source, jsonTestingMode)
76
90
}
77
91
92
+ @OptIn(ExperimentalStdlibApi ::class )
78
93
internal fun <T > Json.decodeFromString (
79
94
deserializer : DeserializationStrategy <T >,
80
95
source : String ,
@@ -101,6 +116,20 @@ abstract class JsonTestBase {
101
116
buffer.writeString(source)
102
117
decodeFromSource(deserializer, buffer)
103
118
}
119
+ JsonTestingMode .EFFICIENT_BINARY -> {
120
+ when (deserializer){
121
+ is KSerializer <* > -> {
122
+ val s = deserializer as KSerializer <T >
123
+ val value = decodeFromString(deserializer, source)
124
+ runCatching {
125
+ val ebf = EfficientBinaryFormat ()
126
+ val binaryValue = EfficientBinaryFormat ().encodeToByteArray(s, value)
127
+ ebf.decodeFromByteArray(s, binaryValue)
128
+ }.getOrElse { value }
129
+ }
130
+ else -> decodeFromString(deserializer, source)
131
+ }
132
+ }
104
133
}
105
134
106
135
protected open fun parametrizedTest (test : (JsonTestingMode ) -> Unit ) {
@@ -145,7 +174,10 @@ abstract class JsonTestBase {
145
174
@OptIn(ExperimentalStdlibApi ::class )
146
175
override fun <T > encodeToString (serializer : SerializationStrategy <T >, value : T ): String {
147
176
bytes = runCatching { ebf.encodeToByteArray(serializer, value) }
148
- .onFailure { if (" Json format" !in it.message!! ) throw it }
177
+ .onFailure { if (" Json format" !in it.message!! ) {
178
+ json.encodeToString(serializer, value) // trigger throwing the json exception if the exception is there
179
+ throw it
180
+ } }
149
181
.getOrNull()
150
182
return json.encodeToString(serializer, value).also {
151
183
if (bytes != null ) jsonStr = it
0 commit comments