Skip to content

Commit 9b38d63

Browse files
committed
Rename and move example.
Fix issue #246: reset the default component key in the eventSubscribers as default when a producer is removed.
1 parent e44d12e commit 9b38d63

4 files changed

Lines changed: 49 additions & 41 deletions

File tree

src/Molecule-Tests/MolComponentImplTest.class.st

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,37 @@ MolComponentImplTest >> testStart2 [
673673
self assert: component componentName equals: #compA.
674674
]
675675

676+
{ #category : #'tests - connecting - events producers' }
677+
MolComponentImplTest >> testStartAndStopComponentWithRemoveProducerSeveralTimes [
678+
"This test reproduce issue #246: Exception after several starts and stops of same component"
679+
680+
| compA compB |
681+
"start first implemention of a component contract"
682+
compA := MolCompleteComponentImpl start: #compA.
683+
compB := MolCompleteComponentImpl start: #compB.
684+
685+
"link compB to compA"
686+
compB forServices: MolUsedServices useProvider: #compA.
687+
compB forEvents: MolUsedEvents useProducer: #compA.
688+
compB getMolUsedEventsSubscriber subscribe: compB.
689+
690+
"call the service of the first component, it answer #service"
691+
self assert: compB getMolUsedServicesProvider service equals: #service.
692+
693+
"stop and start component several times"
694+
1 to: 10 do:[ :i |
695+
compB forEvents: MolUsedEvents removeProducer: #compA.
696+
compB class stop: #compB.
697+
compB := MolCompleteComponentImpl start: #compB.
698+
compB forServices: MolUsedServices useProvider: #compA.
699+
compB forEvents: MolUsedEvents useProducer: #compA.
700+
compB getMolUsedEventsSubscriber subscribe: compB.
701+
self assert: compB getMolUsedServicesProvider service equals: #service.
702+
].
703+
704+
705+
]
706+
676707
{ #category : #'tests - component creation' }
677708
MolComponentImplTest >> testStartWithGeneratedName [
678709

src/Molecule-Tests/MolComponentLifeCycleTest.class.st

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,37 +16,6 @@ MolComponentLifeCycleTest >> tearDown [
1616
MolComponentManager cleanUp.
1717
]
1818

19-
{ #category : #'tests - component switching' }
20-
MolComponentLifeCycleTest >> testStartAndStopComponentSeveralTimes [
21-
"This test reproduce issue #246: Exception after several starts and stops of same component"
22-
23-
| compA compB |
24-
"start first implemention of a component contract"
25-
compA := MolCompleteComponentImpl start: #compA.
26-
compB := MolCompleteComponentImpl start: #compB.
27-
28-
"link compB to compA"
29-
compB forServices: MolUsedServices useProvider: #compA.
30-
compB forEvents: MolUsedEvents useProducer: #compA.
31-
compB getMolUsedEventsSubscriber subscribe: compB.
32-
33-
"call the service of the first component, it answer #service"
34-
self assert: compB getMolUsedServicesProvider service equals: #service.
35-
36-
"stop and start component several times"
37-
1 to: 10 do:[ :i |
38-
compB forEvents: MolUsedEvents removeProducer: #compA.
39-
compB class stop: #compB.
40-
compB := MolCompleteComponentImpl start: #compB.
41-
compB forServices: MolUsedServices useProvider: #compA.
42-
compB forEvents: MolUsedEvents useProducer: #compA.
43-
compB getMolUsedEventsSubscriber subscribe: compB.
44-
self assert: compB getMolUsedServicesProvider service equals: #service.
45-
].
46-
47-
48-
]
49-
5019
{ #category : #'tests - component switching' }
5120
MolComponentLifeCycleTest >> testSwitchComponentsSearchServicesProviderFor [
5221
"start first implemention of a component contract"

src/Molecule/MolComponentImpl.trait.st

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,10 @@ MolComponentImpl >> forEvents: anEventsTrait removeProducer: aComponentName [
348348

349349
producers := self eventsSubscribers at: anEventsTrait.
350350
producers ifNil:[ ^self ].
351-
producers = aComponentName ifTrue:[ self eventsSubscribers at: anEventsTrait put: nil. ^ self ].
351+
producers = aComponentName ifTrue:[
352+
"Molecule issue #242: store the default component name when a producer is removed to going back to the initial state"
353+
self eventsSubscribers at: anEventsTrait put: MolUtils defaultComponentName. ^ self
354+
].
352355
(producers isArray and:[producers includes: aComponentName]) ifTrue: [ | newProducers |
353356
newProducers := producers asOrderedCollection copy.
354357
newProducers remove: aComponentName.

src/Molecule/MolEventSubscriber.class.st

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,20 @@ MolEventSubscriber >> connectOriginator: componentName to: aComponent [
6161
"Connect a component to event pipeline"
6262

6363
| key connect |
64-
key := aComponent eventsSubscribers at: self events ifAbsent: [ nil ].
65-
connect := key isSymbol ifTrue:[ componentName = key ] ifFalse:[ key includes: componentName ].
66-
67-
connect ifTrue: [
68-
self events allSelectors do: [ :event |
69-
| originator |
70-
originator := self originatorsLinks at: componentName.
71-
originator ifNil: [ ^ self error: 'Component originator is nil' ].
72-
originator when: event send: event to: aComponent ] ]
64+
key := aComponent eventsSubscribers at: self events ifAbsent: [ MolUtils defaultComponentName ].
65+
66+
connect := key isSymbol
67+
ifTrue:[ componentName = key ]
68+
ifFalse:[ key includes: componentName ].
69+
70+
"Cannot connect, stop here"
71+
connect ifFalse:[ ^ self ].
72+
73+
self events allSelectors do: [ :event |
74+
| originator |
75+
originator := self originatorsLinks at: componentName.
76+
originator ifNil: [ ^ self error: 'Component originator is nil' ].
77+
originator when: event send: event to: aComponent ]
7378
]
7479

7580
{ #category : #private }

0 commit comments

Comments
 (0)