Fix attribute serialization tests
This commit is contained in:
parent
2343f37655
commit
e80c9406c9
@ -10,7 +10,7 @@ val kmathVersion: String by extra("0.3.1-dev-10")
|
|||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
group = "center.sciprog"
|
group = "center.sciprog"
|
||||||
version = "0.2.2-dev-1"
|
version = "0.2.2-dev-3"
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
|
@ -70,7 +70,6 @@ public open class MercatorProjection(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public companion object {
|
public companion object {
|
||||||
|
@ -21,4 +21,8 @@ kscience{
|
|||||||
useSerialization{
|
useSerialization{
|
||||||
json()
|
json()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
useSerialization(sourceSet = space.kscience.gradle.DependencySourceSet.TEST){
|
||||||
|
protobuf()
|
||||||
|
}
|
||||||
}
|
}
|
@ -8,7 +8,9 @@ public interface Attribute<T>
|
|||||||
public abstract class SerializableAttribute<T>(
|
public abstract class SerializableAttribute<T>(
|
||||||
public val serialId: String,
|
public val serialId: String,
|
||||||
public val serializer: KSerializer<T>,
|
public val serializer: KSerializer<T>,
|
||||||
) : Attribute<T>
|
) : Attribute<T> {
|
||||||
|
override fun toString(): String = serialId
|
||||||
|
}
|
||||||
|
|
||||||
public interface AttributeWithDefault<T> : Attribute<T> {
|
public interface AttributeWithDefault<T> : Attribute<T> {
|
||||||
public val default: T
|
public val default: T
|
||||||
|
@ -34,8 +34,8 @@ public class AttributesSerializer(
|
|||||||
|
|
||||||
override fun serialize(encoder: Encoder, value: Attributes) {
|
override fun serialize(encoder: Encoder, value: Attributes) {
|
||||||
val json = buildJsonObject {
|
val json = buildJsonObject {
|
||||||
value.content.forEach { (key, value) ->
|
value.content.forEach { (key: Attribute<*>, value: Any) ->
|
||||||
if (key !in serializableAttributes) error("An attribute key $key is not in the list of allowed attributes for this serializer")
|
if (key !in serializableAttributes) error("An attribute key '$key' is not in the list of allowed attributes for this serializer")
|
||||||
val serializableKey = key as SerializableAttribute
|
val serializableKey = key as SerializableAttribute
|
||||||
|
|
||||||
val json = if (encoder is JsonEncoder) {
|
val json = if (encoder is JsonEncoder) {
|
||||||
|
@ -1,36 +1,86 @@
|
|||||||
package center.sciprog.attributes
|
package center.sciprog.attributes
|
||||||
|
|
||||||
|
import kotlinx.serialization.*
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
import kotlinx.serialization.serializer
|
import kotlinx.serialization.modules.SerializersModule
|
||||||
|
import kotlinx.serialization.modules.contextual
|
||||||
|
import kotlinx.serialization.protobuf.ProtoBuf
|
||||||
|
import kotlin.test.Ignore
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
internal class AttributesSerializationTest {
|
internal class AttributesSerializationTest {
|
||||||
|
|
||||||
internal class TestAttributeContainer(val attributes: Attributes)
|
@Serializable
|
||||||
|
internal class Container(@Contextual val attributes: Attributes) {
|
||||||
|
override fun equals(other: Any?): Boolean = (other as? Container)?.attributes?.equals(attributes) ?: false
|
||||||
|
override fun hashCode(): Int = attributes.hashCode()
|
||||||
|
|
||||||
// internal object TestContainerAttribute: SerializableAttribute<TestAttributeContainer>("container", se)
|
override fun toString(): String = attributes.toString()
|
||||||
|
}
|
||||||
|
|
||||||
internal object TestAttribute : SerializableAttribute<Map<String, String>>("test", serializer())
|
internal object ContainerAttribute : SerializableAttribute<Container>("container", serializer()) {
|
||||||
|
override fun toString(): String = "container"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
internal object TestAttribute : SerializableAttribute<Map<String, String>>("test", serializer()) {
|
||||||
|
override fun toString(): String = "test"
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun restore() {
|
fun restoreFromJson() {
|
||||||
//
|
val json = Json {
|
||||||
// val serializersModule = SerializersModule {
|
serializersModule = SerializersModule {
|
||||||
// contextual(AttributesSerializer(setOf()))
|
contextual(AttributesSerializer(setOf(NameAttribute, TestAttribute, ContainerAttribute)))
|
||||||
// }
|
}
|
||||||
val serializer = AttributesSerializer(setOf(NameAttribute, TestAttribute))
|
}
|
||||||
|
|
||||||
|
|
||||||
val attributes = Attributes {
|
val attributes = Attributes {
|
||||||
NameAttribute("myTest")
|
NameAttribute("myTest")
|
||||||
TestAttribute(mapOf("a" to "aa", "b" to "bb"))
|
TestAttribute(mapOf("a" to "aa", "b" to "bb"))
|
||||||
|
ContainerAttribute(
|
||||||
|
Container(
|
||||||
|
Attributes {
|
||||||
|
TestAttribute(mapOf("a" to "aa", "b" to "bb"))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val serialized = Json.encodeToString(serializer, attributes)
|
val serialized: String = json.encodeToString(attributes)
|
||||||
println(serialized)
|
println(serialized)
|
||||||
|
|
||||||
val restored = Json.decodeFromString(serializer, serialized)
|
val restored: Attributes = json.decodeFromString(serialized)
|
||||||
|
|
||||||
|
assertEquals(attributes, restored)
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalSerializationApi::class)
|
||||||
|
@Test
|
||||||
|
@Ignore
|
||||||
|
fun restoreFromProtoBuf() {
|
||||||
|
val protoBuf = ProtoBuf {
|
||||||
|
serializersModule = SerializersModule {
|
||||||
|
contextual(AttributesSerializer(setOf(NameAttribute, TestAttribute, ContainerAttribute)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val attributes = Attributes {
|
||||||
|
NameAttribute("myTest")
|
||||||
|
TestAttribute(mapOf("a" to "aa", "b" to "bb"))
|
||||||
|
ContainerAttribute(
|
||||||
|
Container(
|
||||||
|
Attributes {
|
||||||
|
TestAttribute(mapOf("a" to "aa", "b" to "bb"))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val serialized = protoBuf.encodeToByteArray(attributes)
|
||||||
|
|
||||||
|
val restored: Attributes = protoBuf.decodeFromByteArray(serialized)
|
||||||
|
|
||||||
assertEquals(attributes, restored)
|
assertEquals(attributes, restored)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user