Index: src/Plugins/Wti/Wti.IO/PipingSoilLayerReader.cs =================================================================== diff -u -r356ac6ef31864aa207c8af9470df3349f8e4d1f1 -r148b1b06bb80e4ad65a7b8a722910db6eaef0098 --- src/Plugins/Wti/Wti.IO/PipingSoilLayerReader.cs (.../PipingSoilLayerReader.cs) (revision 356ac6ef31864aa207c8af9470df3349f8e4d1f1) +++ src/Plugins/Wti/Wti.IO/PipingSoilLayerReader.cs (.../PipingSoilLayerReader.cs) (revision 148b1b06bb80e4ad65a7b8a722910db6eaef0098) @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Xml; using Wti.Data; @@ -28,6 +29,7 @@ /// /// An array of which contains the information of a /// in an XML document. + /// Thrown when is null. internal PipingSoilLayerReader(byte[] geometry) { xmlTextReader = new XmlTextReader(new MemoryStream(geometry)); @@ -74,21 +76,32 @@ { loop = new HashSet(); - while (xmlTextReader.Read() && !IsEndElementWithName(elementName)) + if (!IsEmptyElement()) { - Point3D parsedPoint; - if (TryParsePoint(out parsedPoint)) + while (xmlTextReader.Read() && !IsEndElementWithName(elementName)) { - loop.Add(parsedPoint); + Point3D parsedPoint; + if (TryParsePoint(out parsedPoint)) + { + loop.Add(parsedPoint); + } } } - return true; } return false; } /// + /// Finds out whether the element which the reader is currently pointing at is empty. + /// + /// True if the element is empty. False otherwise. + private bool IsEmptyElement() + { + return xmlTextReader.IsEmptyElement; + } + + /// /// Tries to parse the element which the reader is currently pointing at as a point. /// /// The result of parsing the element as a point. null if current element is not a head or end point. @@ -102,9 +115,9 @@ var pointValues = ReadChildValues(); point = new Point3D { - X = double.Parse(pointValues[xElementName]), - Y = double.Parse(pointValues[yElementName]), - Z = double.Parse(pointValues[zElementName]) + X = double.Parse(pointValues[xElementName], CultureInfo.InvariantCulture), + Y = double.Parse(pointValues[yElementName], CultureInfo.InvariantCulture), + Z = double.Parse(pointValues[zElementName], CultureInfo.InvariantCulture) }; return true; } Index: src/Plugins/Wti/Wti.IO/PipingSoilProfileReader.cs =================================================================== diff -u -r356ac6ef31864aa207c8af9470df3349f8e4d1f1 -r148b1b06bb80e4ad65a7b8a722910db6eaef0098 --- src/Plugins/Wti/Wti.IO/PipingSoilProfileReader.cs (.../PipingSoilProfileReader.cs) (revision 356ac6ef31864aa207c8af9470df3349f8e4d1f1) +++ src/Plugins/Wti/Wti.IO/PipingSoilProfileReader.cs (.../PipingSoilProfileReader.cs) (revision 148b1b06bb80e4ad65a7b8a722910db6eaef0098) @@ -117,15 +117,15 @@ var query = new SQLiteCommand(connection) { CommandText = string.Format( - "SELECT p.SP2D_Name, l.GeometrySurface " + + "SELECT p.SP2D_Name, l.GeometrySurface, mat.MA_Name " + "FROM MechanismPointLocation as m " + "JOIN SoilProfile2D as p ON m.SP2D_ID = p.SP2D_ID " + "JOIN SoilLayer2D as l ON l.SP2D_ID = p.SP2D_ID " + + "JOIN Materials as mat ON mat.MA_ID = l.MA_ID " + "WHERE m.ME_ID = @{0} " + "ORDER BY p.SP2D_ID, l.SP2D_ID", mechanismParameterName) }; - query.Parameters.Add(new SQLiteParameter { DbType = DbType.Int32, Index: test/Plugins/Wti/Wti.IO.Test/PipingSoilLayerReaderTest.cs =================================================================== diff -u --- test/Plugins/Wti/Wti.IO.Test/PipingSoilLayerReaderTest.cs (revision 0) +++ test/Plugins/Wti/Wti.IO.Test/PipingSoilLayerReaderTest.cs (revision 148b1b06bb80e4ad65a7b8a722910db6eaef0098) @@ -0,0 +1,180 @@ +using System.Collections.Generic; +using System.Xml; +using NUnit.Framework; +using Wti.Data; + +namespace Wti.IO.Test +{ + public class PipingSoilLayerReaderTest + { + [Test] + [TestCase(0)] + [TestCase(1)] + public void Constructor_AnyByteArray_ReturnsNewInstance(int size) + { + // Call + var result = new PipingSoilLayerReader(new byte[size]); + + // Assert + Assert.NotNull(result); + } + + [Test] + public void Read_MalformedXmlDocument_ThrowsXmlException() + { + // Setup + var xmlDoc = GetBytes("test"); + var reader = new PipingSoilLayerReader(xmlDoc); + + // Call + TestDelegate test = () => reader.Read(); + + // Assert + Assert.Throws(test); + } + + [Test] + public void Read_XmlDocumentWithoutSaneContent_ReturnsLayerWithoutLoops() + { + // Setup + var xmlDoc = GetBytes(""); + var reader = new PipingSoilLayerReader(xmlDoc); + + // Call + var result = reader.Read(); + + // Assert + Assert.NotNull(result); + Assert.IsNull(result.OuterLoop); + Assert.IsNull(result.InnerLoop); + } + + [Test] + public void Read_XmlDocumentWithEmptyOuterLoop_ReturnsLayerWithEmptyOuterLoop() + { + // Setup + var xmlDoc = GetBytes(""); + var reader = new PipingSoilLayerReader(xmlDoc); + + // Call + var result = reader.Read(); + + // Assert + Assert.NotNull(result); + CollectionAssert.IsEmpty(result.OuterLoop); + Assert.IsNull(result.InnerLoop); + } + + [Test] + public void Read_XmlDocumentWithEmptyInnerLoop_ReturnsLayerWithEmptyInnerLoop() + { + // Setup + var xmlDoc = GetBytes(""); + var reader = new PipingSoilLayerReader(xmlDoc); + + // Call + var result = reader.Read(); + + // Assert + Assert.NotNull(result); + Assert.IsNull(result.OuterLoop); + CollectionAssert.IsEmpty(result.InnerLoop); + } + + [Test] + public void Read_XmlDocumentWithEmptyInnerLoopAndOuterLoop_ReturnsLayerWithEmptyInnerLoopAndEmptyOuterLoop() + { + // Setup + var xmlDoc = GetBytes(""); + var reader = new PipingSoilLayerReader(xmlDoc); + + // Call + var result = reader.Read(); + + // Assert + Assert.NotNull(result); + CollectionAssert.IsEmpty(result.OuterLoop); + CollectionAssert.IsEmpty(result.InnerLoop); + } + + [Test] + [SetCulture("nl-NL")] + public void Read_NLXmlDocumentPointInOuterLoop_ReturnsLayerWithOuterLoopWithPoint() + { + Read_XmlDocumentPointInOuterLoop_ReturnsLayerWithOuterLoopWithPoint(); + } + + [Test] + [SetCulture("en-US")] + public void Read_ENXmlDocumentPointInOuterLoop_ReturnsLayerWithOuterLoopWithPoint() + { + Read_XmlDocumentPointInOuterLoop_ReturnsLayerWithOuterLoopWithPoint(); + } + + private void Read_XmlDocumentPointInOuterLoop_ReturnsLayerWithOuterLoopWithPoint() + { + // Setup + var xmlDoc = GetBytes("00.11.1"); + var reader = new PipingSoilLayerReader(xmlDoc); + + // Call + var result = reader.Read(); + + // Assert + Assert.NotNull(result); + CollectionAssert.AreEqual(new HashSet {new Point3D{X=0,Y=0.1,Z=1.1}}, result.OuterLoop); + } + + [Test] + public void Read_XmlDocumentPointInInnerLoop_ReturnsLayerWithInnerLoopWithPoint() + { + // Setup + var xmlDoc = GetBytes("00.11.1"); + var reader = new PipingSoilLayerReader(xmlDoc); + + // Call + var result = reader.Read(); + + // Assert + Assert.NotNull(result); + CollectionAssert.AreEqual(new HashSet { new Point3D { X = 0, Y = 0.1, Z = 1.1 } }, result.InnerLoop); + } + + [Test] + public void Read_XmlDocumentPointsInOuterLoop_ReturnsLayerWithOuterLoopWithPoints() + { + // Setup + var xmlDoc = GetBytes("00.11.110.11.1"); + var reader = new PipingSoilLayerReader(xmlDoc); + + // Call + var result = reader.Read(); + + // Assert + Assert.NotNull(result); + CollectionAssert.AreEqual(new HashSet { new Point3D { X = 0, Y = 0.1, Z = 1.1 }, new Point3D { X = 1.0, Y = 0.1, Z = 1.1 } }, result.OuterLoop); + } + + [Test] + public void Read_XmlDocumentPointsInInnerLoop_ReturnsLayerWithInnerLoopWithPoints() + { + // Setup + var xmlDoc = GetBytes("00.11.110.11.1"); + var reader = new PipingSoilLayerReader(xmlDoc); + + // Call + var result = reader.Read(); + + // Assert + Assert.NotNull(result); + CollectionAssert.AreEqual(new HashSet { new Point3D { X = 0, Y = 0.1, Z = 1.1 }, new Point3D { X = 1.0, Y = 0.1, Z = 1.1 } }, result.InnerLoop); + } + + static byte[] GetBytes(string str) + { + byte[] bytes = new byte[str.Length * sizeof(char)]; + System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); + return bytes; + } + } +} \ No newline at end of file Index: test/Plugins/Wti/Wti.IO.Test/PipingSoilProfileReaderTest.cs =================================================================== diff -u -r356ac6ef31864aa207c8af9470df3349f8e4d1f1 -r148b1b06bb80e4ad65a7b8a722910db6eaef0098 --- test/Plugins/Wti/Wti.IO.Test/PipingSoilProfileReaderTest.cs (.../PipingSoilProfileReaderTest.cs) (revision 356ac6ef31864aa207c8af9470df3349f8e4d1f1) +++ test/Plugins/Wti/Wti.IO.Test/PipingSoilProfileReaderTest.cs (.../PipingSoilProfileReaderTest.cs) (revision 148b1b06bb80e4ad65a7b8a722910db6eaef0098) @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using DelftTools.TestUtils; +using log4net.Core; using NUnit.Framework; using Wti.Data; using Wti.IO.Exceptions; @@ -72,28 +74,71 @@ } [Test] - public void ReadSoilProfiles_CompleteDatabase_Returns2ProfilesWithLayersAndGeometries() + [SetCulture("nl-NL")] + public void ReadSoilProfiles_NLCompleteDatabase_Returns2ProfilesWithLayersAndGeometries() { + ReadSoilProfiles_CompleteDatabase_Returns2ProfilesWithLayersAndGeometries(); + } + + [Test] + [SetCulture("en-US")] + public void ReadSoilProfiles_ENCompleteDatabase_Returns2ProfilesWithLayersAndGeometries() + { + ReadSoilProfiles_CompleteDatabase_Returns2ProfilesWithLayersAndGeometries(); + } + + private void ReadSoilProfiles_CompleteDatabase_Returns2ProfilesWithLayersAndGeometries() + { // Setup var testFile = "complete.soil"; var pipingSoilProfilesReader = new PipingSoilProfileReader(Path.Combine(testDataPath, testFile)); var firstProfileFirstLayerOuterLoop = new HashSet { - new Point3D{X=0,Y=0,Z=-10}, - new Point3D{X=0,Y=0,Z=-3.5}, - new Point3D{X=70.208,Y=0,Z=-3.5}, - new Point3D{X=73.91,Y=0,Z=-3.5}, - new Point3D{X=80.78,Y=0,Z=-3.5}, - new Point3D{X=80.78,Y=0,Z=-10}, + new Point3D + { + X = 0, Y = 0, Z = -10 + }, + new Point3D + { + X = 0, Y = 0, Z = -3.5 + }, + new Point3D + { + X = 70.208, Y = 0, Z = -3.5 + }, + new Point3D + { + X = 73.91, Y = 0, Z = -3.5 + }, + new Point3D + { + X = 80.78, Y = 0, Z = -3.5 + }, + new Point3D + { + X = 80.78, Y = 0, Z = -10 + }, }; var secondProfileSecondLayerOuterLoop = new HashSet { - new Point3D{X=87.516,Y=0,Z=-1.5}, - new Point3D{X=87.567000000000007,Y=0,Z=-0.70000000000000007}, - new Point3D{X=101.4,Y=0,Z=-0.70000000000000007}, - new Point3D{X=101.4,Y=0,Z=-1.5}, + new Point3D + { + X = 87.516, Y = 0, Z = -1.5 + }, + new Point3D + { + X = 87.567000000000007, Y = 0, Z = -0.70000000000000007 + }, + new Point3D + { + X = 101.4, Y = 0, Z = -0.70000000000000007 + }, + new Point3D + { + X = 101.4, Y = 0, Z = -1.5 + }, }; // Call @@ -104,6 +149,7 @@ var firstProfile = result.SingleOrDefault(psp => psp.Name == "10Y_005_STBI"); Assert.NotNull(firstProfile); Assert.AreEqual(13, firstProfile.Count()); + CollectionAssert.AreEqual(firstProfileFirstLayerOuterLoop, firstProfile.Layers.ToArray()[0].OuterLoop); Assert.IsNull(firstProfile.Layers.ToArray()[0].InnerLoop); Index: test/Plugins/Wti/Wti.IO.Test/Wti.IO.Test.csproj =================================================================== diff -u -r356ac6ef31864aa207c8af9470df3349f8e4d1f1 -r148b1b06bb80e4ad65a7b8a722910db6eaef0098 --- test/Plugins/Wti/Wti.IO.Test/Wti.IO.Test.csproj (.../Wti.IO.Test.csproj) (revision 356ac6ef31864aa207c8af9470df3349f8e4d1f1) +++ test/Plugins/Wti/Wti.IO.Test/Wti.IO.Test.csproj (.../Wti.IO.Test.csproj) (revision 148b1b06bb80e4ad65a7b8a722910db6eaef0098) @@ -33,15 +33,21 @@ MinimumRecommendedRules.ruleset + + False + ..\..\..\..\lib\log4net.dll + ..\..\..\..\lib\nunit.framework.dll + +