// Copyright (C) Stichting Deltares 2017. 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.Globalization;
using System.IO;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
using Core.Common.Base.Geometry;
using NUnit.Framework;
using Ringtoets.Common.IO.SoilProfile;
namespace Ringtoets.Common.IO.Test.SoilProfile
{
[TestFixture]
public class SoilLayer2DReaderTest
{
[Test]
public void Constructor_Always_ReturnsNewInstance()
{
// Call
var result = new SoilLayer2DReader();
// Assert
Assert.NotNull(result);
}
[Test]
public void Read_MalformedXmlDocument_ThrowsSoilLayer2DConversionException()
{
// Setup
byte[] xmlDoc = GetByteArray("test");
var reader = new SoilLayer2DReader();
// Call
TestDelegate test = () => reader.Read(xmlDoc);
// Assert
var exception = Assert.Throws(test);
Assert.AreEqual("Het XML-document dat de geometrie beschrijft voor de laag is niet geldig.", exception.Message);
}
[Test]
public void Read_XmlDocumentWithoutSaneContent_ThrowsSoilLayer2DConversionException()
{
// Setup
XDocument xmlDoc = GetXmlDocument("");
var reader = new SoilLayer2DReader();
// Call
TestDelegate test = () => reader.Read(xmlDoc);
// Assert
var exception = Assert.Throws(test);
Assert.AreEqual("Het XML-document dat de geometrie beschrijft voor de laag is niet geldig.", exception.Message);
}
[Test]
public void Read_XmlDocumentWithNoInnerLoops_ThrowsSoilLayer2DConversionException()
{
// Setup
XDocument xmlDoc = GetXmlDocument("");
var reader = new SoilLayer2DReader();
// Call
TestDelegate test = () => reader.Read(xmlDoc);
// Assert
var exception = Assert.Throws(test);
Assert.AreEqual("Het XML-document dat de geometrie beschrijft voor de laag is niet geldig.", exception.Message);
}
[Test]
public void Read_XmlDocumentWithNoOuterLoop_ThrowsSoilLayer2DConversionException()
{
// Setup
XDocument xmlDoc = GetXmlDocument("");
var reader = new SoilLayer2DReader();
// Call
TestDelegate test = () => reader.Read(xmlDoc);
// Assert
var exception = Assert.Throws(test);
Assert.AreEqual("Het XML-document dat de geometrie beschrijft voor de laag is niet geldig.", exception.Message);
}
[Test]
public void Read_XmlDocumentWithEmptyInnerLoopAndOuterLoop_ReturnsLayerWithEmptyInnerLoopAndEmptyOuterLoop()
{
// Setup
XDocument xmlDoc = GetXmlDocument("");
var reader = new SoilLayer2DReader();
// Call
SoilLayer2D result = reader.Read(xmlDoc);
// Assert
Assert.NotNull(result);
CollectionAssert.IsEmpty(result.OuterLoop);
Assert.AreEqual(1, result.InnerLoops.Count());
CollectionAssert.IsEmpty(result.InnerLoops.ElementAt(0));
}
[Test]
[TestCase("x")]
[TestCase("")]
public void Read_XmlDocumentWithInvalidPointCoordinate_ThrowsSoilLayer2DConversionException(string incorrectNumber)
{
// Setup
XDocument xmlDoc = GetXmlDocument(
"" +
$"{incorrectNumber}1.2" +
"1.21.2" +
"");
var reader = new SoilLayer2DReader();
// Call
TestDelegate test = () => reader.Read(xmlDoc);
// Assert
var exception = Assert.Throws(test);
Assert.AreEqual("Coördinaat van een punt bevat ongeldige waarde.", exception.Message);
}
[Test]
public void Read_XmlDocumentWitOverflowingPointCoordinate_ThrowsSoilLayer2DConversionException()
{
// Setup
XDocument xmlDoc = GetXmlDocument(
"" +
$"{double.MaxValue}1.2" +
"1.21.2" +
"");
var reader = new SoilLayer2DReader();
// Call
TestDelegate test = () => reader.Read(xmlDoc);
// Assert
var exception = Assert.Throws(test);
Assert.AreEqual("Coördinaat van een punt bevat ongeldige waarde.", exception.Message);
}
[Test]
[SetCulture("nl-NL")]
public void Read_NLXmlDocumentPointInOuterLoop_ReturnsLayerWithOuterLoopWithPoint()
{
Read_XmlDocumentPointInOuterLoop_ReturnsLayerWithOuterLoopWithPoint();
}
[Test]
[SetCulture("en-US")]
public void Read_ENXmlDocumentPointInOuterLoop_ReturnsLayerWithOuterLoopWithPoint()
{
Read_XmlDocumentPointInOuterLoop_ReturnsLayerWithOuterLoopWithPoint();
}
[Test]
public void Read_XmlDocumentPointsInInnerLoop_ReturnsLayerWithInnerLoopWithSegment()
{
// Setup
var random = new Random(22);
CultureInfo invariantCulture = CultureInfo.InvariantCulture;
double x1 = random.NextDouble();
double x2 = random.NextDouble();
double y1 = random.NextDouble();
double y2 = random.NextDouble();
string x1String = x1.ToString(invariantCulture);
string x2String = x2.ToString(invariantCulture);
string y1String = y1.ToString(invariantCulture);
string y2String = y2.ToString(invariantCulture);
double parsedX1 = double.Parse(x1String, invariantCulture);
double parsedX2 = double.Parse(x2String, invariantCulture);
double parsedY1 = double.Parse(y1String, invariantCulture);
double parsedY2 = double.Parse(y2String, invariantCulture);
XDocument xmlDoc = GetXmlDocument(
string.Format(invariantCulture,
"" +
"{0}0.1{1}" +
"{2}0.1{3}" +
"" +
"{0}0.1{1}" +
"{2}0.1{3}" +
"",
x1String, y1String, x2String, y2String));
var reader = new SoilLayer2DReader();
// Call
SoilLayer2D result = reader.Read(xmlDoc);
// Assert
Assert.NotNull(result);
var expectedSegment = new Segment2D(new Point2D(parsedX1, parsedY1), new Point2D(parsedX2, parsedY2));
var expectedCollection = new[]
{
new List
{
expectedSegment,
expectedSegment
}
};
CollectionAssert.AreEqual(expectedCollection, result.InnerLoops);
}
[Test]
public void Read_XmlDocumentSinglePointOuterLoopGeometryCurve_ThrowsSoilLayer2DConversionException()
{
// Setup
XDocument xmlDoc = GetXmlDocument(
"" +
"10.11.1" +
"");
var reader = new SoilLayer2DReader();
// Call
TestDelegate test = () => reader.Read(xmlDoc);
// Assert
Assert.Throws(test);
}
[Test]
public void Read_XmlDocumentSinglePointInnerLoopGeometryCurve_ThrowsSoilLayer2DConversionException()
{
// Setup
XDocument xmlDoc = GetXmlDocument(
"" +
"00.11.1" +
"");
var reader = new SoilLayer2DReader();
// Call
TestDelegate test = () => reader.Read(xmlDoc);
// Assert
Assert.Throws(test);
}
[Test]
public void Read_XmlDocumentEqualSegments_ReturnsTwoEqualSegments()
{
// Setup
XDocument xmlDoc = GetXmlDocument(
"" +
"" +
"001.1101.1" +
"" +
"" +
"001.1101.1" +
"" +
"");
var reader = new SoilLayer2DReader();
// Call
SoilLayer2D result = reader.Read(xmlDoc);
// Assert
Assert.AreEqual(2, result.OuterLoop.Count());
Assert.AreEqual(result.OuterLoop.ElementAt(0), result.OuterLoop.ElementAt(1));
}
private static void Read_XmlDocumentPointInOuterLoop_ReturnsLayerWithOuterLoopWithPoint()
{
// Setup
var random = new Random(22);
CultureInfo invariantCulture = CultureInfo.InvariantCulture;
double x1 = random.NextDouble();
double x2 = random.NextDouble();
double y1 = random.NextDouble();
double y2 = random.NextDouble();
string x1String = x1.ToString(invariantCulture);
string x2String = x2.ToString(invariantCulture);
string y1String = y1.ToString(invariantCulture);
string y2String = y2.ToString(invariantCulture);
double parsedX1 = XmlConvert.ToDouble(x1String);
double parsedX2 = XmlConvert.ToDouble(x2String);
double parsedY1 = XmlConvert.ToDouble(y1String);
double parsedY2 = XmlConvert.ToDouble(y2String);
XDocument bytes = GetXmlDocument(
string.Format(invariantCulture,
"" +
"{0}0.1{1}" +
"{2}0.1{3}" +
"" +
"{0}0.1{1}" +
"{2}0.1{3}" +
"",
x1String, y1String, x2String, y2String));
var reader = new SoilLayer2DReader();
// Call
SoilLayer2D result = reader.Read(bytes);
// Assert
Assert.NotNull(result);
var expectedSegment = new Segment2D(new Point2D(parsedX1, parsedY1), new Point2D(parsedX2, parsedY2));
CollectionAssert.AreEqual(new List
{
expectedSegment,
expectedSegment
}, result.OuterLoop);
}
///
/// Takes a which describes an XML document and returns
/// an from this.
///
/// The to convert to an .
/// The constructed from .
/// Thrown when is null.
/// Thrown when does not describe
/// a valid XML document.
private static XDocument GetXmlDocument(string str)
{
return XDocument.Load(new MemoryStream(GetByteArray(str)));
}
///
/// Takes a and returns an of ,
/// which contains the same information as the original .
///
/// The to convert to an of
/// .
/// The of constructed from
/// .
private static byte[] GetByteArray(string str)
{
var bytes = new byte[str.Length * sizeof(char)];
Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
}
}