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
+
+