@@ -129,5 +129,73 @@ public void should_only_remove_and_fire_events_when_non_applicable_entity_remove
129129 Assert . Equal ( 1 , removingFiredTimes ) ;
130130 Assert . Equal ( 1 , removedFiredTimes ) ;
131131 }
132+
133+ [ Fact ]
134+ public void should_only_fire_events_from_refresh_when_cache_changed ( )
135+ {
136+
137+ var applicableEntity = Substitute . For < IEntity > ( ) ;
138+ applicableEntity . Id . Returns ( 1 ) ;
139+ applicableEntity . HasComponent < TestComponentOne > ( ) . Returns ( false ) ;
140+
141+ var inapplicableEntity = Substitute . For < IEntity > ( ) ;
142+ inapplicableEntity . Id . Returns ( 2 ) ;
143+ inapplicableEntity . HasComponent < TestComponentOne > ( ) . Returns ( false ) ;
144+
145+ var dummyEntitySnapshot = new List < IEntity > { applicableEntity , inapplicableEntity } ;
146+
147+ var mockObservableGroup = Substitute . For < IObservableGroup > ( ) ;
148+ mockObservableGroup . GetEnumerator ( ) . Returns ( x => dummyEntitySnapshot . GetEnumerator ( ) ) ;
149+ mockObservableGroup . OnEntityAdded . Returns ( Observable . Empty < IEntity > ( ) ) ;
150+ mockObservableGroup . OnEntityRemoving . Returns ( Observable . Empty < IEntity > ( ) ) ;
151+ mockObservableGroup . OnEntityRemoved . Returns ( Observable . Empty < IEntity > ( ) ) ;
152+
153+ var computedGroup = new TestComputedGroup ( mockObservableGroup ) ;
154+
155+ var addedFiredTimes = 0 ;
156+ computedGroup . OnEntityAdded . Subscribe ( x =>
157+ {
158+ addedFiredTimes ++ ;
159+ } ) ;
160+
161+ var removingFiredTimes = 0 ;
162+ computedGroup . OnEntityRemoving . Subscribe ( x =>
163+ {
164+ removingFiredTimes ++ ;
165+ } ) ;
166+
167+ var removedFiredTimes = 0 ;
168+ computedGroup . OnEntityRemoved . Subscribe ( x =>
169+ {
170+ removedFiredTimes ++ ;
171+ } ) ;
172+
173+ //No events should fire
174+ computedGroup . RefreshEntities ( ) ;
175+
176+ Assert . Equal ( 0 , addedFiredTimes ) ;
177+ Assert . Equal ( 0 , removingFiredTimes ) ;
178+ Assert . Equal ( 0 , removedFiredTimes ) ;
179+
180+ applicableEntity . HasComponent < TestComponentOne > ( ) . Returns ( true ) ;
181+
182+ //Add should fire only once
183+ computedGroup . RefreshEntities ( ) ;
184+
185+ Assert . Single ( computedGroup . CachedEntities ) ;
186+ Assert . Equal ( 1 , addedFiredTimes ) ;
187+ Assert . Equal ( 0 , removingFiredTimes ) ;
188+ Assert . Equal ( 0 , removedFiredTimes ) ;
189+
190+ applicableEntity . HasComponent < TestComponentOne > ( ) . Returns ( false ) ;
191+
192+ //Remove should fire only once
193+ computedGroup . RefreshEntities ( ) ;
194+
195+ Assert . Empty ( computedGroup . CachedEntities ) ;
196+ Assert . Equal ( 1 , addedFiredTimes ) ;
197+ Assert . Equal ( 1 , removingFiredTimes ) ;
198+ Assert . Equal ( 1 , removedFiredTimes ) ;
199+ }
132200 }
133201}
0 commit comments