From 2a3ac46b68503f30a2307e5e505066105acc2df0 Mon Sep 17 00:00:00 2001 From: Pierre Laborde Date: Wed, 4 Feb 2026 09:44:26 +0100 Subject: [PATCH 1/2] Write a test that was supposed to pass, but it didn't. --- src/Molecule-Tests/MolEventsTest.class.st | 43 +++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/Molecule-Tests/MolEventsTest.class.st b/src/Molecule-Tests/MolEventsTest.class.st index 6a91677a..c0709074 100644 --- a/src/Molecule-Tests/MolEventsTest.class.st +++ b/src/Molecule-Tests/MolEventsTest.class.st @@ -22,6 +22,49 @@ MolEventsTest >> tearDown [ super tearDown. ] +{ #category : #tests } +MolEventsTest >> testOneListenerWithSeveralWarnersWithoutSameSubscribers [ + + | warner1 warner2 listener subscriptions subscribers listener2 subscribers2 subscriptions2 | + "Deployment" + MolMyWarnerComponentImpl deploy. + MolMyListenerComponentImpl deploy. + + "Instanciation" + warner1 := MolMyWarnerComponentImpl instantiate: #warner1. + warner2 := MolMyWarnerComponentImpl instantiate: #warner2. + listener := MolMyListenerComponentImpl instantiate: #listener. + listener2 := MolMyListenerComponentImpl instantiate: #listener2. + + "Subscriptions" + subscriptions := Array with: #warner1. + listener forEvents: MolMyStateChangeEvents useAllProducers: subscriptions. + + subscriptions2 := Array with: #warner2. + listener2 forEvents: MolMyStateChangeEvents useAllProducers: subscriptions2. + + subscribers := listener eventsSubscribers. + self assert: subscribers size equals: 1. + self assert: (subscribers at: MolMyStateChangeEvents) equals: #warner1. + + subscribers2 := listener2 eventsSubscribers. + self assert: subscribers2 size equals: 1. + self assert: (subscribers2 at: MolMyStateChangeEvents) equals: #warner2. + + "Activation" + MolMyWarnerComponentImpl activate: #warner1. + MolMyListenerComponentImpl activate: #listener. + MolMyListenerComponentImpl activate: #listener2. + + "Tests" + warner1 operationalEvent. + self assert: listener currentState equals: #operational. + self assert: listener2 currentState isNil. + warner2 failureEvent. "warner 2 is not active, so he can't send an event" + self assert: listener currentState equals: #operational. + self assert: listener2 currentState equals: #failure +] + { #category : #tests } MolEventsTest >> testSeveralListeners [ From 1f576aa0d66b7149d0c8294aa24c5b845748a32a Mon Sep 17 00:00:00 2001 From: "eric.lepors" Date: Wed, 4 Feb 2026 09:48:15 +0000 Subject: [PATCH 2/2] major issue correction for originators connection -> impact multi listener with multi warners mechanism. new tests associated to the issue --- src/Molecule-Tests/MolEventsTest.class.st | 57 ++++++++++++++++++++++- src/Molecule/MolEventSubscriber.class.st | 16 ++++--- 2 files changed, 65 insertions(+), 8 deletions(-) diff --git a/src/Molecule-Tests/MolEventsTest.class.st b/src/Molecule-Tests/MolEventsTest.class.st index c0709074..6ea6ce09 100644 --- a/src/Molecule-Tests/MolEventsTest.class.st +++ b/src/Molecule-Tests/MolEventsTest.class.st @@ -33,7 +33,7 @@ MolEventsTest >> testOneListenerWithSeveralWarnersWithoutSameSubscribers [ "Instanciation" warner1 := MolMyWarnerComponentImpl instantiate: #warner1. warner2 := MolMyWarnerComponentImpl instantiate: #warner2. - listener := MolMyListenerComponentImpl instantiate: #listener. + listener := MolMyListenerComponentImpl instantiate: #listener1. listener2 := MolMyListenerComponentImpl instantiate: #listener2. "Subscriptions" @@ -53,7 +53,8 @@ MolEventsTest >> testOneListenerWithSeveralWarnersWithoutSameSubscribers [ "Activation" MolMyWarnerComponentImpl activate: #warner1. - MolMyListenerComponentImpl activate: #listener. + MolMyWarnerComponentImpl activate: #warner2. + MolMyListenerComponentImpl activate: #listener1. MolMyListenerComponentImpl activate: #listener2. "Tests" @@ -65,6 +66,58 @@ MolEventsTest >> testOneListenerWithSeveralWarnersWithoutSameSubscribers [ self assert: listener2 currentState equals: #failure ] +{ #category : #tests } +MolEventsTest >> testOneListenerWithSeveralWarnersWithoutSameSubscribers2 [ + + | warner1 warner2 listener subscriptions subscribers listener2 subscribers2 subscriptions2 | + "Deployment" + MolMyWarnerComponentImpl deploy. + MolMyListenerComponentImpl deploy. + + "Instanciation" + warner1 := MolMyWarnerComponentImpl instantiate: #warner1. + warner2 := MolMyWarnerComponentImpl instantiate: #warner2. + listener := MolMyListenerComponentImpl instantiate: #listener1. + listener2 := MolMyListenerComponentImpl instantiate: #listener2. + + "Subscriptions" + subscriptions := #warner1. + listener forEvents: MolMyStateChangeEvents useProducer: subscriptions. + + subscriptions2 := #warner2. + listener2 + forEvents: MolMyStateChangeEvents + useProducer: subscriptions2. + + subscribers := listener eventsSubscribers. + self assert: subscribers size equals: 1. + self + assert: (subscribers at: MolMyStateChangeEvents) + equals: #warner1. + + subscribers2 := listener2 eventsSubscribers. + self assert: subscribers2 size equals: 1. + self + assert: (subscribers2 at: MolMyStateChangeEvents) + equals: #warner2. + + "Activation" + + MolMyWarnerComponentImpl activate: #warner1. + + MolMyListenerComponentImpl activate: #listener1. + MolMyListenerComponentImpl activate: #listener2. + + "Tests" + + warner1 operationalEvent. + self assert: listener currentState equals: #operational. + self assert: listener2 currentState isNil. + warner2 failureEvent. "warner 2 is not active, so he can't send an event" + self assert: listener currentState equals: #operational. + self assert: listener2 currentState isNil. +] + { #category : #tests } MolEventsTest >> testSeveralListeners [ diff --git a/src/Molecule/MolEventSubscriber.class.st b/src/Molecule/MolEventSubscriber.class.st index 7a2a795f..84122ad5 100644 --- a/src/Molecule/MolEventSubscriber.class.st +++ b/src/Molecule/MolEventSubscriber.class.st @@ -60,12 +60,16 @@ MolEventSubscriber >> connectAllOriginatorsTo: aComponent [ MolEventSubscriber >> connectOriginator: componentName to: aComponent [ "Connect a component to event pipeline" - self events allSelectors do: [ :event | | originator | - - originator := self originatorsLinks at: componentName. - originator ifNil: [ ^ self error: 'Component originator is nil' ]. - originator when: event send: event to: aComponent. - ]. + | key connect | + key := aComponent eventsSubscribers at: self events ifAbsent: [ nil ]. + connect := key isSymbol ifTrue:[ componentName = key ] ifFalse:[ key includes: componentName ]. + + connect ifTrue: [ + self events allSelectors do: [ :event | + | originator | + originator := self originatorsLinks at: componentName. + originator ifNil: [ ^ self error: 'Component originator is nil' ]. + originator when: event send: event to: aComponent ] ] ] { #category : #private }