Commit 20af1fc3 authored by Karlatemp's avatar Karlatemp Committed by GitHub

Reset listeners before run a new task (#294)

* 支持监听优先级, 事件传递拦截

* Fix test

* 并发

* 优先级&并发

* Test

* Fix unused

* To GlobalEventListeners

* Add tests

* intercept with subscribeAlways

* test listener.complete()

* Add functions

* Fix test and add new test

* Test concurrent listening

* Test concurrent listening

* update broadcast

* Fix Boom

* Reset listeners before run a new task
Co-authored-by: default avatarHim188 <Him188@mamoe.net>
parent 32eb36f8
...@@ -12,6 +12,8 @@ package net.mamoe.mirai.event ...@@ -12,6 +12,8 @@ package net.mamoe.mirai.event
import kotlinx.atomicfu.AtomicInt import kotlinx.atomicfu.AtomicInt
import kotlinx.atomicfu.atomic import kotlinx.atomicfu.atomic
import kotlinx.coroutines.* import kotlinx.coroutines.*
import net.mamoe.mirai.event.internal.GlobalEventListeners
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.StepUtil import net.mamoe.mirai.utils.StepUtil
import net.mamoe.mirai.utils.internal.runBlocking import net.mamoe.mirai.utils.internal.runBlocking
import java.util.concurrent.Executor import java.util.concurrent.Executor
...@@ -27,6 +29,7 @@ class TestEvent : Event, AbstractEvent() { ...@@ -27,6 +29,7 @@ class TestEvent : Event, AbstractEvent() {
class EventTests { class EventTests {
@Test @Test
fun testSubscribeInplace() { fun testSubscribeInplace() {
resetEventListeners()
runBlocking { runBlocking {
val subscriber = subscribeAlways<TestEvent> { val subscriber = subscribeAlways<TestEvent> {
triggered = true triggered = true
...@@ -39,6 +42,7 @@ class EventTests { ...@@ -39,6 +42,7 @@ class EventTests {
@Test @Test
fun testSubscribeGlobalScope() { fun testSubscribeGlobalScope() {
resetEventListeners()
runBlocking { runBlocking {
GlobalScope.subscribeAlways<TestEvent> { GlobalScope.subscribeAlways<TestEvent> {
triggered = true triggered = true
...@@ -50,6 +54,7 @@ class EventTests { ...@@ -50,6 +54,7 @@ class EventTests {
@Test @Test
fun `test concurrent listening`() { fun `test concurrent listening`() {
resetEventListeners()
var listeners = 0 var listeners = 0
val counter = AtomicInteger(0) val counter = AtomicInteger(0)
for (p in Listener.EventPriority.values()) { for (p in Listener.EventPriority.values()) {
...@@ -73,6 +78,7 @@ class EventTests { ...@@ -73,6 +78,7 @@ class EventTests {
@Test @Test
fun `test concurrent listening 3`() { fun `test concurrent listening 3`() {
resetEventListeners()
runBlocking { runBlocking {
val called = AtomicInteger() val called = AtomicInteger()
val registered = AtomicInteger() val registered = AtomicInteger()
...@@ -104,6 +110,7 @@ class EventTests { ...@@ -104,6 +110,7 @@ class EventTests {
@Test @Test
fun `test concurrent listening 2`() { fun `test concurrent listening 2`() {
resetEventListeners()
val registered = AtomicInteger() val registered = AtomicInteger()
val called = AtomicInteger() val called = AtomicInteger()
val threads = mutableListOf<Thread>() val threads = mutableListOf<Thread>()
...@@ -149,6 +156,7 @@ class EventTests { ...@@ -149,6 +156,7 @@ class EventTests {
@Test @Test
fun `broadcast Child to Parent`() { fun `broadcast Child to Parent`() {
resetEventListeners()
runBlocking { runBlocking {
val job: CompletableJob val job: CompletableJob
job = subscribeAlways<ParentEvent> { job = subscribeAlways<ParentEvent> {
...@@ -162,6 +170,7 @@ class EventTests { ...@@ -162,6 +170,7 @@ class EventTests {
@Test @Test
fun `broadcast ChildChild to Parent`() { fun `broadcast ChildChild to Parent`() {
resetEventListeners()
runBlocking { runBlocking {
val job: CompletableJob val job: CompletableJob
job = subscribeAlways<ParentEvent> { job = subscribeAlways<ParentEvent> {
...@@ -188,6 +197,7 @@ class EventTests { ...@@ -188,6 +197,7 @@ class EventTests {
@Test @Test
fun `test handler remvoe`() { fun `test handler remvoe`() {
resetEventListeners()
val step = StepUtil() val step = StepUtil()
singleThreaded(step) { singleThreaded(step) {
subscribe<Event> { subscribe<Event> {
...@@ -209,9 +219,16 @@ class EventTests { ...@@ -209,9 +219,16 @@ class EventTests {
} }
} }
*/ */
fun resetEventListeners() {
for (p in Listener.EventPriority.values()) {
@OptIn(MiraiInternalAPI::class)
GlobalEventListeners[p].clear()
}
}
@Test @Test
fun `test intercept with always`() { fun `test intercept with always`() {
resetEventListeners()
val step = StepUtil() val step = StepUtil()
singleThreaded(step) { singleThreaded(step) {
subscribeAlways<ParentEvent> { subscribeAlways<ParentEvent> {
...@@ -228,6 +245,7 @@ class EventTests { ...@@ -228,6 +245,7 @@ class EventTests {
@Test @Test
fun `test intercept`() { fun `test intercept`() {
resetEventListeners()
val step = StepUtil() val step = StepUtil()
singleThreaded(step) { singleThreaded(step) {
subscribeAlways<AbstractEvent> { subscribeAlways<AbstractEvent> {
...@@ -244,6 +262,7 @@ class EventTests { ...@@ -244,6 +262,7 @@ class EventTests {
@Test @Test
fun `test listener complete`() { fun `test listener complete`() {
resetEventListeners()
val step = StepUtil() val step = StepUtil()
singleThreaded(step) { singleThreaded(step) {
val listener = subscribeAlways<ParentEvent> { val listener = subscribeAlways<ParentEvent> {
...@@ -257,6 +276,7 @@ class EventTests { ...@@ -257,6 +276,7 @@ class EventTests {
@Test @Test
fun `test event priority`() { fun `test event priority`() {
resetEventListeners()
val step = StepUtil() val step = StepUtil()
singleThreaded(step) { singleThreaded(step) {
subscribe<PriorityTestEvent> { subscribe<PriorityTestEvent> {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment