// Copyright (C) Stichting Deltares 2016. All rights reserved. // // This file is part of Ringtoets. // // Ringtoets is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // All names, logos, and references to "Deltares" are registered trademarks of // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. using System; using System.Collections.Generic; using System.Linq; using Application.Ringtoets.Storage.DbContext; using Application.Ringtoets.Storage.Persistors; using Application.Ringtoets.Storage.TestUtil; using Core.Common.Base.Geometry; using NUnit.Framework; using Rhino.Mocks; using Ringtoets.Common.Data; using Ringtoets.Common.Data.AssessmentSection; namespace Application.Ringtoets.Storage.Test.Persistors { [TestFixture] public class ReferenceLinePersistorTest { [Test] public void Constructor_WithoutContext_ThrowsArgumentNullException() { // Call TestDelegate call = () => new ReferenceLinePersistor(null); // Assert var parameter = Assert.Throws(call).ParamName; Assert.AreEqual("ringtoetsEntities", parameter); } [Test] public void Constructor_WithContext_DoesNotThrow() { // Setup var mocks = new MockRepository(); var context = RingtoetsEntitiesHelper.Create(mocks); mocks.ReplayAll(); // Call TestDelegate call = () => new ReferenceLinePersistor(context); // Assert Assert.DoesNotThrow(call); mocks.VerifyAll(); } [Test] public void InsertModel_WithoutEntityCollection_ThrowsArgumentNullException() { // Setup var mocks = new MockRepository(); var context = RingtoetsEntitiesHelper.Create(mocks); mocks.ReplayAll(); var persistor = new ReferenceLinePersistor(context); // Call TestDelegate call = () => persistor.InsertModel(null, null); // Assert var parameter = Assert.Throws(call).ParamName; Assert.AreEqual("entityCollection", parameter); mocks.VerifyAll(); } [Test] public void InsertModel_WithEmptyEntityCollectionWithoutReferenceLine_NoChange() { // Setup var mocks = new MockRepository(); var context = RingtoetsEntitiesHelper.Create(mocks); var entities = new List(); mocks.ReplayAll(); var persistor = new ReferenceLinePersistor(context); // Call persistor.InsertModel(entities, null); // Assert mocks.VerifyAll(); } [Test] public void InsertModel_WithEmptyEntityCollectionWithReferenceLine_AddsNewEntitiesToContext() { // Setup var mocks = new MockRepository(); var context = RingtoetsEntitiesHelper.Create(mocks); var entities = new List(); mocks.ReplayAll(); var persistor = new ReferenceLinePersistor(context); var referenceLine = new ReferenceLine(); referenceLine.SetGeometry(new[] { new Point2D(1, 1), new Point2D(3, 2), new Point2D(1, 3) }); // Call persistor.InsertModel(entities, referenceLine); // Assert AssertCreatedEntities(entities, referenceLine); mocks.VerifyAll(); } [Test] public void InsertModel_WithNonEmptyEntityCollectionWithReferenceLine_EntityCollectionClearedAddsNewEntitiesToContext() { // Setup var mocks = new MockRepository(); var context = RingtoetsEntitiesHelper.Create(mocks); mocks.ReplayAll(); var entities = new List(); for (int i = 0; i < 3; i++) { entities.Add(new ReferenceLinePointEntity { Order = i }); } context.ReferenceLinePointEntities.Add(entities[0]); context.ReferenceLinePointEntities.Add(entities[1]); context.ReferenceLinePointEntities.Add(new ReferenceLinePointEntity()); var persistor = new ReferenceLinePersistor(context); var referenceLine = new ReferenceLine(); referenceLine.SetGeometry(new[] { new Point2D(1, 1), new Point2D(3, 2), new Point2D(1, 3) }); // Call persistor.InsertModel(entities, referenceLine); // Assert AssertCreatedEntities(entities, referenceLine); Assert.AreEqual(1, context.ReferenceLinePointEntities.Count()); mocks.VerifyAll(); } [Test] public void InsertModel_EmptyCollectionNullReferenceLine_ShouldNotClearCollection() { // Setup var backingList = new List(); var mocks = new MockRepository(); var context = RingtoetsEntitiesHelper.Create(mocks); var entities = mocks.StrictMock>(); entities.Expect(e => e.GetEnumerator()).Return(backingList.GetEnumerator()); mocks.ReplayAll(); var persistor = new ReferenceLinePersistor(context); // Call persistor.InsertModel(entities, null); // Assert mocks.VerifyAll(); } [Test] public void InsertModel_EmptyCollectionReferenceLineWithPoint_ShouldAddPointsToCollection() { // Setup var entities = new List(); var referenceLine = new ReferenceLine(); Point2D point = new Point2D(1.2, 3.5); referenceLine.SetGeometry(new[] { point }); var mocks = new MockRepository(); var context = RingtoetsEntitiesHelper.Create(mocks); mocks.ReplayAll(); var persistor = new ReferenceLinePersistor(context); // Call persistor.InsertModel(entities, referenceLine); // Assert Assert.AreEqual(1, entities.Count); Assert.AreEqual(point.X, entities.First().X); Assert.AreEqual(point.Y, entities.First().Y); Assert.AreEqual(0, entities.First().Order); mocks.VerifyAll(); } [Test] public void InsertModel_CollectionWithPointReferenceLineWithPoint_DoesNotChangeCollection() { // Setup var referenceLinePointEntity = new ReferenceLinePointEntity { X = 0, Y = 0, Order = 0 }; var entities = new List(new[] { referenceLinePointEntity }); var referenceLine = new ReferenceLine(); Point2D point = new Point2D(0, 0); referenceLine.SetGeometry(new[] { point }); var mocks = new MockRepository(); var context = RingtoetsEntitiesHelper.Create(mocks); mocks.ReplayAll(); var persistor = new ReferenceLinePersistor(context); // Call persistor.InsertModel(entities, referenceLine); // Assert Assert.AreEqual(new[] { referenceLinePointEntity }, entities); mocks.VerifyAll(); } [Test] public void InsertModel_CollectionWithPointReferenceLineNull_ClearsCollection() { // Setup var referenceLinePointEntity = new ReferenceLinePointEntity { X = 0, Y = 0, Order = 0 }; var entities = new List(new[] { referenceLinePointEntity }); var mocks = new MockRepository(); var context = RingtoetsEntitiesHelper.Create(mocks); mocks.ReplayAll(); var persistor = new ReferenceLinePersistor(context); // Call persistor.InsertModel(entities, null); // Assert Assert.AreEqual(0, entities.Count); mocks.VerifyAll(); } [Test] public void LoadModel_WithoutEntityCollection_ThrowsArgumentNullException() { // Setup var mocks = new MockRepository(); var context = RingtoetsEntitiesHelper.Create(mocks); mocks.ReplayAll(); var persistor = new ReferenceLinePersistor(context); // Call TestDelegate call = () => persistor.LoadModel(null); // Assert var parameter = Assert.Throws(call).ParamName; Assert.AreEqual("entityCollection", parameter); mocks.VerifyAll(); } [Test] public void LoadModel_EmptyEntityCollection_ReturnsNull() { // Setup var mocks = new MockRepository(); var context = RingtoetsEntitiesHelper.Create(mocks); mocks.ReplayAll(); var entities = new List(); var persistor = new ReferenceLinePersistor(context); // Call var referenceLine = persistor.LoadModel(entities); // Assert Assert.IsNull(referenceLine); mocks.VerifyAll(); } [Test] public void LoadModel_EntityCollectionWithOrderedElements_ReturnsEqualReferenceLineInstance() { // Setup var mocks = new MockRepository(); var context = RingtoetsEntitiesHelper.Create(mocks); mocks.ReplayAll(); var entities = new List { new ReferenceLinePointEntity { Order = 0, X = 1, Y = 2 }, new ReferenceLinePointEntity { Order = 1, X = 3, Y = 2 }, new ReferenceLinePointEntity { Order = 2, X = 5, Y = 3 } }; var persistor = new ReferenceLinePersistor(context); // Call var referenceLine = persistor.LoadModel(entities); // Assert AssertCreatedReferenceLine(referenceLine, entities); mocks.VerifyAll(); } [Test] public void LoadModel_EntityCollectionWithUnorderedElements_ReturnsEqualReferenceLineInstance() { // Setup var mocks = new MockRepository(); var context = RingtoetsEntitiesHelper.Create(mocks); mocks.ReplayAll(); var entities = new List { new ReferenceLinePointEntity { Order = 0, X = 1, Y = 2 }, new ReferenceLinePointEntity { Order = 2, X = 5, Y = 3 }, new ReferenceLinePointEntity { Order = 1, X = 3, Y = 2 } }; var persistor = new ReferenceLinePersistor(context); // Call var referenceLine = persistor.LoadModel(entities); // Assert AssertCreatedReferenceLine(referenceLine, entities); mocks.VerifyAll(); } private void AssertCreatedEntities(IList entities, ReferenceLine referenceLine) { Assert.AreEqual(entities.Count, referenceLine.Points.Count()); for (int i = 0; i < entities.Count; i++) { var entity = entities[i]; var point = referenceLine.Points.ElementAt(i); Assert.AreEqual(point.X, entity.X); Assert.AreEqual(referenceLine.Points.ElementAt(i).Y, entity.Y); Assert.AreEqual(i, entity.Order); Assert.AreEqual(0, entity.ReferenceLinePointEntityId); } } private void AssertCreatedReferenceLine(ReferenceLine referenceLine, List entities) { Assert.AreEqual(entities.Count, referenceLine.Points.Count()); for (int i = 0; i < referenceLine.Points.Count(); i++) { var point = referenceLine.Points.ElementAt(i); var entity = entities.First(e => e.Order == i); Assert.AreEqual(entity.X, point.X); Assert.AreEqual(entity.Y, point.Y); } } } }