2021-12-18 22:59:43 +08:00
|
|
|
/*
|
2022-06-14 02:45:39 +08:00
|
|
|
* Copyright 2019-2022 Mamoe Technologies and contributors.
|
2021-12-18 22:59:43 +08:00
|
|
|
*
|
|
|
|
* 此源代码的使用受 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.console.integrationtest
|
|
|
|
|
|
|
|
import net.mamoe.mirai.console.extension.PluginComponentStorage
|
|
|
|
import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription
|
|
|
|
import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
|
2021-12-23 07:17:21 +08:00
|
|
|
import net.mamoe.mirai.utils.createInstanceOrNull
|
2021-12-18 22:59:43 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* IntegrationTest 测试单元 (Plugin mode)
|
|
|
|
*
|
|
|
|
* 该单元除了拥有 [AbstractTestPoint] 具有的功能之外, 还可以直接模拟一个插件的行为.
|
|
|
|
*
|
|
|
|
* 在此单元里, 可以像写正常的 console 插件一样在此写测试时插件
|
|
|
|
*/
|
|
|
|
public abstract class AbstractTestPointAsPlugin : AbstractTestPoint() {
|
|
|
|
protected abstract fun newPluginDescription(): JvmPluginDescription
|
|
|
|
|
|
|
|
protected open fun KotlinPlugin.onInit() {}
|
|
|
|
protected open fun KotlinPlugin.onLoad0(storage: PluginComponentStorage) {}
|
|
|
|
protected open fun KotlinPlugin.onEnable0() {}
|
|
|
|
protected open fun KotlinPlugin.onDisable0() {}
|
|
|
|
|
2022-06-14 02:45:39 +08:00
|
|
|
protected open fun exceptionHandler(exception: Throwable, step: JvmPluginExecutionStep, instance: KotlinPlugin) {
|
|
|
|
IntegrationTestBootstrapContext.failures.add(this.javaClass)
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun callEH(exception: Throwable, step: JvmPluginExecutionStep, instance: KotlinPlugin) {
|
|
|
|
try {
|
|
|
|
exceptionHandler(exception, step, instance)
|
|
|
|
} catch (e: Throwable) {
|
|
|
|
forceFail(cause = e)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
protected enum class JvmPluginExecutionStep {
|
|
|
|
OnEnable, OnDisable, OnLoad
|
|
|
|
}
|
|
|
|
|
2021-12-18 22:59:43 +08:00
|
|
|
|
|
|
|
@Suppress("unused")
|
|
|
|
@PublishedApi
|
|
|
|
internal abstract class TestPointPluginImpl(
|
|
|
|
private val impl: AbstractTestPointAsPlugin
|
|
|
|
) : KotlinPlugin(impl.newPluginDescription()) {
|
|
|
|
|
|
|
|
init {
|
|
|
|
impl.apply { onInit() }
|
|
|
|
}
|
|
|
|
|
|
|
|
@PublishedApi
|
|
|
|
internal constructor(
|
|
|
|
impl: Class<out AbstractTestPointAsPlugin>
|
2021-12-23 07:17:21 +08:00
|
|
|
) : this(
|
|
|
|
impl.kotlin.createInstanceOrNull() ?: impl.getConstructor().newInstance()
|
|
|
|
)
|
2021-12-18 22:59:43 +08:00
|
|
|
|
|
|
|
override fun onDisable() {
|
2021-12-19 00:45:13 +08:00
|
|
|
try {
|
|
|
|
impl.apply { onDisable0() }
|
|
|
|
} catch (e: Throwable) {
|
2022-06-14 02:45:39 +08:00
|
|
|
impl.callEH(e, JvmPluginExecutionStep.OnDisable, this)
|
2021-12-19 00:45:13 +08:00
|
|
|
throw e
|
|
|
|
}
|
2021-12-18 22:59:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun onEnable() {
|
2021-12-19 00:45:13 +08:00
|
|
|
try {
|
|
|
|
impl.apply { onEnable0() }
|
|
|
|
} catch (e: Throwable) {
|
2022-06-14 02:45:39 +08:00
|
|
|
impl.callEH(e, JvmPluginExecutionStep.OnEnable, this)
|
2021-12-19 00:45:13 +08:00
|
|
|
throw e
|
|
|
|
}
|
2021-12-18 22:59:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun PluginComponentStorage.onLoad() {
|
2021-12-19 00:45:13 +08:00
|
|
|
try {
|
|
|
|
impl.apply { onLoad0(this@onLoad) }
|
|
|
|
} catch (e: Throwable) {
|
2022-06-14 02:45:39 +08:00
|
|
|
impl.callEH(e, JvmPluginExecutionStep.OnLoad, this@TestPointPluginImpl)
|
2021-12-19 00:45:13 +08:00
|
|
|
throw e
|
|
|
|
}
|
2021-12-18 22:59:43 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|