From ea53d324aea3c43116b92dc978499e28a0f946a7 Mon Sep 17 00:00:00 2001 From: Joel Silva Schutz Date: Fri, 21 Apr 2023 20:56:52 +0000 Subject: [PATCH] fixes #102 --- features/events/events.go | 50 +++++++++++++++------------------ features/events/example_test.go | 15 ++++++++++ 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/features/events/events.go b/features/events/events.go index d25ca6b..14b14ac 100644 --- a/features/events/events.go +++ b/features/events/events.go @@ -62,42 +62,31 @@ func NewEventType[T any]() *EventType[T] { // Subscribe registers a subscriber for the event. func (e *EventType[T]) Subscribe(w donburi.World, subscriber Subscriber[T]) { - if e.eventBusQuery.Count(w) == 0 { - entity := w.Entry(w.Create(e.eventBus, eventType)) - donburi.Set(entity, e.eventBus, newEventBusData[T]()) - donburi.SetValue(entity, eventType, eventTypeData{ - eventName: e.eventName, - process: func(w donburi.World) { - e.ProcessEvents(w) - }, - }) - } - eventBus := e.mustFindEventBus(w) eventBus.subscribers = append(eventBus.subscribers, subscriber) } // Find the index of a subscriber func (e *EventType[T]) findSubscriber(w donburi.World, subscriber Subscriber[T]) (int, bool) { - if e.eventBusQuery.Count(w) != 0 { - eventBus := e.mustFindEventBus(w) - for i, s := range eventBus.subscribers { - if reflect.ValueOf(s).Pointer() == reflect.ValueOf(subscriber).Pointer() { - return i, true - } - } - } - return 0, false + if e.eventBusQuery.Count(w) != 0 { + eventBus := e.mustFindEventBus(w) + for i, s := range eventBus.subscribers { + if reflect.ValueOf(s).Pointer() == reflect.ValueOf(subscriber).Pointer() { + return i, true + } + } + } + return 0, false } // Unsubscribe removes a subscriber for the event. func (e *EventType[T]) Unsubscribe(w donburi.World, subscriber Subscriber[T]) { - index, found := e.findSubscriber(w, subscriber) - if found { - eventBus := e.mustFindEventBus(w) - eventBus.subscribers[index] = eventBus.subscribers[len(eventBus.subscribers)-1] - eventBus.subscribers = eventBus.subscribers[:len(eventBus.subscribers)-1] - } + index, found := e.findSubscriber(w, subscriber) + if found { + eventBus := e.mustFindEventBus(w) + eventBus.subscribers[index] = eventBus.subscribers[len(eventBus.subscribers)-1] + eventBus.subscribers = eventBus.subscribers[:len(eventBus.subscribers)-1] + } } // Publish publishes an event. @@ -131,7 +120,14 @@ func (e *EventType[T]) ProcessEvents(w donburi.World) { func (e *EventType[T]) mustFindEventBus(w donburi.World) *eventBusData[T] { eventBus, ok := e.eventBusQuery.First(w) if !ok { - panic("event bus not found") + eventBus = w.Entry(w.Create(e.eventBus, eventType)) + donburi.Set(eventBus, e.eventBus, newEventBusData[T]()) + donburi.SetValue(eventBus, eventType, eventTypeData{ + eventName: e.eventName, + process: func(w donburi.World) { + e.ProcessEvents(w) + }, + }) } return donburi.Get[eventBusData[T]](eventBus, e.eventBus) } diff --git a/features/events/example_test.go b/features/events/example_test.go index 231bc40..4c6ad0e 100644 --- a/features/events/example_test.go +++ b/features/events/example_test.go @@ -70,6 +70,21 @@ func TestUnsubscribe(t *testing.T) { } } +func TestEventsWithNoSubscribers(t *testing.T) { + + w := donburi.NewWorld() + + EnemyKilledEvent.Publish(w, &EnemyKilled{EnemyID: 1}) + + events.ProcessAllEvents(w) + + ev := lastReceivedEvent + + if ev != nil { + t.Errorf("event should not be received") + } +} + var ( lastReceivedEvent *EnemyKilled = nil )