MessageSerializationTest.kt 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /*
  2. * Copyright 2019-2022 Mamoe Technologies and contributors.
  3. *
  4. * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
  5. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
  6. *
  7. * https://github.com/mamoe/mirai/blob/dev/LICENSE
  8. */
  9. package net.mamoe.mirai.mock.test.mock
  10. import kotlinx.serialization.KSerializer
  11. import kotlinx.serialization.json.Json
  12. import kotlinx.serialization.modules.EmptySerializersModule
  13. import kotlinx.serialization.modules.plus
  14. import kotlinx.serialization.serializer
  15. import net.mamoe.mirai.message.MessageSerializers
  16. import net.mamoe.mirai.message.data.*
  17. import net.mamoe.mirai.mock.test.MockBotTestBase
  18. import net.mamoe.mirai.mock.utils.randomImageContent
  19. import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource
  20. import org.junit.jupiter.api.Assertions
  21. import org.junit.jupiter.api.Test
  22. import kotlin.test.assertEquals
  23. import kotlin.test.assertFalse
  24. internal class MessageSerializationTest : MockBotTestBase() {
  25. @Suppress("DEPRECATION_ERROR")
  26. private val module
  27. get() = MessageSerializers.serializersModule
  28. private val format
  29. get() = Json {
  30. serializersModule = module
  31. useArrayPolymorphism = false
  32. ignoreUnknownKeys = true
  33. }
  34. private inline fun <reified T : Any> T.serialize(serializer: KSerializer<T> = module.serializer()): String {
  35. return format.encodeToString(serializer, this)
  36. }
  37. private inline fun <reified T : Any> String.deserialize(serializer: KSerializer<T> = module.serializer()): T {
  38. return format.decodeFromString(serializer, this)
  39. }
  40. private inline fun <reified T : Any> testSerialization(t: T, serializer: KSerializer<T> = module.serializer()) {
  41. val deserialized = kotlin.runCatching {
  42. println("Testing ${t::class.simpleName} with serializer $serializer")
  43. val serialized = t.serialize(serializer)
  44. println("Result: ${serializer.descriptor.serialName} $serialized")
  45. serialized.deserialize(serializer)
  46. }.getOrElse {
  47. throw IllegalStateException("Failed to serialize $t", it)
  48. }
  49. val msg = "serialized string: ${t.serialize(serializer)}\ndeserialized string: ${
  50. deserialized.serialize(
  51. serializer
  52. )
  53. }\n"
  54. assert1(
  55. t,
  56. deserialized,
  57. msg
  58. )
  59. }
  60. private fun assert1(t: Any, deserialized: Any, msg: String) {
  61. if (deserialized is MessageSource && t is MessageSource) {
  62. assertSource(t, deserialized, msg)
  63. return
  64. }
  65. if (t is MessageChain && deserialized is MessageChain) {
  66. assertEquals(t.size, deserialized.size)
  67. val iter1 = t.iterator()
  68. val iter2 = deserialized.iterator()
  69. repeat(t.size) {
  70. assert1(iter1.next(), iter2.next(), msg)
  71. }
  72. assertFalse(iter1.hasNext(), msg)
  73. assertFalse(iter2.hasNext(), msg)
  74. return
  75. }
  76. assertEquals(t, deserialized, msg)
  77. }
  78. private fun assertSource(t: MessageSource, deserialized: MessageSource, msg: String) {
  79. assertEquals(t.kind, deserialized.kind, msg)
  80. assertEquals(t.botId, deserialized.botId, msg)
  81. assertEquals(t.fromId, deserialized.fromId, msg)
  82. assertEquals(t.targetId, deserialized.targetId, msg)
  83. assertEquals(t.time, deserialized.time, msg)
  84. Assertions.assertArrayEquals(t.ids, deserialized.ids, msg)
  85. Assertions.assertArrayEquals(t.internalIds, deserialized.internalIds, msg)
  86. assertEquals(t.originalMessage, deserialized.originalMessage, msg)
  87. }
  88. @Test
  89. fun testSerializersModulePlus() {
  90. MessageSerializers.serializersModule + EmptySerializersModule
  91. }
  92. @Test
  93. fun testMockMessageSources() = runTest {
  94. testSerialization(bot.addFriend(1, "").says(""))
  95. testSerialization(bot.addStranger(2, "").says(""))
  96. bot.addGroup(3, "").let { group ->
  97. group.sendMessage("AWA").source.let { testSerialization(messageChainOf(it)) }
  98. group.addMember(6, "").says("A").let { testSerialization(it) }
  99. }
  100. }
  101. @Test
  102. fun testMockResources() = runTest {
  103. testSerialization(bot.uploadMockImage(Image.randomImageContent().toExternalResource().toAutoCloseable()))
  104. "1".toByteArray().toExternalResource().use { data0 ->
  105. testSerialization(bot.uploadOnlineAudio(data0))
  106. testSerialization(bot.asFriend.uploadAudio(data0))
  107. }
  108. }
  109. }