Skip to content

Commit

Permalink
Complete the work on Mocking frame (#1872)
Browse files Browse the repository at this point in the history
* chore: merge from origin pr

* chore: merge from origin pr

* feat: StrangerRelationChangeEvent

* feat: GroupEntranceAnnouncementChangeEvent

* feat: MemberHonorChangeEvent

* feat: GroupTalkativeChangeEvent

* fix: fix all mentioned problems

* fix: modify as requirement

* doc: group.controlPane

Co-authored-by: Him188 <Him188@mamoe.net>

* fix: assertNotEqual in MockFriendTest

* feat: mockAbsoluteFile and mockAbsoluteFolder(WIP)

* improve: mockAbsoluteFile and mockAbsoluteFolder (WIP)

* fix: if parent == root, null

* improve: mockAbsoluteFile and mockAbsoluteFolder (WIP)

* getUrl in mockAbsoluteFile

* add remoteFile v2 to Group

* add contentsCount

* override AvatarUrl in mockContact

* member test

* fix: data race in MockAbsFile _exists

Co-authored-by: Him188 <Him188@mamoe.net>

* perf: remove general avatarUrl

* chore: move package to net.mamoe.mirai.mock.internal.absoluteFile

* fix: update tests following suggestions

* fix: reduce utils methods

* fix: absoluteFile rename

* fix: add random suspend

Co-authored-by: Him188 <Him188@mamoe.net>
  • Loading branch information
Nambers and Him188 committed Feb 21, 2022
1 parent b2bbec3 commit 320ec01
Show file tree
Hide file tree
Showing 25 changed files with 770 additions and 173 deletions.
2 changes: 2 additions & 0 deletions mirai-core-mock/src/contact/MockContact.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,6 @@ import net.mamoe.mirai.contact.Contact

@JvmBlockingBridge
public interface MockContact : Contact, MockContactOrBot {
// override for modifiable
override var avatarUrl: String
}
8 changes: 4 additions & 4 deletions mirai-core-mock/src/contact/MockFriend.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@ import net.mamoe.mirai.event.broadcast
import net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEvent
import net.mamoe.mirai.event.events.FriendAddEvent
import net.mamoe.mirai.event.events.FriendInputStatusChangedEvent
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.mock.MockBotDSL
import kotlin.random.Random

@JvmBlockingBridge
public interface MockFriend : Friend, MockContact, MockUser, MockMsgSyncSupport {
public interface MockApi {
val contact: MockFriend
var nick: String
var remark: String
public val contact: MockFriend
public var nick: String
public var remark: String
public var avatarUrl: String
}

/**
Expand Down
12 changes: 12 additions & 0 deletions mirai-core-mock/src/contact/MockGroup.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@ import me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge
import net.mamoe.mirai.contact.ContactList
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.NormalMember
import net.mamoe.mirai.data.GroupHonorType
import net.mamoe.mirai.data.MemberInfo
import net.mamoe.mirai.event.broadcast
import net.mamoe.mirai.event.events.MemberHonorChangeEvent
import net.mamoe.mirai.event.events.MemberJoinRequestEvent
import net.mamoe.mirai.mock.MockBot
import net.mamoe.mirai.mock.MockBotDSL
Expand All @@ -36,7 +38,17 @@ public interface MockGroup : Group, MockContact, MockMsgSyncSupport {
override val members: ContactList<MockNormalMember>
override val owner: MockNormalMember
override val botAsMember: MockNormalMember
override var avatarUrl: String
override val announcements: MockAnnouncements
public val honorMembers: MutableMap<GroupHonorType, MockNormalMember>
/**
* 更改拥有群荣耀的群成员.
* 会自动广播[MemberHonorChangeEvent.Achieve]和[MemberHonorChangeEvent.Lose].
* 此外如果honorType是[GroupHonorType.TALKATIVE], 会额外广播[net.mamoe.mirai.event.events.GroupTalkativeChangeEvent].
* 如果不需要广播事件, 可直接更改 [MockGroup.honorMembers]
*/
@MockBotDSL
public fun changeHonorMember(member: MockNormalMember, honorType: GroupHonorType)

/**
* 获取群控制面板
Expand Down
2 changes: 1 addition & 1 deletion mirai-core-mock/src/contact/MockGroupControlPane.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
package net.mamoe.mirai.mock.contact

/**
* 群设置面板, 进行的操作会进行广播
* 群设置面板, 进行的操作如果使用 [withActor] 会进行广播
*
* 与 [MockGroup.settings] 不同的是, 该控制面板不会进行权限校检
*/
Expand Down
10 changes: 5 additions & 5 deletions mirai-core-mock/src/contact/MockNormalMember.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ import java.util.concurrent.CancellationException
public interface MockNormalMember : NormalMember, MockMember {
public interface MockApi : MockMember.MockApi {
override val member: MockNormalMember
var lastSpeakTimestamp: Int
var joinTimestamp: Int
var nameCard: String
var specialTitle: String
public var lastSpeakTimestamp: Int
public var joinTimestamp: Int
public var nameCard: String
public var specialTitle: String

/**
* 单位 秒
*/
var muteTimeEndTimestamp: Long
public var muteTimeEndTimestamp: Long
}

/**
Expand Down
27 changes: 24 additions & 3 deletions mirai-core-mock/src/contact/MockStranger.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,35 @@ package net.mamoe.mirai.mock.contact

import me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge
import net.mamoe.mirai.contact.Stranger
import net.mamoe.mirai.event.broadcast
import net.mamoe.mirai.event.events.StrangerAddEvent
import net.mamoe.mirai.event.events.StrangerRelationChangeEvent
import net.mamoe.mirai.mock.MockBotDSL

@JvmBlockingBridge
public interface MockStranger : Stranger, MockContact, MockUser {
public interface MockApi {
val contact: MockStranger
var nick: String
var remark: String
public val contact: MockStranger
public var nick: String
public var remark: String
}

/**
* 广播陌生人加入
*/
@MockBotDSL
public suspend fun broadcastStrangerAddEvent(): StrangerAddEvent {
return StrangerAddEvent(this).broadcast()
}

/**
* 添加为好友
*/
@MockBotDSL
public suspend fun addAsFriend() {
this.bot.addFriend(this.id, this.nick)
bot.strangers.delegate.remove(this)
StrangerRelationChangeEvent.Friended(this, bot.getFriend(this.id)!!).broadcast()
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import net.mamoe.mirai.contact.announcement.OnlineAnnouncement
import net.mamoe.mirai.utils.MiraiInternalApi

public interface MockAnnouncements : Announcements {
public fun publish0(announcement: Announcement): OnlineAnnouncement
public fun publish0(announcement: Announcement, actor: NormalMember): OnlineAnnouncement
}

public data class MockOnlineAnnouncement @MiraiInternalApi public constructor(
Expand Down
108 changes: 108 additions & 0 deletions mirai-core-mock/src/internal/absolutefile/MockAbsoluteFile.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
/*
* 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
*/
@file:Suppress("invisible_member", "INVISIBLE_REFERENCE")

package net.mamoe.mirai.mock.internal.absolutefile

import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.firstOrNull
import net.mamoe.mirai.contact.FileSupported
import net.mamoe.mirai.contact.file.AbsoluteFile
import net.mamoe.mirai.contact.file.AbsoluteFolder
import net.mamoe.mirai.internal.message.FileMessageImpl
import net.mamoe.mirai.message.data.FileMessage
import net.mamoe.mirai.mock.utils.mock

internal class MockAbsoluteFile(
override val sha1: ByteArray,
override val md5: ByteArray,
private val files: MockRemoteFiles,
override var parent: AbsoluteFolder?,
override val id: String,
override var name: String,
override var absolutePath: String,
override val contact: FileSupported = files.contact,
override var expiryTime: Long = 0L,
override val size: Long = 0,
override val isFile: Boolean = true,
override val isFolder: Boolean = false,
override val uploadTime: Long = 0,
override var lastModifiedTime: Long = 0,
override val uploaderId: Long = 0
) : AbsoluteFile {
@Volatile
private var _exists = true
override suspend fun moveTo(folder: AbsoluteFolder): Boolean {
if (!exists()) return false
files.fileSystem.resolveById(id)!!.moveTo(files.fileSystem.resolveById(folder.id)!!)
this.parent = folder
refresh()
return true
}

override suspend fun getUrl(): String =
files.contact.bot.mock().tmpFsServer.resolveHttpUrl(files.fileSystem.resolveById(id)!!.resolveNativePath())

override fun toMessage(): FileMessage {
//todo busId
return FileMessageImpl(id, 0, name, size)
}

override suspend fun refreshed(): AbsoluteFile? =
parent!!.files().filter { it.id == id }.firstOrNull()

override suspend fun exists(): Boolean = _exists

override suspend fun renameTo(newName: String): Boolean {
if (!exists()) return false
if (files.fileSystem.resolveById(id)!!.rename(newName)) {
refresh()
return true
}
return false
}

override suspend fun delete(): Boolean {
if (!exists()) return false
if (files.fileSystem.resolveById(id)!!.delete()) {
_exists = false
return true
}
return false
}

override suspend fun refresh(): Boolean {
val new = refreshed()
if (new == null) {
_exists = false
return false
}
_exists = true
this.parent = new.parent
this.expiryTime = new.expiryTime
this.name = new.name
this.lastModifiedTime = new.lastModifiedTime
this.absolutePath = new.absolutePath
return true
}

override fun toString(): String = "MockAbsoluteFile(id=$id,absolutePath=$absolutePath,name=$name)"
override fun equals(other: Any?): Boolean =
other != null && other is AbsoluteFile && other.id == id

override fun hashCode(): Int {
// from absoluteFileImpl
var result = super.hashCode()
result = 31 * result + expiryTime.hashCode()
result = 31 * result + size.hashCode()
result = 31 * result + sha1.contentHashCode()
result = 31 * result + md5.contentHashCode()
return result
}
}

0 comments on commit 320ec01

Please sign in to comment.