// 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.Linq;
using Application.Ringtoets.Storage.Create;
using Application.Ringtoets.Storage.DbContext;
using Application.Ringtoets.Storage.Exceptions;
using Application.Ringtoets.Storage.TestUtil;
using Application.Ringtoets.Storage.Update;
using Core.Common.Base.Geometry;
using NUnit.Framework;
using Rhino.Mocks;
using Ringtoets.Piping.Primitives;
namespace Application.Ringtoets.Storage.Test.Update
{
[TestFixture]
public class RingtoetsPipingSurfaceLineUpdateExtensionsTest
{
[Test]
public void Update_UpdateConversionCollectorIsNull_ThrowArgumentNullException()
{
// Setup
var mocks = new MockRepository();
IRingtoetsEntities context = RingtoetsEntitiesHelper.Create(mocks);
mocks.ReplayAll();
RingtoetsPipingSurfaceLine surfaceLine = CreateSavedSurfaceLineWithData();
// Call
TestDelegate call = () => surfaceLine.Update(null, context);
// Assert
string paramName = Assert.Throws(call).ParamName;
Assert.AreEqual("collector", paramName);
mocks.VerifyAll();
}
[Test]
public void Update_RingtoetsEntitiesIsNull_ThrowArgumentNullException()
{
// Setup
var collector = new PersistenceRegistry();
RingtoetsPipingSurfaceLine surfaceLine = CreateSavedSurfaceLineWithData();
// Call
TestDelegate call = () => surfaceLine.Update(collector, null);
// Assert
string paramName = Assert.Throws(call).ParamName;
Assert.AreEqual("context", paramName);
}
[Test]
public void Update_SurfaceLineNotSaved_ThrowEntityNotFoundException()
{
// Setup
var mocks = new MockRepository();
var context = RingtoetsEntitiesHelper.Create(mocks);
mocks.ReplayAll();
var collector = new PersistenceRegistry();
var surfaceLine = new RingtoetsPipingSurfaceLine();
// Precondition
const long unsavedObjectId = 0;
Assert.AreEqual(unsavedObjectId, surfaceLine.StorageId);
// Call
TestDelegate call = () => surfaceLine.Update(collector, context);
// Assert
var expectedMessage = String.Format("Het object 'SurfaceLineEntity' met id '{0}' is niet gevonden.", unsavedObjectId);
EntityNotFoundException exception = Assert.Throws(call);
Assert.AreEqual(expectedMessage, exception.Message);
mocks.VerifyAll();
}
[Test]
public void Update_SurfaceLineWithoutGeometry_SurfaceLineEntityUpdated()
{
// Setup
var mocks = new MockRepository();
var context = RingtoetsEntitiesHelper.Create(mocks);
mocks.ReplayAll();
RingtoetsPipingSurfaceLine surfaceLine = CreateSavedSurfaceLineWithoutGeometry();
var entity = new SurfaceLineEntity
{
SurfaceLineEntityId = surfaceLine.StorageId,
Name = "",
ReferenceLineIntersectionX = 9876.5432m,
ReferenceLineIntersectionY = 9182.8374m
};
context.SurfaceLineEntities.Add(entity);
var collector = new PersistenceRegistry();
// Call
surfaceLine.Update(collector, context);
// Assert
Assert.AreEqual(surfaceLine.Name, entity.Name);
Assert.AreEqual(surfaceLine.ReferenceLineIntersectionWorldPoint.X, entity.ReferenceLineIntersectionX);
Assert.AreEqual(surfaceLine.ReferenceLineIntersectionWorldPoint.Y, entity.ReferenceLineIntersectionY);
CollectionAssert.IsEmpty(entity.SurfaceLinePointEntities);
CollectionAssert.IsEmpty(context.SurfaceLinePointEntities);
mocks.VerifyAll();
}
[Test]
public void Update_SurfaceLineWithNewGeometry_SurfaceLineEntityUpdatedAndGeometrySaved()
{
// Setup
var mocks = new MockRepository();
var context = RingtoetsEntitiesHelper.Create(mocks);
mocks.ReplayAll();
RingtoetsPipingSurfaceLine surfaceLine = CreateSavedSurfaceLineWithGeometry();
var entity = new SurfaceLineEntity
{
SurfaceLineEntityId = surfaceLine.StorageId,
Name = "",
ReferenceLineIntersectionX = 91.28m,
ReferenceLineIntersectionY = 37.46m
};
context.SurfaceLineEntities.Add(entity);
// Precondition
CollectionAssert.IsEmpty(context.SurfaceLinePointEntities);
var collector = new PersistenceRegistry();
// Call
surfaceLine.Update(collector, context);
// Assert
Assert.AreEqual(surfaceLine.Name, entity.Name);
Assert.AreEqual(surfaceLine.ReferenceLineIntersectionWorldPoint.X, entity.ReferenceLineIntersectionX);
Assert.AreEqual(surfaceLine.ReferenceLineIntersectionWorldPoint.Y, entity.ReferenceLineIntersectionY);
Assert.AreEqual(surfaceLine.Points.Length, entity.SurfaceLinePointEntities.Count);
for (int i = 0; i < surfaceLine.Points.Length; i++)
{
Point3D geometryPoint = surfaceLine.Points[i];
SurfaceLinePointEntity pointEntity = entity.SurfaceLinePointEntities.ElementAt(i);
Assert.AreEqual(geometryPoint.X, pointEntity.X);
Assert.AreEqual(geometryPoint.Y, pointEntity.Y);
Assert.AreEqual(geometryPoint.Z, pointEntity.Z);
}
mocks.VerifyAll();
}
[Test]
public void Update_SurfaceLineWithUpdatedGeometry_SurfaceLineEntityUpdatedAndGeometryChanged()
{
// Setup
var mocks = new MockRepository();
var context = RingtoetsEntitiesHelper.Create(mocks);
mocks.ReplayAll();
RingtoetsPipingSurfaceLine surfaceLine = CreateSavedSurfaceLineWithGeometry();
var pointEntity1 = new SurfaceLinePointEntity
{
SurfaceLinePointEntityId = 1,
Order = 0,
X = 1.0m,
Y = 2.0m,
Z = 3.0m
};
var pointEntity2 = new SurfaceLinePointEntity
{
SurfaceLinePointEntityId = 2,
Order = 1,
X = 5.0m,
Y = 2.0m,
Z = 4.0m
};
var entity = new SurfaceLineEntity
{
SurfaceLineEntityId = surfaceLine.StorageId,
Name = "",
ReferenceLineIntersectionX = 91.28m,
ReferenceLineIntersectionY = 37.46m,
SurfaceLinePointEntities =
{
pointEntity1,
pointEntity2
}
};
context.SurfaceLineEntities.Add(entity);
context.SurfaceLinePointEntities.Add(pointEntity1);
context.SurfaceLinePointEntities.Add(pointEntity2);
var collector = new PersistenceRegistry();
// Call
surfaceLine.Update(collector, context);
// Assert
Assert.AreEqual(surfaceLine.Name, entity.Name);
Assert.AreEqual(surfaceLine.ReferenceLineIntersectionWorldPoint.X, entity.ReferenceLineIntersectionX);
Assert.AreEqual(surfaceLine.ReferenceLineIntersectionWorldPoint.Y, entity.ReferenceLineIntersectionY);
Assert.AreEqual(surfaceLine.Points.Length, entity.SurfaceLinePointEntities.Count);
for (int i = 0; i < surfaceLine.Points.Length; i++)
{
Point3D geometryPoint = surfaceLine.Points[i];
SurfaceLinePointEntity pointEntity = entity.SurfaceLinePointEntities.ElementAt(i);
Assert.AreEqual(geometryPoint.X, pointEntity.X);
Assert.AreEqual(geometryPoint.Y, pointEntity.Y);
Assert.AreEqual(geometryPoint.Z, pointEntity.Z);
}
mocks.VerifyAll();
}
[Test]
public void Update_SurfaceLineIdenticalGeometry_SurfaceLineEntityUpdatedAndGeometrySaved()
{
// Setup
var mocks = new MockRepository();
var context = RingtoetsEntitiesHelper.Create(mocks);
mocks.ReplayAll();
RingtoetsPipingSurfaceLine surfaceLine = CreateSavedSurfaceLineWithGeometry();
var entity = new SurfaceLineEntity
{
SurfaceLineEntityId = surfaceLine.StorageId
};
context.SurfaceLineEntities.Add(entity);
var createCollector = new PersistenceRegistry();
for (int i = 0; i < surfaceLine.Points.Length; i++)
{
var geometryPoint = surfaceLine.Points[i];
SurfaceLinePointEntity pointEntity = geometryPoint.CreateSurfaceLinePoint(createCollector, i);
geometryPoint.StorageId = i + 1;
pointEntity.SurfaceLinePointEntityId = geometryPoint.StorageId;
entity.SurfaceLinePointEntities.Add(pointEntity);
context.SurfaceLinePointEntities.Add(pointEntity);
}
var updateCollector = new PersistenceRegistry();
// Call
surfaceLine.Update(updateCollector, context);
// Assert
Assert.AreEqual(surfaceLine.Points.Length, entity.SurfaceLinePointEntities.Count);
for (int i = 0; i < surfaceLine.Points.Length; i++)
{
Point3D geometryPoint = surfaceLine.Points[i];
SurfaceLinePointEntity pointEntity = entity.SurfaceLinePointEntities.ElementAt(i);
Assert.AreEqual(geometryPoint.X, pointEntity.X);
Assert.AreEqual(geometryPoint.Y, pointEntity.Y);
Assert.AreEqual(geometryPoint.Z, pointEntity.Z);
Assert.AreEqual(geometryPoint.StorageId, pointEntity.SurfaceLinePointEntityId);
}
mocks.VerifyAll();
}
[Test]
public void Update_SurfaceLineWithNewGeometryAndCharacteristicPoints_SurfaceLineEntityUpdatedAndGeometryPlusCharacteristicPointsSaved()
{
// Setup
var mocks = new MockRepository();
var context = RingtoetsEntitiesHelper.Create(mocks);
mocks.ReplayAll();
RingtoetsPipingSurfaceLine surfaceLine = CreateSavedSurfaceLineWithData();
var entity = new SurfaceLineEntity
{
SurfaceLineEntityId = surfaceLine.StorageId
};
context.SurfaceLineEntities.Add(entity);
var collector = new PersistenceRegistry();
// Call
surfaceLine.Update(collector, context);
// Assert
Assert.AreEqual(surfaceLine.Points.Length, entity.SurfaceLinePointEntities.Count);
int dikeToeRiverIndex = GetGeometryPointIndexForCharacteristicPoint(surfaceLine, surfaceLine.DikeToeAtRiver);
int dikeToePolderIndex = GetGeometryPointIndexForCharacteristicPoint(surfaceLine, surfaceLine.DikeToeAtPolder);
int ditchDikeSideIndex = GetGeometryPointIndexForCharacteristicPoint(surfaceLine, surfaceLine.DitchDikeSide);
int bottomDitchDikeSideIndex = GetGeometryPointIndexForCharacteristicPoint(surfaceLine, surfaceLine.BottomDitchDikeSide);
int buttomDitchPolderSideIndex = GetGeometryPointIndexForCharacteristicPoint(surfaceLine, surfaceLine.BottomDitchPolderSide);
int ditchPolderSide = GetGeometryPointIndexForCharacteristicPoint(surfaceLine, surfaceLine.DitchPolderSide);
var surfaceLinePointEntities = entity.SurfaceLinePointEntities.OrderBy(pe => pe.Order).ToArray();
for (int i = 0; i < surfaceLine.Points.Length; i++)
{
Point3D geometryPoint = surfaceLine.Points[i];
SurfaceLinePointEntity pointEntity = surfaceLinePointEntities[i];
Assert.AreEqual(geometryPoint.X, pointEntity.X);
Assert.AreEqual(geometryPoint.Y, pointEntity.Y);
Assert.AreEqual(geometryPoint.Z, pointEntity.Z);
if (i == dikeToeRiverIndex)
{
Assert.AreEqual(surfaceLine.DikeToeAtRiver.X, pointEntity.X);
Assert.AreEqual(surfaceLine.DikeToeAtRiver.Y, pointEntity.Y);
Assert.AreEqual(surfaceLine.DikeToeAtRiver.Z, pointEntity.Z);
CollectionAssert.Contains(pointEntity.CharacteristicPointEntities.Select(cpe => cpe.CharacteristicPointType),
(short)CharacteristicPointType.DikeToeAtRiver);
}
if (i == dikeToePolderIndex)
{
Assert.AreEqual(surfaceLine.DikeToeAtPolder.X, pointEntity.X);
Assert.AreEqual(surfaceLine.DikeToeAtPolder.Y, pointEntity.Y);
Assert.AreEqual(surfaceLine.DikeToeAtPolder.Z, pointEntity.Z);
CollectionAssert.Contains(pointEntity.CharacteristicPointEntities.Select(cpe => cpe.CharacteristicPointType),
(short)CharacteristicPointType.DikeToeAtPolder);
}
if (i == ditchDikeSideIndex)
{
Assert.AreEqual(surfaceLine.DitchDikeSide.X, pointEntity.X);
Assert.AreEqual(surfaceLine.DitchDikeSide.Y, pointEntity.Y);
Assert.AreEqual(surfaceLine.DitchDikeSide.Z, pointEntity.Z);
CollectionAssert.Contains(pointEntity.CharacteristicPointEntities.Select(cpe => cpe.CharacteristicPointType),
(short)CharacteristicPointType.DitchDikeSide);
}
if (i == bottomDitchDikeSideIndex)
{
Assert.AreEqual(surfaceLine.BottomDitchDikeSide.X, pointEntity.X);
Assert.AreEqual(surfaceLine.BottomDitchDikeSide.Y, pointEntity.Y);
Assert.AreEqual(surfaceLine.BottomDitchDikeSide.Z, pointEntity.Z);
CollectionAssert.Contains(pointEntity.CharacteristicPointEntities.Select(cpe => cpe.CharacteristicPointType),
(short)CharacteristicPointType.BottomDitchDikeSide);
}
if (i == buttomDitchPolderSideIndex)
{
Assert.AreEqual(surfaceLine.BottomDitchPolderSide.X, pointEntity.X);
Assert.AreEqual(surfaceLine.BottomDitchPolderSide.Y, pointEntity.Y);
Assert.AreEqual(surfaceLine.BottomDitchPolderSide.Z, pointEntity.Z);
CollectionAssert.Contains(pointEntity.CharacteristicPointEntities.Select(cpe => cpe.CharacteristicPointType),
(short)CharacteristicPointType.BottomDitchPolderSide);
}
if (i == ditchPolderSide)
{
Assert.AreEqual(surfaceLine.DitchPolderSide.X, pointEntity.X);
Assert.AreEqual(surfaceLine.DitchPolderSide.Y, pointEntity.Y);
Assert.AreEqual(surfaceLine.DitchPolderSide.Z, pointEntity.Z);
CollectionAssert.Contains(pointEntity.CharacteristicPointEntities.Select(cpe => cpe.CharacteristicPointType),
(short)CharacteristicPointType.DitchPolderSide);
}
}
mocks.VerifyAll();
}
[Test]
[TestCase(CharacteristicPointType.BottomDitchDikeSide)]
[TestCase(CharacteristicPointType.BottomDitchPolderSide)]
[TestCase(CharacteristicPointType.DikeToeAtPolder)]
[TestCase(CharacteristicPointType.DikeToeAtRiver)]
[TestCase(CharacteristicPointType.DitchDikeSide)]
[TestCase(CharacteristicPointType.DitchPolderSide)]
public void Update_SurfaceLineRemovedCharacteristicPoint_CharacteristicPointEntityRemoved(CharacteristicPointType type)
{
// Setup
var mocks = new MockRepository();
var context = RingtoetsEntitiesHelper.Create(mocks);
mocks.ReplayAll();
RingtoetsPipingSurfaceLine surfaceLine = CreateSavedSurfaceLineWithGeometry();
int index = 0;
var surfaceLinePointEntities = surfaceLine.Points.Select(p => new SurfaceLinePointEntity
{
SurfaceLinePointEntityId = p.StorageId,
Order = index++,
X = Convert.ToDecimal(p.X),
Y = Convert.ToDecimal(p.Y),
Z = Convert.ToDecimal(p.Z),
}).ToArray();
var characteristicPointEntity = new CharacteristicPointEntity
{
CharacteristicPointEntityId = 1,
CharacteristicPointType = (short)type,
SurfaceLinePointEntity = surfaceLinePointEntities[0]
};
surfaceLinePointEntities[0].CharacteristicPointEntities.Add(characteristicPointEntity);
var entity = new SurfaceLineEntity
{
SurfaceLineEntityId = surfaceLine.StorageId,
};
foreach (SurfaceLinePointEntity pointEntity in surfaceLinePointEntities)
{
entity.SurfaceLinePointEntities.Add(pointEntity);
context.SurfaceLinePointEntities.Add(pointEntity);
}
context.SurfaceLineEntities.Add(entity);
context.CharacteristicPointEntities.Add(characteristicPointEntity);
var collector = new PersistenceRegistry();
// Call
surfaceLine.Update(collector, context);
// Assert
Assert.IsNull(characteristicPointEntity.SurfaceLinePointEntity);
mocks.VerifyAll();
}
[Test]
public void Update_SurfaceLineWithChangedCharacteristicPoints_CharacteristicPointEntitiesUpdated()
{
// Setup
var mocks = new MockRepository();
var context = RingtoetsEntitiesHelper.Create(mocks);
mocks.ReplayAll();
RingtoetsPipingSurfaceLine surfaceLine = CreateSavedSurfaceLineWithData();
int index = 0;
var surfaceLinePointEntities = surfaceLine.Points.Select(p => new SurfaceLinePointEntity
{
SurfaceLinePointEntityId = p.StorageId,
Order = index++,
X = Convert.ToDecimal(p.X),
Y = Convert.ToDecimal(p.Y),
Z = Convert.ToDecimal(p.Z),
}).ToArray();
SurfaceLinePointEntity originalGeometryPointMarkedCharacteristic = surfaceLinePointEntities[1];
var characteristicPointEntities = CreateCharacteristicPointEntities(surfaceLine, originalGeometryPointMarkedCharacteristic);
var entity = new SurfaceLineEntity
{
SurfaceLineEntityId = surfaceLine.StorageId
};
foreach (SurfaceLinePointEntity pointEntity in surfaceLinePointEntities)
{
entity.SurfaceLinePointEntities.Add(pointEntity);
context.SurfaceLinePointEntities.Add(pointEntity);
}
foreach (CharacteristicPointEntity characteristicPointEntity in characteristicPointEntities)
{
characteristicPointEntity.SurfaceLinePointEntity.CharacteristicPointEntities.Add(characteristicPointEntity);
context.CharacteristicPointEntities.Add(characteristicPointEntity);
}
context.SurfaceLineEntities.Add(entity);
var collector = new PersistenceRegistry();
// Call
surfaceLine.Update(collector, context);
// Assert
foreach (CharacteristicPointEntity characteristicPointEntity in characteristicPointEntities)
{
Assert.AreNotEqual(originalGeometryPointMarkedCharacteristic, characteristicPointEntity.SurfaceLinePointEntity);
}
mocks.VerifyAll();
}
private CharacteristicPointEntity[] CreateCharacteristicPointEntities(RingtoetsPipingSurfaceLine surfaceLine, SurfaceLinePointEntity pointEntity)
{
var characteristicPointEntities = new CharacteristicPointEntity[6];
characteristicPointEntities[0] = new CharacteristicPointEntity
{
CharacteristicPointEntityId = 1,
CharacteristicPointType = (short)CharacteristicPointType.DikeToeAtRiver,
SurfaceLinePointEntity = pointEntity
};
characteristicPointEntities[1] = new CharacteristicPointEntity
{
CharacteristicPointEntityId = 2,
CharacteristicPointType = (short)CharacteristicPointType.DikeToeAtPolder,
SurfaceLinePointEntity = pointEntity
};
characteristicPointEntities[2] = new CharacteristicPointEntity
{
CharacteristicPointEntityId = 3,
CharacteristicPointType = (short)CharacteristicPointType.DitchDikeSide,
SurfaceLinePointEntity = pointEntity
};
characteristicPointEntities[3] = new CharacteristicPointEntity
{
CharacteristicPointEntityId = 4,
CharacteristicPointType = (short)CharacteristicPointType.BottomDitchDikeSide,
SurfaceLinePointEntity = pointEntity
};
characteristicPointEntities[4] = new CharacteristicPointEntity
{
CharacteristicPointEntityId = 5,
CharacteristicPointType = (short)CharacteristicPointType.BottomDitchPolderSide,
SurfaceLinePointEntity = pointEntity
};
characteristicPointEntities[5] = new CharacteristicPointEntity
{
CharacteristicPointEntityId = 6,
CharacteristicPointType = (short)CharacteristicPointType.DitchPolderSide,
SurfaceLinePointEntity = pointEntity
};
return characteristicPointEntities;
}
private static int GetGeometryPointIndexForCharacteristicPoint(RingtoetsPipingSurfaceLine surfaceLine, Point3D characteristicPoint)
{
int index = -1;
for (int i = 0; i < surfaceLine.Points.Length; i++)
{
if (surfaceLine.Points[i].Equals(characteristicPoint))
{
return i;
}
}
return index;
}
private static RingtoetsPipingSurfaceLine CreateSavedSurfaceLineWithGeometry()
{
var geometryPoints = new[]
{
new Point3D(1.1, 2.2, 3.3)
{
StorageId = 38472
},
new Point3D(4.4, 5.5, 6.6)
{
StorageId = 4095
}
};
var surfaceLine = new RingtoetsPipingSurfaceLine
{
StorageId = 14843246,
Name = "",
ReferenceLineIntersectionWorldPoint = new Point2D(08.05, 20.16)
};
surfaceLine.SetGeometry(geometryPoints);
return surfaceLine;
}
private static RingtoetsPipingSurfaceLine CreateSavedSurfaceLineWithData()
{
var geometryPoints = new[]
{
new Point3D(1.1, 2.2, 3.3)
{
StorageId = 340985
},
new Point3D(4.4, 5.5, 6.6)
{
StorageId = 4058
},
new Point3D(7.7, 8.8, 9.9)
{
StorageId = 39485
},
new Point3D(10.10, 11.11, 12.12)
{
StorageId = 280347
},
new Point3D(13.13, 14.14, 15.15)
{
StorageId = 43059
},
new Point3D(16.16, 17.17, 18.18)
{
StorageId = 2390
},
new Point3D(19.19, 20.20, 21.21)
{
StorageId = 43
},
new Point3D(22.22, 23.23, 24.24)
{
StorageId = 325
}
};
var surfaceLine = new RingtoetsPipingSurfaceLine
{
StorageId = 4256,
Name = "",
ReferenceLineIntersectionWorldPoint = new Point2D(07.11, 19.87)
};
surfaceLine.SetGeometry(geometryPoints);
surfaceLine.SetBottomDitchDikeSideAt(geometryPoints[0]);
surfaceLine.SetBottomDitchPolderSideAt(geometryPoints[2]);
surfaceLine.SetDikeToeAtPolderAt(geometryPoints[3]);
surfaceLine.SetDikeToeAtRiverAt(geometryPoints[4]);
surfaceLine.SetDitchDikeSideAt(geometryPoints[5]);
surfaceLine.SetDitchPolderSideAt(geometryPoints[7]);
return surfaceLine;
}
private RingtoetsPipingSurfaceLine CreateSavedSurfaceLineWithoutGeometry()
{
return new RingtoetsPipingSurfaceLine
{
StorageId = 93584793,
Name = "",
ReferenceLineIntersectionWorldPoint = new Point2D(1.2, 3.4)
};
}
}
}