| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- /*
- * Copyright 2019-2022 Mamoe Technologies and contributors.
- *
- * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
- * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
- *
- * https://github.com/mamoe/mirai/blob/dev/LICENSE
- */
- package net.mamoe.mirai.mock.test.mock
- import kotlinx.serialization.KSerializer
- import kotlinx.serialization.json.Json
- import kotlinx.serialization.modules.EmptySerializersModule
- import kotlinx.serialization.modules.plus
- import kotlinx.serialization.serializer
- import net.mamoe.mirai.message.MessageSerializers
- import net.mamoe.mirai.message.data.*
- import net.mamoe.mirai.mock.test.MockBotTestBase
- import net.mamoe.mirai.mock.utils.randomImageContent
- import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource
- import org.junit.jupiter.api.Assertions
- import org.junit.jupiter.api.Test
- import kotlin.test.assertEquals
- import kotlin.test.assertFalse
- internal class MessageSerializationTest : MockBotTestBase() {
- @Suppress("DEPRECATION_ERROR")
- private val module
- get() = MessageSerializers.serializersModule
- private val format
- get() = Json {
- serializersModule = module
- useArrayPolymorphism = false
- ignoreUnknownKeys = true
- }
- private inline fun <reified T : Any> T.serialize(serializer: KSerializer<T> = module.serializer()): String {
- return format.encodeToString(serializer, this)
- }
- private inline fun <reified T : Any> String.deserialize(serializer: KSerializer<T> = module.serializer()): T {
- return format.decodeFromString(serializer, this)
- }
- private inline fun <reified T : Any> testSerialization(t: T, serializer: KSerializer<T> = module.serializer()) {
- val deserialized = kotlin.runCatching {
- println("Testing ${t::class.simpleName} with serializer $serializer")
- val serialized = t.serialize(serializer)
- println("Result: ${serializer.descriptor.serialName} $serialized")
- serialized.deserialize(serializer)
- }.getOrElse {
- throw IllegalStateException("Failed to serialize $t", it)
- }
- val msg = "serialized string: ${t.serialize(serializer)}\ndeserialized string: ${
- deserialized.serialize(
- serializer
- )
- }\n"
- assert1(
- t,
- deserialized,
- msg
- )
- }
- private fun assert1(t: Any, deserialized: Any, msg: String) {
- if (deserialized is MessageSource && t is MessageSource) {
- assertSource(t, deserialized, msg)
- return
- }
- if (t is MessageChain && deserialized is MessageChain) {
- assertEquals(t.size, deserialized.size)
- val iter1 = t.iterator()
- val iter2 = deserialized.iterator()
- repeat(t.size) {
- assert1(iter1.next(), iter2.next(), msg)
- }
- assertFalse(iter1.hasNext(), msg)
- assertFalse(iter2.hasNext(), msg)
- return
- }
- assertEquals(t, deserialized, msg)
- }
- private fun assertSource(t: MessageSource, deserialized: MessageSource, msg: String) {
- assertEquals(t.kind, deserialized.kind, msg)
- assertEquals(t.botId, deserialized.botId, msg)
- assertEquals(t.fromId, deserialized.fromId, msg)
- assertEquals(t.targetId, deserialized.targetId, msg)
- assertEquals(t.time, deserialized.time, msg)
- Assertions.assertArrayEquals(t.ids, deserialized.ids, msg)
- Assertions.assertArrayEquals(t.internalIds, deserialized.internalIds, msg)
- assertEquals(t.originalMessage, deserialized.originalMessage, msg)
- }
- @Test
- fun testSerializersModulePlus() {
- MessageSerializers.serializersModule + EmptySerializersModule
- }
- @Test
- fun testMockMessageSources() = runTest {
- testSerialization(bot.addFriend(1, "").says(""))
- testSerialization(bot.addStranger(2, "").says(""))
- bot.addGroup(3, "").let { group ->
- group.sendMessage("AWA").source.let { testSerialization(messageChainOf(it)) }
- group.addMember(6, "").says("A").let { testSerialization(it) }
- }
- }
- @Test
- fun testMockResources() = runTest {
- testSerialization(bot.uploadMockImage(Image.randomImageContent().toExternalResource().toAutoCloseable()))
- "1".toByteArray().toExternalResource().use { data0 ->
- testSerialization(bot.uploadOnlineAudio(data0))
- testSerialization(bot.asFriend.uploadAudio(data0))
- }
- }
- }
|