From 6fb0d9c51c939b59e6249c6caac8d488721b9e45 Mon Sep 17 00:00:00 2001 From: David Eadie Date: Fri, 16 Feb 2018 16:55:40 +0000 Subject: [PATCH 1/5] Add converter for old storable objects --- src/LazyStorage/StorableConverter.cs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/LazyStorage/StorableConverter.cs diff --git a/src/LazyStorage/StorableConverter.cs b/src/LazyStorage/StorableConverter.cs new file mode 100644 index 0000000..dc3e03b --- /dev/null +++ b/src/LazyStorage/StorableConverter.cs @@ -0,0 +1,25 @@ +using System; +using LazyStorage.Interfaces; + +namespace LazyStorage.Xml +{ + internal class StorableConverter : IConverter where T : IStorable, IEquatable, new() + { + public StorableObject GetStorableObject(T item) + { + return new StorableObject(item.GetStorageInfo()); + } + + public T GetOriginalObject(StorableObject info) + { + var item = new T(); + item.InitialiseWithStorageInfo(info.Info); + return item; + } + + public bool IsEqual(StorableObject storageObject, T realObject) + { + return GetOriginalObject(storageObject).Equals(realObject); + } + } +} \ No newline at end of file From 8a1317ee5d3e4d8a6c370a6efdcb66773866dc96 Mon Sep 17 00:00:00 2001 From: David Eadie Date: Fri, 16 Feb 2018 16:56:10 +0000 Subject: [PATCH 2/5] Remove XmlRepository and use the converter instead This changes behaviour but previously inserts and deletes were handled differently on IStorable repos --- src/LazyStorage.Tests/RepositoryTests.cs | 6 +- src/LazyStorage/StorableObject.cs | 6 ++ src/LazyStorage/Xml/XmlRepository.cs | 112 ----------------------- src/LazyStorage/Xml/XmlStorage.cs | 12 +-- 4 files changed, 11 insertions(+), 125 deletions(-) delete mode 100644 src/LazyStorage/Xml/XmlRepository.cs diff --git a/src/LazyStorage.Tests/RepositoryTests.cs b/src/LazyStorage.Tests/RepositoryTests.cs index 4feee31..cb540db 100644 --- a/src/LazyStorage.Tests/RepositoryTests.cs +++ b/src/LazyStorage.Tests/RepositoryTests.cs @@ -13,7 +13,7 @@ public class RepositoryTests public static IEnumerable Repos => new[] { new object[] {new InMemoryRepository()}, - new object[] {new XmlRepository("RepositoryTests") }, + new object[] {new XmlRepositoryWithConverter("RepositoryTests", new StorableConverter()) }, new object[] {new JsonRepository("RepositoryTests") } }; @@ -58,8 +58,8 @@ public void CanDelete(IRepository repo) [Theory, MemberData(nameof(Repos))] public void CanGetByLinq(IRepository repo) { - var objOne = new TestObject {Name = "one"}; - var objTwo = new TestObject {Name = "two"}; + var objOne = new TestObject {Id = 1, Name = "one"}; + var objTwo = new TestObject {Id = 2, Name = "two"}; repo.Set(objOne); repo.Set(objTwo); diff --git a/src/LazyStorage/StorableObject.cs b/src/LazyStorage/StorableObject.cs index 54623ba..1e003be 100644 --- a/src/LazyStorage/StorableObject.cs +++ b/src/LazyStorage/StorableObject.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Reflection; namespace LazyStorage { @@ -10,5 +11,10 @@ public StorableObject() { Info = new Dictionary(); } + + internal StorableObject(Dictionary info) + { + Info = info; + } } } \ No newline at end of file diff --git a/src/LazyStorage/Xml/XmlRepository.cs b/src/LazyStorage/Xml/XmlRepository.cs deleted file mode 100644 index 3f5bd40..0000000 --- a/src/LazyStorage/Xml/XmlRepository.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Xml.Linq; -using LazyStorage.Interfaces; - -namespace LazyStorage.Xml -{ - internal class XmlRepository : IRepository where T : IStorable, new() - { - private readonly string _uri; - private List _repository = new List(); - - public XmlRepository(string storageFolder) - { - _uri = $"{storageFolder}{typeof(T)}.xml"; - } - - public ICollection Get(Func exp = null) - { - return exp != null ? _repository.Where(exp).ToList() : _repository.ToList(); - } - - public void Set(T item) - { - if (_repository.Contains(item)) - { - // Update - var obj = _repository.Where(x => x.Equals(item)); - _repository.Remove(obj.First()); - _repository.Add(item); - } - else - { - // Insert - var nextId = _repository.Any() ? _repository.Max(x => x.Id) + 1 : 1; - item.Id = nextId; - _repository.Add(item); - } - } - - public void Delete(T item) - { - var obj = _repository.SingleOrDefault(x => x.Id == item.Id); - _repository.Remove(obj); - } - - - public void Load() - { - _repository = File.Exists(_uri) ? GetObjectsFromXml(_uri) : new List(); - } - - public void Save() - { - using (var writer = new FileStream(_uri, FileMode.Create)) - { - GetXmlOuput(_repository).Save(writer); - } - } - - private XDocument GetXmlOuput(List objects) - { - var file = new XDocument(new XElement("Root")); - - var typeAsString = typeof(T).ToString(); - - var rootElement = file.Element("Root"); - - foreach (var item in objects) - { - var info = item.GetStorageInfo(); - - var newElement = new XElement(typeAsString); - - foreach (var data in info) - { - newElement.Add(new XElement(data.Key, data.Value)); - } - - rootElement.Add(newElement); - } - - return file; - } - - private List GetObjectsFromXml(string uri) - { - var file = XDocument.Load(uri); - - var found = new List(); - - foreach (var node in file.Element("Root").Elements()) - { - var storageInfo = new Dictionary(); - - foreach (var element in node.Descendants()) - { - storageInfo.Add(element.Name.ToString(), element.Value); - } - - var item = new T(); - item.InitialiseWithStorageInfo(storageInfo); - - found.Add(item); - } - - return found; - } - } -} \ No newline at end of file diff --git a/src/LazyStorage/Xml/XmlStorage.cs b/src/LazyStorage/Xml/XmlStorage.cs index 33e59ed..244a4d4 100644 --- a/src/LazyStorage/Xml/XmlStorage.cs +++ b/src/LazyStorage/Xml/XmlStorage.cs @@ -16,16 +16,8 @@ public XmlStorage(string storageFolder) public IRepository GetRepository() where T : IStorable, new() { - var typeAsString = typeof(T).ToString(); - - if (!_repos.ContainsKey(typeAsString)) - { - var xmlRepository = new XmlRepository(_storageFolder); - xmlRepository.Load(); - _repos.Add(typeAsString, xmlRepository); - } - - return _repos[typeAsString] as IRepository; + var storableConverter = new StorableConverter(); + return GetRepository(storableConverter); } public IRepository GetRepository(IConverter converter) From 66f8512a0a5a90853a0b1dbd5f219c135dbd18c8 Mon Sep 17 00:00:00 2001 From: David Eadie Date: Fri, 16 Feb 2018 17:01:15 +0000 Subject: [PATCH 3/5] Remove Json and InMemory repos and use converter --- src/LazyStorage.Tests/RepositoryTests.cs | 4 +- .../InMemory/InMemoryRepository.cs | 59 ---------------- src/LazyStorage/InMemory/InMemoryStorage.cs | 12 +--- src/LazyStorage/Json/JsonRepository.cs | 70 ------------------- src/LazyStorage/Json/JsonStorage.cs | 12 +--- src/LazyStorage/StorableConverter.cs | 2 +- 6 files changed, 7 insertions(+), 152 deletions(-) delete mode 100644 src/LazyStorage/InMemory/InMemoryRepository.cs delete mode 100644 src/LazyStorage/Json/JsonRepository.cs diff --git a/src/LazyStorage.Tests/RepositoryTests.cs b/src/LazyStorage.Tests/RepositoryTests.cs index cb540db..dface47 100644 --- a/src/LazyStorage.Tests/RepositoryTests.cs +++ b/src/LazyStorage.Tests/RepositoryTests.cs @@ -12,9 +12,9 @@ public class RepositoryTests { public static IEnumerable Repos => new[] { - new object[] {new InMemoryRepository()}, + new object[] {new InMemoryRepositoryWithConverter(new StorableConverter())}, new object[] {new XmlRepositoryWithConverter("RepositoryTests", new StorableConverter()) }, - new object[] {new JsonRepository("RepositoryTests") } + new object[] {new JsonRepositoryWithConverter("RepositoryTests", new StorableConverter()) } }; [Theory, MemberData(nameof(Repos))] diff --git a/src/LazyStorage/InMemory/InMemoryRepository.cs b/src/LazyStorage/InMemory/InMemoryRepository.cs deleted file mode 100644 index 9565b02..0000000 --- a/src/LazyStorage/InMemory/InMemoryRepository.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using LazyStorage.Interfaces; - -namespace LazyStorage.InMemory -{ - internal class InMemoryRepository : IRepository where T : IStorable, new() - { - private List _repository = new List(); - - public ICollection Get(Func exp = null) - { - return exp != null ? _repository.Where(exp).ToList() : _repository.ToList(); - } - - public void Set(T item) - { - if (_repository.Contains(item)) - { - // Update - var obj = _repository.Where(x => x.Equals(item)); - _repository.Remove(obj.First()); - _repository.Add(item); - } - else - { - // Insert - var nextId = _repository.Any() ? _repository.Max(x => x.Id) + 1 : 1; - item.Id = nextId; - _repository.Add(item); - } - } - - public void Delete(T item) - { - var obj = _repository.SingleOrDefault(x => x.Id == item.Id); - _repository.Remove(obj); - } - - public void Save() - { - var itemsInRepo = Get().Select(x => x.GetStorageInfo()); - InMemorySingleton.Sync(nameof(T), itemsInRepo); - } - - public void Load() - { - _repository = InMemorySingleton.GetRepo().Select(GetObjectFromStorageInfo).ToList(); - } - - private T GetObjectFromStorageInfo(Dictionary storageInfo) - { - var item = new T(); - item.InitialiseWithStorageInfo(storageInfo); - return item; - } - } -} \ No newline at end of file diff --git a/src/LazyStorage/InMemory/InMemoryStorage.cs b/src/LazyStorage/InMemory/InMemoryStorage.cs index c2e92ed..bd897e0 100644 --- a/src/LazyStorage/InMemory/InMemoryStorage.cs +++ b/src/LazyStorage/InMemory/InMemoryStorage.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using LazyStorage.Interfaces; +using LazyStorage.Xml; namespace LazyStorage.InMemory { @@ -14,16 +15,7 @@ public InMemoryStorage() public IRepository GetRepository() where T : IStorable, new() { - var typeAsString = typeof (T).ToString(); - - if (!_repos.ContainsKey(typeAsString)) - { - var inMemoryRepository = new InMemoryRepository(); - inMemoryRepository.Load(); - _repos.Add(typeAsString, inMemoryRepository); - } - - return _repos[typeAsString] as IRepository; + return GetRepository(new StorableConverter()); } public IRepository GetRepository(IConverter converter) diff --git a/src/LazyStorage/Json/JsonRepository.cs b/src/LazyStorage/Json/JsonRepository.cs deleted file mode 100644 index 7264b51..0000000 --- a/src/LazyStorage/Json/JsonRepository.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using LazyStorage.Interfaces; -using Newtonsoft.Json; - -namespace LazyStorage.Json -{ - internal class JsonRepository : IRepository where T : IStorable, new() - { - private readonly string _uri; - private List _repository = new List(); - - public JsonRepository(string storageFolder) - { - _uri = $"{storageFolder}{typeof(T)}.json"; - } - - public ICollection Get(Func exp = null) - { - return exp != null ? _repository.Where(exp).ToList() : _repository.ToList(); - } - - public void Set(T item) - { - if (_repository.Contains(item)) - { - // Update - var obj = _repository.Where(x => x.Equals(item)); - _repository.Remove(obj.First()); - _repository.Add(item); - } - else - { - // Insert - var nextId = _repository.Any() ? _repository.Max(x => x.Id) + 1 : 1; - item.Id = nextId; - _repository.Add(item); - } - } - - public void Delete(T item) - { - var obj = _repository.SingleOrDefault(x => x.Id == item.Id); - _repository.Remove(obj); - } - - - public void Load() - { - if (File.Exists(_uri)) - { - var jsonContent = File.ReadAllText(_uri); - _repository = JsonConvert.DeserializeObject>(jsonContent); - } - else - { - _repository = new List(); - } - - } - - public void Save() - { - var fileContent = JsonConvert.SerializeObject(_repository, Formatting.Indented); - File.WriteAllText(_uri, fileContent); - } - } -} \ No newline at end of file diff --git a/src/LazyStorage/Json/JsonStorage.cs b/src/LazyStorage/Json/JsonStorage.cs index 09a23e0..bc5bab8 100644 --- a/src/LazyStorage/Json/JsonStorage.cs +++ b/src/LazyStorage/Json/JsonStorage.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using LazyStorage.Interfaces; +using LazyStorage.Xml; namespace LazyStorage.Json { @@ -16,16 +17,7 @@ public JsonStorage(string storageFolder) public IRepository GetRepository() where T : IStorable, new() { - var typeAsString = typeof (T).ToString(); - - if (!_repos.ContainsKey(typeAsString)) - { - var jsonRepository = new JsonRepository(_storageFolder); - jsonRepository.Load(); - _repos.Add(typeAsString, jsonRepository); - } - - return _repos[typeAsString] as IRepository; + return GetRepository(new StorableConverter()); } public IRepository GetRepository(IConverter converter) diff --git a/src/LazyStorage/StorableConverter.cs b/src/LazyStorage/StorableConverter.cs index dc3e03b..aaef83f 100644 --- a/src/LazyStorage/StorableConverter.cs +++ b/src/LazyStorage/StorableConverter.cs @@ -1,7 +1,7 @@ using System; using LazyStorage.Interfaces; -namespace LazyStorage.Xml +namespace LazyStorage { internal class StorableConverter : IConverter where T : IStorable, IEquatable, new() { From 6869f8654ed7b16da1bc0e29c617c549130b7bd6 Mon Sep 17 00:00:00 2001 From: David Eadie Date: Fri, 16 Feb 2018 17:04:25 +0000 Subject: [PATCH 4/5] R# rename test classes to match new behaviour --- src/LazyStorage.Tests/PersistenceTests.cs | 26 ++++----- .../RepositoryWithConverterTests.cs | 24 ++++---- ... => RepositoryWithIStorableObjectTests.cs} | 26 ++++----- src/LazyStorage.Tests/TestObject.cs | 56 ++++++++++--------- src/LazyStorage.Tests/TestObjectIStorable.cs | 53 ++++++++++++++++++ .../TestObjectNotIStorable.cs | 55 ------------------ 6 files changed, 120 insertions(+), 120 deletions(-) rename src/LazyStorage.Tests/{RepositoryTests.cs => RepositoryWithIStorableObjectTests.cs} (64%) create mode 100644 src/LazyStorage.Tests/TestObjectIStorable.cs delete mode 100644 src/LazyStorage.Tests/TestObjectNotIStorable.cs diff --git a/src/LazyStorage.Tests/PersistenceTests.cs b/src/LazyStorage.Tests/PersistenceTests.cs index a30e2ca..70e4f54 100644 --- a/src/LazyStorage.Tests/PersistenceTests.cs +++ b/src/LazyStorage.Tests/PersistenceTests.cs @@ -22,8 +22,8 @@ public void CanSaveToStorage(ITestStorage storage) { _currentStorage = storage; var dal = storage.GetStorage(); - var repo = dal.GetRepository(); - var obj = new TestObject(); + var repo = dal.GetRepository(); + var obj = new TestObjectIStorable(); repo.Set(obj); dal.Save(); @@ -36,14 +36,14 @@ public void StoragePersistsBetweenSessions(ITestStorage storage) { _currentStorage = storage; var dal = storage.GetStorage(); - var repo = dal.GetRepository(); - var obj = new TestObject(); + var repo = dal.GetRepository(); + var obj = new TestObjectIStorable(); repo.Set(obj); dal.Save(); var dal2 = storage.GetStorage(); - var repo2 = dal2.GetRepository(); + var repo2 = dal2.GetRepository(); Assert.True(repo2.Get().Single().ContentEquals(obj), "The object could not be found in the persistent repo"); } @@ -54,16 +54,16 @@ public void StorageDoesNotPersistIfDiscarded(ITestStorage storage) _currentStorage = storage; // Create an object in memory - var obj1 = new TestObject(); + var obj1 = new TestObjectIStorable(); // Insert into the repo var dal = storage.GetStorage(); - var repo = dal.GetRepository(); + var repo = dal.GetRepository(); repo.Set(obj1); dal.Save(); // Make some changes - var obj2 = new TestObject + var obj2 = new TestObjectIStorable { Id = 1, Name = "Test" @@ -74,7 +74,7 @@ public void StorageDoesNotPersistIfDiscarded(ITestStorage storage) dal.Discard(); var dal2 = storage.GetStorage(); - var repo2 = dal2.GetRepository(); + var repo2 = dal2.GetRepository(); var testObject = repo2.Get().Single(); Assert.True(testObject.ContentEquals(obj1), "The object changes were not reverted in the repo"); @@ -89,7 +89,7 @@ public void CanSaveToStorageWithConverter(ITestStorage storage) var repo = storage.GetStorage().GetRepository(converter); - var obj = new TestObjectNotIStorable + var obj = new TestObject { Name = "Test", StartDate = DateTime.Now, @@ -111,7 +111,7 @@ public void StoragePersistsBetweenSessionsWithConverter(ITestStorage storage) var repo = dal.GetRepository(converter); - var obj = new TestObjectNotIStorable + var obj = new TestObject { Name = "Test", StartDate = DateTime.Now, @@ -138,13 +138,13 @@ public void StorageDoesNotPersistIfDiscardedWithConverter(ITestStorage storage) var repo = dal.GetRepository(converter); - var obj1 = new TestObjectNotIStorable {Name = "Test"}; + var obj1 = new TestObject {Name = "Test"}; repo.Set(obj1); dal.Save(); // Make some changes - var obj2 = new TestObjectNotIStorable {Name = "Test"}; + var obj2 = new TestObject {Name = "Test"}; // Update the object in the repo but discard changes repo.Set(obj2); diff --git a/src/LazyStorage.Tests/RepositoryWithConverterTests.cs b/src/LazyStorage.Tests/RepositoryWithConverterTests.cs index d9c8348..9ab2d56 100644 --- a/src/LazyStorage.Tests/RepositoryWithConverterTests.cs +++ b/src/LazyStorage.Tests/RepositoryWithConverterTests.cs @@ -13,15 +13,15 @@ public class RepositoryWithConverterTests { public static IEnumerable Repos => new[] { - new object[] {new InMemoryRepositoryWithConverter(new TestObjectStorageConverter())}, - new object[] {new XmlRepositoryWithConverter("RepositoryWithConverterTests", new TestObjectStorageConverter())}, - new object[] {new JsonRepositoryWithConverter("RepositoryWithConverterTests", new TestObjectStorageConverter())}, + new object[] {new InMemoryRepositoryWithConverter(new TestObjectStorageConverter())}, + new object[] {new XmlRepositoryWithConverter("RepositoryWithConverterTests", new TestObjectStorageConverter())}, + new object[] {new JsonRepositoryWithConverter("RepositoryWithConverterTests", new TestObjectStorageConverter())}, }; [Theory, MemberData(nameof(Repos))] - public void CanAddToRepo(IRepository repo) + public void CanAddToRepo(IRepository repo) { - var obj = new TestObjectNotIStorable + var obj = new TestObject { Name = "Test", StartDate = DateTime.Now, @@ -36,9 +36,9 @@ public void CanAddToRepo(IRepository repo) } [Theory, MemberData(nameof(Repos))] - public void CanUpdateRepo(IRepository repo) + public void CanUpdateRepo(IRepository repo) { - var obj = new TestObjectNotIStorable + var obj = new TestObject { Name = "Test", StartDate = new DateTime(2015, 12, 31, 13, 54, 23), @@ -56,9 +56,9 @@ public void CanUpdateRepo(IRepository repo) } [Theory, MemberData(nameof(Repos))] - public void CanDeleteFromRepo(IRepository repo) + public void CanDeleteFromRepo(IRepository repo) { - var obj = new TestObjectNotIStorable { Name = "Test" }; + var obj = new TestObject { Name = "Test" }; repo.Set(obj); repo.Delete(obj); @@ -67,10 +67,10 @@ public void CanDeleteFromRepo(IRepository repo) } [Theory, MemberData(nameof(Repos))] - public void CanGetByLinq(IRepository repo) + public void CanGetByLinq(IRepository repo) { - var objOne = new TestObjectNotIStorable { Name = "one" }; - var objTwo = new TestObjectNotIStorable { Name = "two" }; + var objOne = new TestObject { Name = "one" }; + var objTwo = new TestObject { Name = "two" }; repo.Set(objOne); repo.Set(objTwo); diff --git a/src/LazyStorage.Tests/RepositoryTests.cs b/src/LazyStorage.Tests/RepositoryWithIStorableObjectTests.cs similarity index 64% rename from src/LazyStorage.Tests/RepositoryTests.cs rename to src/LazyStorage.Tests/RepositoryWithIStorableObjectTests.cs index dface47..e9de494 100644 --- a/src/LazyStorage.Tests/RepositoryTests.cs +++ b/src/LazyStorage.Tests/RepositoryWithIStorableObjectTests.cs @@ -8,19 +8,19 @@ namespace LazyStorage.Tests { - public class RepositoryTests + public class RepositoryWithIStorableObjectTests { public static IEnumerable Repos => new[] { - new object[] {new InMemoryRepositoryWithConverter(new StorableConverter())}, - new object[] {new XmlRepositoryWithConverter("RepositoryTests", new StorableConverter()) }, - new object[] {new JsonRepositoryWithConverter("RepositoryTests", new StorableConverter()) } + new object[] {new InMemoryRepositoryWithConverter(new StorableConverter())}, + new object[] {new XmlRepositoryWithConverter("RepositoryWithIStorableObjectTests", new StorableConverter()) }, + new object[] {new JsonRepositoryWithConverter("RepositoryWithIStorableObjectTests", new StorableConverter()) } }; [Theory, MemberData(nameof(Repos))] - public void CanAddToRepo(IRepository repo) + public void CanAddToRepo(IRepository repo) { - var obj = new TestObject(); + var obj = new TestObjectIStorable(); repo.Set(obj); @@ -30,9 +30,9 @@ public void CanAddToRepo(IRepository repo) } [Theory, MemberData(nameof(Repos))] - public void CanUpdateRepo(IRepository repo) + public void CanUpdateRepo(IRepository repo) { - var obj = new TestObject(); + var obj = new TestObjectIStorable(); repo.Set(obj); @@ -45,9 +45,9 @@ public void CanUpdateRepo(IRepository repo) } [Theory, MemberData(nameof(Repos))] - public void CanDelete(IRepository repo) + public void CanDelete(IRepository repo) { - var obj = new TestObject(); + var obj = new TestObjectIStorable(); repo.Set(obj); repo.Delete(obj); @@ -56,10 +56,10 @@ public void CanDelete(IRepository repo) } [Theory, MemberData(nameof(Repos))] - public void CanGetByLinq(IRepository repo) + public void CanGetByLinq(IRepository repo) { - var objOne = new TestObject {Id = 1, Name = "one"}; - var objTwo = new TestObject {Id = 2, Name = "two"}; + var objOne = new TestObjectIStorable {Id = 1, Name = "one"}; + var objTwo = new TestObjectIStorable {Id = 2, Name = "two"}; repo.Set(objOne); repo.Set(objTwo); diff --git a/src/LazyStorage.Tests/TestObject.cs b/src/LazyStorage.Tests/TestObject.cs index 674a90d..277a466 100644 --- a/src/LazyStorage.Tests/TestObject.cs +++ b/src/LazyStorage.Tests/TestObject.cs @@ -1,53 +1,55 @@ using System; -using System.Collections.Generic; using LazyStorage.Interfaces; namespace LazyStorage.Tests { - public sealed class TestObject : IStorable + public class TestObject { - public int Id { get; set; } public string Name { get; set; } - private DateTime _startDate; - private DateTime _endDate; + public DateTime StartDate { get; set; } + public DateTime EndDate { get; set; } public TestObject() { Name = ""; } - public Dictionary GetStorageInfo() + public bool ContentEquals(TestObject other) { - var info = new Dictionary - { - {"Id", Id.ToString()}, - {"Name", Name}, - {"StartDate", _startDate.Ticks.ToString()}, - {"EndDate", _endDate.Ticks.ToString()} - }; - - return info; + return (other.Name == Name) + && (other.StartDate == StartDate) + && (other.EndDate == EndDate); } + } - public void InitialiseWithStorageInfo(Dictionary info) + public class TestObjectStorageConverter : IConverter + { + public StorableObject GetStorableObject(TestObject item) { - Id = int.Parse(info["Id"]); - Name = info["Name"]; - _startDate = new DateTime(long.Parse(info["StartDate"])); - _endDate = new DateTime(long.Parse(info["EndDate"])); + var storableObject = new StorableObject(); + + storableObject.Info.Add("Id", item.Name); + storableObject.Info.Add("StartDate", item.StartDate.Ticks.ToString()); + storableObject.Info.Add("EndDate", item.EndDate.Ticks.ToString()); + + return storableObject; } - public bool Equals(TestObject other) + public TestObject GetOriginalObject(StorableObject info) { - return other.Id == Id; + var orginalObject = new TestObject + { + Name = info.Info["Id"], + StartDate = new DateTime(long.Parse(info.Info["StartDate"])), + EndDate = new DateTime(long.Parse(info.Info["EndDate"])) + }; + + return orginalObject; } - public bool ContentEquals(TestObject other) + public bool IsEqual(StorableObject storageObject, TestObject realObject) { - return other.Id == Id - && other.Name == Name - && other._startDate == _startDate - && other._endDate == _endDate; + return realObject.Name == storageObject.Info["Id"]; } } } \ No newline at end of file diff --git a/src/LazyStorage.Tests/TestObjectIStorable.cs b/src/LazyStorage.Tests/TestObjectIStorable.cs new file mode 100644 index 0000000..42af085 --- /dev/null +++ b/src/LazyStorage.Tests/TestObjectIStorable.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using LazyStorage.Interfaces; + +namespace LazyStorage.Tests +{ + public sealed class TestObjectIStorable : IStorable + { + public int Id { get; set; } + public string Name { get; set; } + private DateTime _startDate; + private DateTime _endDate; + + public TestObjectIStorable() + { + Name = ""; + } + + public Dictionary GetStorageInfo() + { + var info = new Dictionary + { + {"Id", Id.ToString()}, + {"Name", Name}, + {"StartDate", _startDate.Ticks.ToString()}, + {"EndDate", _endDate.Ticks.ToString()} + }; + + return info; + } + + public void InitialiseWithStorageInfo(Dictionary info) + { + Id = int.Parse(info["Id"]); + Name = info["Name"]; + _startDate = new DateTime(long.Parse(info["StartDate"])); + _endDate = new DateTime(long.Parse(info["EndDate"])); + } + + public bool Equals(TestObjectIStorable other) + { + return other.Id == Id; + } + + public bool ContentEquals(TestObjectIStorable other) + { + return other.Id == Id + && other.Name == Name + && other._startDate == _startDate + && other._endDate == _endDate; + } + } +} \ No newline at end of file diff --git a/src/LazyStorage.Tests/TestObjectNotIStorable.cs b/src/LazyStorage.Tests/TestObjectNotIStorable.cs deleted file mode 100644 index b63b334..0000000 --- a/src/LazyStorage.Tests/TestObjectNotIStorable.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using LazyStorage.Interfaces; - -namespace LazyStorage.Tests -{ - public class TestObjectNotIStorable - { - public string Name { get; set; } - public DateTime StartDate { get; set; } - public DateTime EndDate { get; set; } - - public TestObjectNotIStorable() - { - Name = ""; - } - - public bool ContentEquals(TestObjectNotIStorable other) - { - return (other.Name == Name) - && (other.StartDate == StartDate) - && (other.EndDate == EndDate); - } - } - - public class TestObjectStorageConverter : IConverter - { - public StorableObject GetStorableObject(TestObjectNotIStorable item) - { - var storableObject = new StorableObject(); - - storableObject.Info.Add("Id", item.Name); - storableObject.Info.Add("StartDate", item.StartDate.Ticks.ToString()); - storableObject.Info.Add("EndDate", item.EndDate.Ticks.ToString()); - - return storableObject; - } - - public TestObjectNotIStorable GetOriginalObject(StorableObject info) - { - var orginalObject = new TestObjectNotIStorable - { - Name = info.Info["Id"], - StartDate = new DateTime(long.Parse(info.Info["StartDate"])), - EndDate = new DateTime(long.Parse(info.Info["EndDate"])) - }; - - return orginalObject; - } - - public bool IsEqual(StorableObject storageObject, TestObjectNotIStorable realObject) - { - return realObject.Name == storageObject.Info["Id"]; - } - } -} \ No newline at end of file From 1018da69210fbb02673597e1c83146479ee9fbbd Mon Sep 17 00:00:00 2001 From: David Eadie Date: Fri, 16 Feb 2018 21:59:56 +0000 Subject: [PATCH 5/5] Remove IStorable Too many bugs and its just a poorer way of doing this. --- src/LazyStorage.Tests/PersistenceTests.cs | 67 +---------------- .../RepositoryWithConverterTests.cs | 8 +- .../RepositoryWithIStorableObjectTests.cs | 73 ------------------- src/LazyStorage.Tests/TestObjectIStorable.cs | 53 -------------- ...WithConverter.cs => InMemoryRepository.cs} | 4 +- src/LazyStorage/InMemory/InMemoryStorage.cs | 8 +- src/LazyStorage/Interfaces/IStorable.cs | 12 --- src/LazyStorage/Interfaces/IStorage.cs | 1 - ...toryWithConverter.cs => JsonRepository.cs} | 4 +- src/LazyStorage/Json/JsonStorage.cs | 8 +- src/LazyStorage/StorableConverter.cs | 25 ------- src/LazyStorage/StorableObject.cs | 1 - ...itoryWithConverter.cs => XmlRepository.cs} | 4 +- src/LazyStorage/Xml/XmlStorage.cs | 8 +- 14 files changed, 15 insertions(+), 261 deletions(-) delete mode 100644 src/LazyStorage.Tests/RepositoryWithIStorableObjectTests.cs delete mode 100644 src/LazyStorage.Tests/TestObjectIStorable.cs rename src/LazyStorage/InMemory/{InMemoryRepositoryWithConverter.cs => InMemoryRepository.cs} (93%) delete mode 100644 src/LazyStorage/Interfaces/IStorable.cs rename src/LazyStorage/Json/{JsonRepositoryWithConverter.cs => JsonRepository.cs} (93%) delete mode 100644 src/LazyStorage/StorableConverter.cs rename src/LazyStorage/Xml/{XmlRepositoryWithConverter.cs => XmlRepository.cs} (95%) diff --git a/src/LazyStorage.Tests/PersistenceTests.cs b/src/LazyStorage.Tests/PersistenceTests.cs index 70e4f54..dfdadb9 100644 --- a/src/LazyStorage.Tests/PersistenceTests.cs +++ b/src/LazyStorage.Tests/PersistenceTests.cs @@ -19,69 +19,6 @@ public sealed class PersistenceTests : IDisposable [Theory, MemberData(nameof(StorageTypes))] public void CanSaveToStorage(ITestStorage storage) - { - _currentStorage = storage; - var dal = storage.GetStorage(); - var repo = dal.GetRepository(); - var obj = new TestObjectIStorable(); - - repo.Set(obj); - dal.Save(); - - Assert.True(repo.Get().Any(), "The object could not be added to the repository"); - } - - [Theory, MemberData(nameof(StorageTypes))] - public void StoragePersistsBetweenSessions(ITestStorage storage) - { - _currentStorage = storage; - var dal = storage.GetStorage(); - var repo = dal.GetRepository(); - var obj = new TestObjectIStorable(); - - repo.Set(obj); - dal.Save(); - - var dal2 = storage.GetStorage(); - var repo2 = dal2.GetRepository(); - - Assert.True(repo2.Get().Single().ContentEquals(obj), "The object could not be found in the persistent repo"); - } - - [Theory, MemberData(nameof(StorageTypes))] - public void StorageDoesNotPersistIfDiscarded(ITestStorage storage) - { - _currentStorage = storage; - - // Create an object in memory - var obj1 = new TestObjectIStorable(); - - // Insert into the repo - var dal = storage.GetStorage(); - var repo = dal.GetRepository(); - repo.Set(obj1); - dal.Save(); - - // Make some changes - var obj2 = new TestObjectIStorable - { - Id = 1, - Name = "Test" - }; - - // Update the object in the repo but discard changes - repo.Set(obj2); - dal.Discard(); - - var dal2 = storage.GetStorage(); - var repo2 = dal2.GetRepository(); - - var testObject = repo2.Get().Single(); - Assert.True(testObject.ContentEquals(obj1), "The object changes were not reverted in the repo"); - } - - [Theory, MemberData(nameof(StorageTypes))] - public void CanSaveToStorageWithConverter(ITestStorage storage) { _currentStorage = storage; var dal = storage.GetStorage(); @@ -103,7 +40,7 @@ public void CanSaveToStorageWithConverter(ITestStorage storage) } [Theory, MemberData(nameof(StorageTypes))] - public void StoragePersistsBetweenSessionsWithConverter(ITestStorage storage) + public void StoragePersistsBetweenSessions(ITestStorage storage) { _currentStorage = storage; var dal = storage.GetStorage(); @@ -128,7 +65,7 @@ public void StoragePersistsBetweenSessionsWithConverter(ITestStorage storage) } [Theory, MemberData(nameof(StorageTypes))] - public void StorageDoesNotPersistIfDiscardedWithConverter(ITestStorage storage) + public void StorageDoesNotPersistIfDiscarded(ITestStorage storage) { _currentStorage = storage; diff --git a/src/LazyStorage.Tests/RepositoryWithConverterTests.cs b/src/LazyStorage.Tests/RepositoryWithConverterTests.cs index 9ab2d56..0f88b0c 100644 --- a/src/LazyStorage.Tests/RepositoryWithConverterTests.cs +++ b/src/LazyStorage.Tests/RepositoryWithConverterTests.cs @@ -9,13 +9,13 @@ namespace LazyStorage.Tests { - public class RepositoryWithConverterTests + public class RepositoryTests { public static IEnumerable Repos => new[] { - new object[] {new InMemoryRepositoryWithConverter(new TestObjectStorageConverter())}, - new object[] {new XmlRepositoryWithConverter("RepositoryWithConverterTests", new TestObjectStorageConverter())}, - new object[] {new JsonRepositoryWithConverter("RepositoryWithConverterTests", new TestObjectStorageConverter())}, + new object[] {new InMemoryRepository(new TestObjectStorageConverter())}, + new object[] {new XmlRepository("RepositoryWithConverter", new TestObjectStorageConverter())}, + new object[] {new JsonRepository("RepositoryWithConverter", new TestObjectStorageConverter())}, }; [Theory, MemberData(nameof(Repos))] diff --git a/src/LazyStorage.Tests/RepositoryWithIStorableObjectTests.cs b/src/LazyStorage.Tests/RepositoryWithIStorableObjectTests.cs deleted file mode 100644 index e9de494..0000000 --- a/src/LazyStorage.Tests/RepositoryWithIStorableObjectTests.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using LazyStorage.InMemory; -using LazyStorage.Interfaces; -using LazyStorage.Json; -using LazyStorage.Xml; -using Xunit; - -namespace LazyStorage.Tests -{ - public class RepositoryWithIStorableObjectTests - { - public static IEnumerable Repos => new[] - { - new object[] {new InMemoryRepositoryWithConverter(new StorableConverter())}, - new object[] {new XmlRepositoryWithConverter("RepositoryWithIStorableObjectTests", new StorableConverter()) }, - new object[] {new JsonRepositoryWithConverter("RepositoryWithIStorableObjectTests", new StorableConverter()) } - }; - - [Theory, MemberData(nameof(Repos))] - public void CanAddToRepo(IRepository repo) - { - var obj = new TestObjectIStorable(); - - repo.Set(obj); - - var repoObj = repo.Get().Single(); - - Assert.True(repoObj.ContentEquals(obj), "The object returned does not match the one added"); - } - - [Theory, MemberData(nameof(Repos))] - public void CanUpdateRepo(IRepository repo) - { - var obj = new TestObjectIStorable(); - - repo.Set(obj); - - obj.Name = "Test"; - repo.Set(obj); - - var repoObj = repo.Get().Single(); - - Assert.True(repoObj.ContentEquals(obj), "The object returned does not match the one added"); - } - - [Theory, MemberData(nameof(Repos))] - public void CanDelete(IRepository repo) - { - var obj = new TestObjectIStorable(); - - repo.Set(obj); - repo.Delete(obj); - - Assert.False(repo.Get().Any(), "The object could not be deleted from the repository"); - } - - [Theory, MemberData(nameof(Repos))] - public void CanGetByLinq(IRepository repo) - { - var objOne = new TestObjectIStorable {Id = 1, Name = "one"}; - var objTwo = new TestObjectIStorable {Id = 2, Name = "two"}; - - repo.Set(objOne); - repo.Set(objTwo); - - var result = repo.Get(x => x.Name == "one").SingleOrDefault(); - - Assert.NotNull(result); - Assert.True(result.Equals(objOne), "The object could not be retrieved from the repository"); - } - } -} \ No newline at end of file diff --git a/src/LazyStorage.Tests/TestObjectIStorable.cs b/src/LazyStorage.Tests/TestObjectIStorable.cs deleted file mode 100644 index 42af085..0000000 --- a/src/LazyStorage.Tests/TestObjectIStorable.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using LazyStorage.Interfaces; - -namespace LazyStorage.Tests -{ - public sealed class TestObjectIStorable : IStorable - { - public int Id { get; set; } - public string Name { get; set; } - private DateTime _startDate; - private DateTime _endDate; - - public TestObjectIStorable() - { - Name = ""; - } - - public Dictionary GetStorageInfo() - { - var info = new Dictionary - { - {"Id", Id.ToString()}, - {"Name", Name}, - {"StartDate", _startDate.Ticks.ToString()}, - {"EndDate", _endDate.Ticks.ToString()} - }; - - return info; - } - - public void InitialiseWithStorageInfo(Dictionary info) - { - Id = int.Parse(info["Id"]); - Name = info["Name"]; - _startDate = new DateTime(long.Parse(info["StartDate"])); - _endDate = new DateTime(long.Parse(info["EndDate"])); - } - - public bool Equals(TestObjectIStorable other) - { - return other.Id == Id; - } - - public bool ContentEquals(TestObjectIStorable other) - { - return other.Id == Id - && other.Name == Name - && other._startDate == _startDate - && other._endDate == _endDate; - } - } -} \ No newline at end of file diff --git a/src/LazyStorage/InMemory/InMemoryRepositoryWithConverter.cs b/src/LazyStorage/InMemory/InMemoryRepository.cs similarity index 93% rename from src/LazyStorage/InMemory/InMemoryRepositoryWithConverter.cs rename to src/LazyStorage/InMemory/InMemoryRepository.cs index a1ca374..ed5e06f 100644 --- a/src/LazyStorage/InMemory/InMemoryRepositoryWithConverter.cs +++ b/src/LazyStorage/InMemory/InMemoryRepository.cs @@ -5,11 +5,11 @@ namespace LazyStorage.InMemory { - internal class InMemoryRepositoryWithConverter : IRepository + internal class InMemoryRepository : IRepository { private readonly IConverter _converter; - public InMemoryRepositoryWithConverter(IConverter converter) + public InMemoryRepository(IConverter converter) { _converter = converter; } diff --git a/src/LazyStorage/InMemory/InMemoryStorage.cs b/src/LazyStorage/InMemory/InMemoryStorage.cs index bd897e0..fc3d579 100644 --- a/src/LazyStorage/InMemory/InMemoryStorage.cs +++ b/src/LazyStorage/InMemory/InMemoryStorage.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using LazyStorage.Interfaces; -using LazyStorage.Xml; namespace LazyStorage.InMemory { @@ -13,18 +12,13 @@ public InMemoryStorage() _repos = new Dictionary(); } - public IRepository GetRepository() where T : IStorable, new() - { - return GetRepository(new StorableConverter()); - } - public IRepository GetRepository(IConverter converter) { var typeAsString = typeof(T).ToString(); if (!_repos.ContainsKey(typeAsString)) { - var inMemoryRepositoryWithConverter = new InMemoryRepositoryWithConverter(converter); + var inMemoryRepositoryWithConverter = new InMemoryRepository(converter); inMemoryRepositoryWithConverter.Load(); _repos.Add(typeAsString, inMemoryRepositoryWithConverter); } diff --git a/src/LazyStorage/Interfaces/IStorable.cs b/src/LazyStorage/Interfaces/IStorable.cs deleted file mode 100644 index f6cbd13..0000000 --- a/src/LazyStorage/Interfaces/IStorable.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace LazyStorage.Interfaces -{ - public interface IStorable : IEquatable where T : new() - { - int Id { get; set; } - Dictionary GetStorageInfo(); - void InitialiseWithStorageInfo(Dictionary info); - } -} \ No newline at end of file diff --git a/src/LazyStorage/Interfaces/IStorage.cs b/src/LazyStorage/Interfaces/IStorage.cs index 8898d07..9ef0890 100644 --- a/src/LazyStorage/Interfaces/IStorage.cs +++ b/src/LazyStorage/Interfaces/IStorage.cs @@ -2,7 +2,6 @@ { public interface IStorage { - IRepository GetRepository() where T : IStorable, new(); IRepository GetRepository(IConverter converter); void Save(); void Discard(); diff --git a/src/LazyStorage/Json/JsonRepositoryWithConverter.cs b/src/LazyStorage/Json/JsonRepository.cs similarity index 93% rename from src/LazyStorage/Json/JsonRepositoryWithConverter.cs rename to src/LazyStorage/Json/JsonRepository.cs index cb3679d..c2c39c6 100644 --- a/src/LazyStorage/Json/JsonRepositoryWithConverter.cs +++ b/src/LazyStorage/Json/JsonRepository.cs @@ -7,13 +7,13 @@ namespace LazyStorage.Json { - internal class JsonRepositoryWithConverter : IRepository + internal class JsonRepository : IRepository { private readonly string _uri; private List _repository = new List(); private readonly IConverter _converter; - public JsonRepositoryWithConverter(string storageFolder, IConverter converter) + public JsonRepository(string storageFolder, IConverter converter) { _uri = $"{storageFolder}{typeof(T)}.json"; _converter = converter; diff --git a/src/LazyStorage/Json/JsonStorage.cs b/src/LazyStorage/Json/JsonStorage.cs index bc5bab8..9bf3c17 100644 --- a/src/LazyStorage/Json/JsonStorage.cs +++ b/src/LazyStorage/Json/JsonStorage.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using LazyStorage.Interfaces; -using LazyStorage.Xml; namespace LazyStorage.Json { @@ -15,18 +14,13 @@ public JsonStorage(string storageFolder) _storageFolder = storageFolder; } - public IRepository GetRepository() where T : IStorable, new() - { - return GetRepository(new StorableConverter()); - } - public IRepository GetRepository(IConverter converter) { var typeAsString = typeof(T).ToString(); if (!_repos.ContainsKey(typeAsString)) { - var jsonRepositoryWithConverter = new JsonRepositoryWithConverter(_storageFolder, converter); + var jsonRepositoryWithConverter = new JsonRepository(_storageFolder, converter); jsonRepositoryWithConverter.Load(); _repos.Add(typeAsString, jsonRepositoryWithConverter); } diff --git a/src/LazyStorage/StorableConverter.cs b/src/LazyStorage/StorableConverter.cs deleted file mode 100644 index aaef83f..0000000 --- a/src/LazyStorage/StorableConverter.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using LazyStorage.Interfaces; - -namespace LazyStorage -{ - internal class StorableConverter : IConverter where T : IStorable, IEquatable, new() - { - public StorableObject GetStorableObject(T item) - { - return new StorableObject(item.GetStorageInfo()); - } - - public T GetOriginalObject(StorableObject info) - { - var item = new T(); - item.InitialiseWithStorageInfo(info.Info); - return item; - } - - public bool IsEqual(StorableObject storageObject, T realObject) - { - return GetOriginalObject(storageObject).Equals(realObject); - } - } -} \ No newline at end of file diff --git a/src/LazyStorage/StorableObject.cs b/src/LazyStorage/StorableObject.cs index 1e003be..d01d028 100644 --- a/src/LazyStorage/StorableObject.cs +++ b/src/LazyStorage/StorableObject.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Reflection; namespace LazyStorage { diff --git a/src/LazyStorage/Xml/XmlRepositoryWithConverter.cs b/src/LazyStorage/Xml/XmlRepository.cs similarity index 95% rename from src/LazyStorage/Xml/XmlRepositoryWithConverter.cs rename to src/LazyStorage/Xml/XmlRepository.cs index 5a01771..d82e5d6 100644 --- a/src/LazyStorage/Xml/XmlRepositoryWithConverter.cs +++ b/src/LazyStorage/Xml/XmlRepository.cs @@ -7,13 +7,13 @@ namespace LazyStorage.Xml { - internal class XmlRepositoryWithConverter : IRepository + internal class XmlRepository : IRepository { private readonly string _uri; private List _repository = new List(); private readonly IConverter _converter; - public XmlRepositoryWithConverter(string storageFolder, IConverter converter) + public XmlRepository(string storageFolder, IConverter converter) { _uri = $"{storageFolder}{typeof(T)}.xml"; _converter = converter; diff --git a/src/LazyStorage/Xml/XmlStorage.cs b/src/LazyStorage/Xml/XmlStorage.cs index 244a4d4..88b5069 100644 --- a/src/LazyStorage/Xml/XmlStorage.cs +++ b/src/LazyStorage/Xml/XmlStorage.cs @@ -14,19 +14,13 @@ public XmlStorage(string storageFolder) _repos = new Dictionary(); } - public IRepository GetRepository() where T : IStorable, new() - { - var storableConverter = new StorableConverter(); - return GetRepository(storableConverter); - } - public IRepository GetRepository(IConverter converter) { var typeAsString = typeof(T).ToString(); if (!_repos.ContainsKey(typeAsString)) { - var xmlRepositoryWithConverter = new XmlRepositoryWithConverter(_storageFolder, converter); + var xmlRepositoryWithConverter = new XmlRepository(_storageFolder, converter); xmlRepositoryWithConverter.Load(); _repos.Add(typeAsString, xmlRepositoryWithConverter); }