Skip to content

Commit 7f6abf4

Browse files
authored
Merge pull request #42 from thejayman/master
Fixed ComputedGroup refresh firing unecessary remove events
2 parents 93fcc00 + 41a673b commit 7f6abf4

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

src/EcsRx.Plugins.Computeds/Groups/ComputedGroup.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public void OnEntityRemovingFromGroup(IEntity entity)
7171
public void RefreshEntities()
7272
{
7373
var applicableEntities = InternalObservableGroup.Where(IsEntityApplicable).ToArray();
74-
var entitiesToRemove = InternalObservableGroup.Where(x => applicableEntities.All(y => y.Id != x.Id)).ToArray();
74+
var entitiesToRemove = CachedEntities.Where(x => applicableEntities.All(y => y.Id != x.Id)).ToArray();
7575
var entitiesToAdd = applicableEntities.Where(x => !CachedEntities.Contains(x.Id)).ToArray();
7676

7777
for (var i = entitiesToAdd.Length - 1; i >= 0; i--)

src/EcsRx.Tests/Plugins/Computeds/ComputedGroupTests.cs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)