From 886a00eb312870decb9e62963548d88c36135b70 Mon Sep 17 00:00:00 2001 From: mfidemraizer Date: Thu, 29 Dec 2016 11:41:09 +0100 Subject: [PATCH] See #26 --- TrackerDog.Signed/Properties/AssemblyInfo.cs | 4 ++-- TrackerDog.Signed/TrackerDog.Signed.csproj | 6 ++++++ TrackerDog.Test/CollectionTest.cs | 16 ++++++++++++++++ TrackerDog/CollectionExtensions.cs | 17 +++++++++++++++++ TrackerDog/ICanClearChanges.cs | 7 +++++++ .../IChangeTrackableCollectionContract.cs | 2 +- .../Mixins/ChangeTrackableCollectionMixin.cs | 9 +++++++-- TrackerDog/Properties/AssemblyInfo.cs | 4 ++-- TrackerDog/TrackerDog.csproj | 2 ++ 9 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 TrackerDog/CollectionExtensions.cs create mode 100644 TrackerDog/ICanClearChanges.cs diff --git a/TrackerDog.Signed/Properties/AssemblyInfo.cs b/TrackerDog.Signed/Properties/AssemblyInfo.cs index 91fd590..461f858 100644 --- a/TrackerDog.Signed/Properties/AssemblyInfo.cs +++ b/TrackerDog.Signed/Properties/AssemblyInfo.cs @@ -33,8 +33,8 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.1.4.0")] -[assembly: AssemblyFileVersion("2.1.4.0")] +[assembly: AssemblyVersion("2.1.5.0")] +[assembly: AssemblyFileVersion("2.1.5.0")] [assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)] [assembly: InternalsVisibleTo("TrackerDog.Test.Signed, PublicKey=00240000048000009400000006020000002400005253413100040000010001001ffcf2febdbe56c43afff66e091d7220aa0e53b1638c84e8ae732b444410137f0cc754459f5691f74313921820a490e8761982edac1f051ba141be96bb9f82b4ea4a80b6b87e8c99831fdb69473821dbda3622a8cd3c439ddf3b76cba5ff89809423b7e02ea2b55a12f2b2f5ce0ce377bb2bb4831ce02f7a71cce368e346ecba")] \ No newline at end of file diff --git a/TrackerDog.Signed/TrackerDog.Signed.csproj b/TrackerDog.Signed/TrackerDog.Signed.csproj index 77c80c6..0b0f866 100644 --- a/TrackerDog.Signed/TrackerDog.Signed.csproj +++ b/TrackerDog.Signed/TrackerDog.Signed.csproj @@ -71,6 +71,9 @@ CollectionChangeTrackingContext.cs + + CollectionExtensions.cs + CollectionHandling\CollectionChange.cs @@ -161,6 +164,9 @@ Hooks\SimplePropertyInterceptionHook.cs + + ICanClearChanges.cs + IChangeTrackableCollection.cs diff --git a/TrackerDog.Test/CollectionTest.cs b/TrackerDog.Test/CollectionTest.cs index 8dc21a1..1679156 100644 --- a/TrackerDog.Test/CollectionTest.cs +++ b/TrackerDog.Test/CollectionTest.cs @@ -264,5 +264,21 @@ public void ArrayMustNotBeTrackedAsCollections() Assert.IsTrue(g.PropertyHasChanged(o => o.Buffer)); Assert.IsNotInstanceOfType(g.Buffer, typeof(IReadOnlyChangeTrackableCollection)); } + + [TestMethod] + public void CanClearCollectionChanges() + { + A a = TrackableObjectFactory.CreateOf(); + a.Items.Add("a"); + a.Items.Add("b"); + + a.Items.ClearChanges(); + + IReadOnlyChangeTrackableCollection trackableCollection + = (IReadOnlyChangeTrackableCollection)a.Items; + + Assert.AreEqual(0, trackableCollection.AddedItems.Count); + Assert.AreEqual(0, trackableCollection.RemovedItems.Count); + } } } \ No newline at end of file diff --git a/TrackerDog/CollectionExtensions.cs b/TrackerDog/CollectionExtensions.cs new file mode 100644 index 0000000..2e4404f --- /dev/null +++ b/TrackerDog/CollectionExtensions.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using System.Diagnostics.Contracts; + +namespace TrackerDog +{ + public static class CollectionExtensions + { + public static void ClearChanges(this ICollection source) + { + Contract.Requires(source is ICanClearChanges, $"Given collection must implement 'TrackerDog.ICanClearChanges'"); + + ICanClearChanges canClearChanges = (ICanClearChanges)source; + + canClearChanges.ClearChanges(); + } + } +} diff --git a/TrackerDog/ICanClearChanges.cs b/TrackerDog/ICanClearChanges.cs new file mode 100644 index 0000000..86245f8 --- /dev/null +++ b/TrackerDog/ICanClearChanges.cs @@ -0,0 +1,7 @@ +namespace TrackerDog +{ + public interface ICanClearChanges + { + void ClearChanges(); + } +} \ No newline at end of file diff --git a/TrackerDog/IChangeTrackableCollectionContract.cs b/TrackerDog/IChangeTrackableCollectionContract.cs index 0977a34..595a68d 100644 --- a/TrackerDog/IChangeTrackableCollectionContract.cs +++ b/TrackerDog/IChangeTrackableCollectionContract.cs @@ -19,7 +19,7 @@ internal abstract class IChangeTrackableCollectionContract : IChangeTrackableCol public HashSet RemovedItems { get; set; } public event NotifyCollectionChangedEventHandler CollectionChanged; - + public CollectionChangeTrackingContext GetChangeTrackingContext() { Contract.Ensures(Contract.Result() != null); diff --git a/TrackerDog/Mixins/ChangeTrackableCollectionMixin.cs b/TrackerDog/Mixins/ChangeTrackableCollectionMixin.cs index 0f97767..0a5f448 100644 --- a/TrackerDog/Mixins/ChangeTrackableCollectionMixin.cs +++ b/TrackerDog/Mixins/ChangeTrackableCollectionMixin.cs @@ -6,9 +6,8 @@ namespace TrackerDog.Mixins { - internal class ChangeTrackableCollectionMixin : IChangeTrackableCollection, IReadOnlyChangeTrackableCollection + internal class ChangeTrackableCollectionMixin : IChangeTrackableCollection, ICanClearChanges, IReadOnlyChangeTrackableCollection { - private readonly static Guid _id = Guid.NewGuid(); private readonly HashSet _addedItems = new HashSet(); private readonly HashSet _removedItems = new HashSet(); @@ -47,5 +46,11 @@ public override bool Equals(object obj) } public override int GetHashCode() => Id.GetHashCode(); + + void ICanClearChanges.ClearChanges() + { + _addedItems.Clear(); + _removedItems.Clear(); + } } } \ No newline at end of file diff --git a/TrackerDog/Properties/AssemblyInfo.cs b/TrackerDog/Properties/AssemblyInfo.cs index 1c98dd2..a6d432c 100644 --- a/TrackerDog/Properties/AssemblyInfo.cs +++ b/TrackerDog/Properties/AssemblyInfo.cs @@ -32,7 +32,7 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.1.4.0")] -[assembly: AssemblyFileVersion("2.1.4.0")] +[assembly: AssemblyVersion("2.1.5.0")] +[assembly: AssemblyFileVersion("2.1.5.0")] [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] [assembly: InternalsVisibleTo("TrackerDog.Test")] \ No newline at end of file diff --git a/TrackerDog/TrackerDog.csproj b/TrackerDog/TrackerDog.csproj index 1ca9ef3..bf266d2 100644 --- a/TrackerDog/TrackerDog.csproj +++ b/TrackerDog/TrackerDog.csproj @@ -113,6 +113,7 @@ + @@ -141,6 +142,7 @@ +