public void ShouldRejectChangesWithModifiedAndRemovedItem() { var email = _emails.First(); var c = new ChangeTrackingCollections <FriendEmailWrapper>(_emails); email.Email = "*****@*****.**"; c.Remove(email); Assert.AreEqual("*****@*****.**", email.EmailOriginalValue); Assert.AreEqual(1, c.Count); Assert.AreEqual(0, c.AddedItems.Count); Assert.AreEqual(0, c.ModifiedItems.Count); Assert.AreEqual(1, c.RemovedItems.Count); c.RejectChanges(); Assert.AreEqual(2, c.Count); Assert.IsTrue(c.Contains(email)); Assert.AreEqual(0, c.AddedItems.Count); Assert.AreEqual(0, c.ModifiedItems.Count); Assert.AreEqual(0, c.RemovedItems.Count); Assert.IsFalse(email.IsChanged); Assert.AreEqual("*****@*****.**", email.Email); Assert.AreEqual("*****@*****.**", email.EmailOriginalValue); Assert.IsFalse(c.IsChanged); }
private bool ChangeTrackerHasChangesForEntity(NetworkEntityGuid interestingEntityGuid) { try { return(ChangeTrackingCollections.RetrieveEntity(interestingEntityGuid).HasPendingChanges); } catch (Exception e) { throw new InvalidOperationException($"Attempted to load Entity: {interestingEntityGuid}'s interst collection From: {ChangeTrackingCollections.GetType().Name} but failed. No entry matched the key. Exception: {e.Message}", e); } }
public void ShouldNotTrackAddedItemAsModified() { var emailToAdd = new FriendEmailWrapper(new FriendEmail()); var c = new ChangeTrackingCollections <FriendEmailWrapper>(_emails); c.Add(emailToAdd); emailToAdd.Email = "*****@*****.**"; Assert.IsTrue(emailToAdd.IsChanged); Assert.AreEqual(3, c.Count); Assert.AreEqual(1, c.AddedItems.Count); Assert.AreEqual(0, c.RemovedItems.Count); Assert.AreEqual(0, c.ModifiedItems.Count); Assert.IsTrue(c.IsChanged); }
public void ShouldTrackModifiedItem() { var emailToModify = _emails.First(); var c = new ChangeTrackingCollections <FriendEmailWrapper>(_emails); Assert.AreEqual(2, c.Count); Assert.IsFalse(c.IsChanged); emailToModify.Email = "*****@*****.**"; Assert.AreEqual(0, c.AddedItems.Count); Assert.AreEqual(1, c.ModifiedItems.Count); Assert.AreEqual(0, c.RemovedItems.Count); Assert.IsTrue(c.IsChanged); emailToModify.Email = "*****@*****.**"; Assert.AreEqual(0, c.AddedItems.Count); Assert.AreEqual(0, c.ModifiedItems.Count); Assert.AreEqual(0, c.RemovedItems.Count); Assert.IsFalse(c.IsChanged); }
/// <inheritdoc /> public void Tick() { foreach (var entry in GuidToInterestCollectionMappable.EnumerateWithGuid(KnownEntities, EntityType.Player)) { InterestCollection interest = entry.ComponentValue; //Even if we only know ourselves we should do this anyway //so that the client can receieve entity data changes about itself //TODO: We probably won't send an update about ALL entites, so this is some wasted allocations and time List <EntityAssociatedData <FieldValueUpdate> > updates = new List <EntityAssociatedData <FieldValueUpdate> >(interest.ContainedEntities.Count); foreach (var interestingEntityGuid in interest.ContainedEntities) { //Don't build an update for entities that don't have any changes if (!ChangeTrackerHasChangesForEntity(interestingEntityGuid)) { continue; } //TODO: We should cache this update value so we don't need to recompute it for ALL players who are interested //This is the update collection for the particular Entity with guid interestingEntityGuid //We want to use the CHANGE TRACKING bitarray for updates. If this was initial discovery we'd use the SIT bitarray to send all set values. FieldValueUpdate update = UpdateFactory.Create(new EntityFieldUpdateCreationContext(ChangeTrackingCollections.RetrieveEntity(interestingEntityGuid), ChangeTrackingCollections.RetrieveEntity(interestingEntityGuid).ChangeTrackingArray)); updates.Add(new EntityAssociatedData <FieldValueUpdate>(interestingEntityGuid, update)); } //It's possible no entity had updates, so we should not send a packet update if (updates.Count != 0) { SendUpdate(entry.EntityGuid, updates); } } foreach (var dataEntityCollection in ChangeTrackingCollections.Enumerate(KnownEntities)) { dataEntityCollection.ClearTrackedChanges(); } }
public void ShouldNotTrackRemovedItemAsModified() { var emailToModifyAndRemove = _emails.First(); var c = new ChangeTrackingCollections <FriendEmailWrapper>(_emails); emailToModifyAndRemove.Email = "*****@*****.**"; Assert.AreEqual(2, c.Count); Assert.AreEqual(0, c.AddedItems.Count); Assert.AreEqual(0, c.RemovedItems.Count); Assert.AreEqual(1, c.ModifiedItems.Count); Assert.AreEqual(emailToModifyAndRemove, c.ModifiedItems.First()); Assert.IsTrue(c.IsChanged); c.Remove(emailToModifyAndRemove); Assert.AreEqual(1, c.Count); Assert.AreEqual(0, c.AddedItems.Count); Assert.AreEqual(1, c.RemovedItems.Count); Assert.AreEqual(0, c.ModifiedItems.Count); Assert.AreEqual(emailToModifyAndRemove, c.RemovedItems.First()); Assert.IsTrue(c.IsChanged); }
public void ShouldTrackRemovedItems() { var emailToRemove = _emails.First(); var c = new ChangeTrackingCollections <FriendEmailWrapper>(_emails); Assert.AreEqual(2, c.Count); Assert.IsFalse(c.IsChanged); c.Remove(emailToRemove); Assert.AreEqual(1, c.Count); Assert.AreEqual(0, c.AddedItems.Count); Assert.AreEqual(1, c.RemovedItems.Count); Assert.AreEqual(0, c.ModifiedItems.Count); Assert.AreEqual(emailToRemove, c.RemovedItems.First()); Assert.IsTrue(c.IsChanged); c.Add(emailToRemove); Assert.AreEqual(2, c.Count); Assert.AreEqual(0, c.AddedItems.Count); Assert.AreEqual(0, c.RemovedItems.Count); Assert.AreEqual(0, c.ModifiedItems.Count); Assert.IsFalse(c.IsChanged); }
public void ShouldRejectChanges() { var emailToModify = _emails.First(); var emailToRemove = _emails.Skip(1).First(); var emailToAdd = new FriendEmailWrapper(new FriendEmail { Email = "*****@*****.**" }); var c = new ChangeTrackingCollections <FriendEmailWrapper>(_emails); c.Add(emailToAdd); c.Remove(emailToRemove); emailToModify.Email = "*****@*****.**"; Assert.AreEqual("*****@*****.**", emailToModify.EmailOriginalValue); Assert.AreEqual(2, c.Count); Assert.AreEqual(1, c.AddedItems.Count); Assert.AreEqual(1, c.ModifiedItems.Count); Assert.AreEqual(1, c.RemovedItems.Count); c.RejectChanges(); Assert.AreEqual(2, c.Count); Assert.IsTrue(c.Contains(emailToModify)); Assert.IsTrue(c.Contains(emailToRemove)); Assert.AreEqual(0, c.AddedItems.Count); Assert.AreEqual(0, c.ModifiedItems.Count); Assert.AreEqual(0, c.RemovedItems.Count); Assert.IsFalse(emailToModify.IsChanged); Assert.AreEqual("*****@*****.**", emailToModify.Email); Assert.AreEqual("*****@*****.**", emailToModify.EmailOriginalValue); Assert.IsFalse(c.IsChanged); }