public void AddEntityThenDeleteFromDisk()
        {
            // Create test entity
            using (var testRepository = new DurableMemoryRepository <EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                var entity = testRepository.Create();
                entity.Contents = new EntityTest {
                    Name = "foo", Number = 1
                };
                testRepository.Add(entity);
                testRepository.Save();
            }

            // Read the new entity from disk, then delete it and save
            using (var testRepository = new DurableMemoryRepository <EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                var entityFromRepo = testRepository.Entities.FirstOrDefault(x => x.Contents.Name == "foo");
                Assert.IsNotNull(entityFromRepo);
                testRepository.Delete(entityFromRepo);
                testRepository.Save();
            }

            // After re-initializing the repo, the deleted item should be gone, but everything else should still be present
            using (var testRepository = new DurableMemoryRepository <EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                var entityFromRepo = testRepository.Entities.FirstOrDefault(x => x.Contents.Name == "foo");
                Assert.IsNull(entityFromRepo);
                CollectionAssert.AreEquivalent(new[] { 1, 2, 4 }, testRepository.Entities.Select(x => x.Id).ToArray());
            }
        }
        public void AddSameItemMoreThanOnce()
        {
            using (var testRepository = new DurableMemoryRepository <EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                var entity = testRepository.Create();
                testRepository.Add(entity);
                testRepository.Add(entity);
                testRepository.Save();
                CollectionAssert.AreEquivalent(new[] { 1, 2, 4, 5 }, testRepository.Entities.Select(x => x.Id).ToArray());
            }

            using (var testRepository = new DurableMemoryRepository <EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                CollectionAssert.AreEquivalent(new[] { 1, 2, 4, 5 }, testRepository.Entities.Select(x => x.Id).ToArray());
            }
        }
        public void AddEntityAndRetrieveFromDisk()
        {
            // Create test entity and write it to the mock filesystem
            IJsonEntity <EntityTest> entity;
            IJsonEntity <EntityTest> entityFromRepo;

            using (var testRepository = new DurableMemoryRepository <EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                entity          = testRepository.Create();
                entity.Contents = new EntityTest {
                    Name = "foo", Number = 1
                };
                testRepository.Add(entity);
                testRepository.Save();
            }

            // Now re-create the repo, which should read the persisted value for the new entity from "disk"
            using (var testRepository = new DurableMemoryRepository <EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                entityFromRepo = testRepository.Entities.FirstOrDefault(x => x.Contents.Name == "foo");
            }

            Assert.IsNotNull(entityFromRepo);
            Assert.AreEqual(entity.Id, entityFromRepo.Id);
            Assert.AreEqual(entity.Contents.Name, entityFromRepo.Contents.Name);
            Assert.AreEqual(entity.Contents.Number, entityFromRepo.Contents.Number);
        }
        public void DataReadFromRepoIsDisconnectedFromSession()
        {
            using (var testRepository = new DurableMemoryRepository <EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                var collection1 = testRepository.Entities.Where(x => new[] { 1, 2 }.Contains(x.Id)).ToArray();
                testRepository.Delete(collection1[0]);
                testRepository.Delete(collection1[1]);
                var collection2 = testRepository.Entities.Where(x => new[] { 1, 2 }.Contains(x.Id)).ToArray();
                CollectionAssert.AreEquivalent(new[] { 1, 2 }, collection1.Select(x => x.Id).ToArray());
                CollectionAssert.AreEquivalent(new int[] {}, collection2.Select(x => x.Id).ToArray());
            }

            using (var testRepository = new DurableMemoryRepository <EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                var collection1 = testRepository.Entities.ToArray();
                var entity1     = testRepository.Create();
                var entity2     = testRepository.Create();
                testRepository.Add(entity1);
                testRepository.Add(entity2);
                var collection2 = testRepository.Entities.ToArray();

                CollectionAssert.AreEquivalent(new[] { 1, 2, 4 }, collection1.Select(x => x.Id).ToArray());
                CollectionAssert.AreEquivalent(new[] { 1, 2, 4, 5, 6 }, collection2.Select(x => x.Id).ToArray());
            }

            using (var testRepository = new DurableMemoryRepository <EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                var    collection1    = testRepository.Entities.ToArray();
                var    entity         = collection1[0];
                string originalName   = entity.Contents.Name;
                int    originalNumber = entity.Contents.Number;
                entity.Contents.Name   = "foo";
                entity.Contents.Number = -1;
                testRepository.Update(entity);
                var collection2 = testRepository.Entities.ToArray();

                Assert.AreNotEqual(originalName, collection2[0].Contents.Name);
                Assert.AreNotEqual(originalNumber, collection2[0].Contents.Number);
            }
        }
        public void AddEntityThenDeleteFromMemory()
        {
            using (var testRepository = new DurableMemoryRepository <EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                IJsonEntity <EntityTest> entity = testRepository.Create();
                entity.Contents = new EntityTest {
                    Name = "foo", Number = 1
                };
                testRepository.Add(entity);

                IJsonEntity <EntityTest> entityFromRepo = testRepository.Entities.FirstOrDefault(x => x.Contents.Name == "foo");
                Assert.IsNotNull(entityFromRepo);

                testRepository.Delete(entity);

                entityFromRepo = testRepository.Entities.FirstOrDefault(x => x.Contents.Name == "foo");
                Assert.IsNull(entityFromRepo);
            }
        }
        public void AddEntityAndRetrieveFromMemory()
        {
            IJsonEntity <EntityTest> entity;
            IJsonEntity <EntityTest> entityFromRepo;

            using (var testRepository = new DurableMemoryRepository <EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                entity          = testRepository.Create();
                entity.Contents = new EntityTest {
                    Name = "foo", Number = 1
                };
                testRepository.Add(entity);
                entityFromRepo = testRepository.Entities.FirstOrDefault(x => x.Contents.Name == "foo");
            }

            Assert.IsNotNull(entityFromRepo);
            Assert.AreEqual(entity.Id, entityFromRepo.Id);
            Assert.AreEqual(entity.Contents.Name, entityFromRepo.Contents.Name);
            Assert.AreEqual(entity.Contents.Number, entityFromRepo.Contents.Number);
        }
        public void AddNullEntity()
        {
            var testRepository = new DurableMemoryRepository <EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object);

            testRepository.Add(null);
        }
        public void DataReadFromRepoIsDisconnectedFromSession()
        {
            using (var testRepository = new DurableMemoryRepository<EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                var collection1 = testRepository.Entities.Where(x => new[]{1, 2}.Contains(x.Id)).ToArray();
                testRepository.Delete(collection1[0]);
                testRepository.Delete(collection1[1]);
                var collection2 = testRepository.Entities.Where(x => new[] { 1, 2 }.Contains(x.Id)).ToArray();
                CollectionAssert.AreEquivalent(new[] { 1, 2 }, collection1.Select(x => x.Id).ToArray());
                CollectionAssert.AreEquivalent(new int[] {}, collection2.Select(x => x.Id).ToArray());
            }

            using (var testRepository = new DurableMemoryRepository<EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                var collection1 = testRepository.Entities.ToArray();
                var entity1 = testRepository.Create();
                var entity2 = testRepository.Create();
                testRepository.Add(entity1);
                testRepository.Add(entity2);
                var collection2 = testRepository.Entities.ToArray();
                
                CollectionAssert.AreEquivalent(new[] { 1, 2, 4 }, collection1.Select(x => x.Id).ToArray());
                CollectionAssert.AreEquivalent(new[] { 1, 2, 4, 5, 6 }, collection2.Select(x => x.Id).ToArray());
            }

            using (var testRepository = new DurableMemoryRepository<EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                var collection1 = testRepository.Entities.ToArray();
                var entity = collection1[0];
                string originalName = entity.Contents.Name;
                int originalNumber = entity.Contents.Number;
                entity.Contents.Name = "foo";
                entity.Contents.Number = -1;
                testRepository.Update(entity);
                var collection2 = testRepository.Entities.ToArray();

                Assert.AreNotEqual(originalName, collection2[0].Contents.Name);
                Assert.AreNotEqual(originalNumber, collection2[0].Contents.Number);
            }
        }
 public void AddNullEntity()
 {
     var testRepository = new DurableMemoryRepository<EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object);
     testRepository.Add(null);
 }
        public void AddAndDeleteTheSameItemMultipleTimesInASession()
        {
            using (var testRepository = new DurableMemoryRepository<EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                var entity = testRepository.Create();
                testRepository.Add(entity);
                testRepository.Delete(entity);
                testRepository.Add(entity);
                testRepository.Delete(entity);
                testRepository.Add(entity);
                testRepository.Delete(entity);
                testRepository.Add(entity);
                testRepository.Add(entity);
                testRepository.Delete(entity);
                testRepository.Delete(entity);
                testRepository.Save();
                CollectionAssert.AreEquivalent(new[] { 1, 2, 4 }, testRepository.Entities.Select(x => x.Id).ToArray());
            }

            using (var testRepository = new DurableMemoryRepository<EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                CollectionAssert.AreEquivalent(new[] { 1, 2, 4 }, testRepository.Entities.Select(x => x.Id).ToArray());
            }
        }
        public void AddEntityThenDeleteFromDisk()
        {
            // Create test entity
            using (var testRepository = new DurableMemoryRepository<EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                var entity = testRepository.Create();
                entity.Contents = new EntityTest { Name = "foo", Number = 1 };
                testRepository.Add(entity);
                testRepository.Save();
            }
            
            // Read the new entity from disk, then delete it and save
            using (var testRepository = new DurableMemoryRepository<EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                var entityFromRepo = testRepository.Entities.FirstOrDefault(x => x.Contents.Name == "foo");
                Assert.IsNotNull(entityFromRepo);
                testRepository.Delete(entityFromRepo);
                testRepository.Save();
            }

            // After re-initializing the repo, the deleted item should be gone, but everything else should still be present
            using (var testRepository = new DurableMemoryRepository<EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                var entityFromRepo = testRepository.Entities.FirstOrDefault(x => x.Contents.Name == "foo");
                Assert.IsNull(entityFromRepo);
                CollectionAssert.AreEquivalent(new[] { 1, 2, 4 }, testRepository.Entities.Select(x => x.Id).ToArray());
            }
        }
        public void AddEntityThenDeleteFromMemory()
        {
            using (var testRepository = new DurableMemoryRepository<EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                IJsonEntity<EntityTest> entity = testRepository.Create();
                entity.Contents = new EntityTest { Name = "foo", Number = 1 };
                testRepository.Add(entity);

                IJsonEntity<EntityTest> entityFromRepo = testRepository.Entities.FirstOrDefault(x => x.Contents.Name == "foo");
                Assert.IsNotNull(entityFromRepo);

                testRepository.Delete(entity);

                entityFromRepo = testRepository.Entities.FirstOrDefault(x => x.Contents.Name == "foo");
                Assert.IsNull(entityFromRepo);
            }
        }
        public void AddEntityAndRetrieveFromDisk()
        {
            // Create test entity and write it to the mock filesystem
            IJsonEntity<EntityTest> entity;
            IJsonEntity<EntityTest> entityFromRepo;
            using (var testRepository = new DurableMemoryRepository<EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                entity = testRepository.Create();
                entity.Contents = new EntityTest {Name = "foo", Number = 1};
                testRepository.Add(entity);
                testRepository.Save();
            }

            // Now re-create the repo, which should read the persisted value for the new entity from "disk"
            using (var testRepository = new DurableMemoryRepository<EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                entityFromRepo = testRepository.Entities.FirstOrDefault(x => x.Contents.Name == "foo");
            }

            Assert.IsNotNull(entityFromRepo);
            Assert.AreEqual(entity.Id, entityFromRepo.Id);
            Assert.AreEqual(entity.Contents.Name, entityFromRepo.Contents.Name);
            Assert.AreEqual(entity.Contents.Number, entityFromRepo.Contents.Number);
        }
        public void AddEntityAndRetrieveFromMemory()
        {
            IJsonEntity<EntityTest> entity;
            IJsonEntity<EntityTest> entityFromRepo;
            using (var testRepository = new DurableMemoryRepository<EntityTest>(MockDataPath, _mockProvider.MockFileSystem.Object))
            {
                entity = testRepository.Create();
                entity.Contents = new EntityTest {Name = "foo", Number = 1};
                testRepository.Add(entity);
                entityFromRepo = testRepository.Entities.FirstOrDefault(x => x.Contents.Name == "foo");
            }

            Assert.IsNotNull(entityFromRepo);
            Assert.AreEqual(entity.Id, entityFromRepo.Id);
            Assert.AreEqual(entity.Contents.Name, entityFromRepo.Contents.Name);
            Assert.AreEqual(entity.Contents.Number, entityFromRepo.Contents.Number);
        }