diff --git a/src/Numerics.Tests/LinearAlgebraTests/Complex/VectorTests.cs b/src/Numerics.Tests/LinearAlgebraTests/Complex/VectorTests.cs index 95afe05f..7e96be32 100644 --- a/src/Numerics.Tests/LinearAlgebraTests/Complex/VectorTests.cs +++ b/src/Numerics.Tests/LinearAlgebraTests/Complex/VectorTests.cs @@ -63,7 +63,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex Assert.AreEqual(vector.Count, clone.Count); CollectionAssert.AreEqual(vector, clone); } - + /// /// Can clone a vector using IClonable interface method. /// @@ -198,7 +198,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex public void SizeIsNotPositiveThrowsArgumentOutOfRangeException() { Assert.That(() => CreateVector(-1), Throws.TypeOf()); - Assert.That(() => CreateVector(0), Throws.TypeOf()); } /// diff --git a/src/Numerics.Tests/LinearAlgebraTests/Complex32/VectorTests.cs b/src/Numerics.Tests/LinearAlgebraTests/Complex32/VectorTests.cs index f1ae88cc..a597f8e1 100644 --- a/src/Numerics.Tests/LinearAlgebraTests/Complex32/VectorTests.cs +++ b/src/Numerics.Tests/LinearAlgebraTests/Complex32/VectorTests.cs @@ -63,7 +63,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 Assert.AreEqual(vector.Count, clone.Count); CollectionAssert.AreEqual(vector, clone); } - + /// /// Can clone a vector using IClonable interface method. /// @@ -198,7 +198,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 public void SizeIsNotPositiveThrowsArgumentOutOfRangeException() { Assert.That(() => CreateVector(-1), Throws.TypeOf()); - Assert.That(() => CreateVector(0), Throws.TypeOf()); } /// diff --git a/src/Numerics.Tests/LinearAlgebraTests/Double/VectorTests.cs b/src/Numerics.Tests/LinearAlgebraTests/Double/VectorTests.cs index 453fd6af..9293900a 100644 --- a/src/Numerics.Tests/LinearAlgebraTests/Double/VectorTests.cs +++ b/src/Numerics.Tests/LinearAlgebraTests/Double/VectorTests.cs @@ -59,7 +59,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double Assert.AreEqual(vector.Count, clone.Count); CollectionAssert.AreEqual(vector, clone); } - + /// /// Can clone a vector using IClonable interface method. /// @@ -194,7 +194,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double public void SizeIsNotPositiveThrowsArgumentOutOfRangeException() { Assert.That(() => CreateVector(-1), Throws.TypeOf()); - Assert.That(() => CreateVector(0), Throws.TypeOf()); } /// diff --git a/src/Numerics.Tests/LinearAlgebraTests/MatrixTests.cs b/src/Numerics.Tests/LinearAlgebraTests/MatrixTests.cs new file mode 100644 index 00000000..cc39f378 --- /dev/null +++ b/src/Numerics.Tests/LinearAlgebraTests/MatrixTests.cs @@ -0,0 +1,77 @@ +// +// Math.NET Numerics, part of the Math.NET Project +// http://numerics.mathdotnet.com +// http://github.com/mathnet/mathnet-numerics +// +// Copyright (c) 2009-2016 Math.NET +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using MathNet.Numerics.LinearAlgebra; +using MathNet.Numerics.LinearAlgebra.Storage; +using NUnit.Framework; + +namespace MathNet.Numerics.UnitTests.LinearAlgebraTests +{ + [TestFixture, Category("LA")] + public class MatrixTests + { + [Test] + public void DenseMatrixBuilderMethos_ZeroLength_DoNotThrowException() + { + Assert.DoesNotThrow(() => Matrix.Build.Dense(0, 0)); + Assert.DoesNotThrow(() => Matrix.Build.Dense(0, 0, 42)); + Assert.DoesNotThrow(() => Matrix.Build.Dense(0, 0, Array.Empty())); + Assert.DoesNotThrow(() => Matrix.Build.Dense(0, 0, (row, column) => 42)); + } + + [Test] + public void SparseMatrixBuilderMethos_ZeroLength_DoNotThrowException() + { + Assert.DoesNotThrow(() => Matrix.Build.Sparse(0, 0)); + Assert.DoesNotThrow(() => Matrix.Build.Sparse(0, 0, 42)); + Assert.DoesNotThrow(() => Matrix.Build.Sparse(0, 0, (row, column) => 42)); + } + + [Test] + public void DenseColumnMajorMatrixStorageBuilderMethods_ZeroLength_DoNotThrowException() + { + Assert.DoesNotThrow(() => new DenseColumnMajorMatrixStorage(0, 0)); + Assert.DoesNotThrow(() => new DenseColumnMajorMatrixStorage(0, 0, Array.Empty())); + } + + [Test] + public void DiagonalMatrixStorageBuilderMethods_ZeroLength_DoNotThrowException() + { + Assert.DoesNotThrow(() => new DiagonalMatrixStorage(0, 0)); + Assert.DoesNotThrow(() => new DiagonalMatrixStorage(0, 0, Array.Empty())); + } + + [Test] + public void SparseCompressedRowMatrixStorageBuilderMethods_ZeroLength_DoNotThrowException() + { + Assert.DoesNotThrow(() => new SparseCompressedRowMatrixStorage(0, 0)); + } + } +} diff --git a/src/Numerics.Tests/LinearAlgebraTests/Single/VectorTests.cs b/src/Numerics.Tests/LinearAlgebraTests/Single/VectorTests.cs index 0fa2f00f..5bce8083 100644 --- a/src/Numerics.Tests/LinearAlgebraTests/Single/VectorTests.cs +++ b/src/Numerics.Tests/LinearAlgebraTests/Single/VectorTests.cs @@ -60,7 +60,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single Assert.AreEqual(vector.Count, clone.Count); CollectionAssert.AreEqual(vector, clone); } - + /// /// Can clone a vector using IClonable interface method. /// @@ -195,7 +195,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single public void SizeIsNotPositiveThrowsArgumentOutOfRangeException() { Assert.That(() => CreateVector(-1), Throws.TypeOf()); - Assert.That(() => CreateVector(0), Throws.TypeOf()); } /// diff --git a/src/Numerics.Tests/LinearAlgebraTests/VectorTests.cs b/src/Numerics.Tests/LinearAlgebraTests/VectorTests.cs new file mode 100644 index 00000000..3a255000 --- /dev/null +++ b/src/Numerics.Tests/LinearAlgebraTests/VectorTests.cs @@ -0,0 +1,107 @@ +// +// Math.NET Numerics, part of the Math.NET Project +// http://numerics.mathdotnet.com +// http://github.com/mathnet/mathnet-numerics +// +// Copyright (c) 2009-2016 Math.NET +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using MathNet.Numerics.LinearAlgebra; +using MathNet.Numerics.LinearAlgebra.Storage; +using MathNet.Numerics.Properties; +using NUnit.Framework; + +namespace MathNet.Numerics.UnitTests.LinearAlgebraTests +{ + [TestFixture, Category("LA")] + public class VectorTests + { + [Test] + public void DenseVectorBuilderMethod_ZeroLength_DoNotThrowException() + { + Assert.DoesNotThrow(() => Vector.Build.Dense(0)); + Assert.DoesNotThrow(() => Vector.Build.Dense(0, 42)); + Assert.DoesNotThrow(() => Vector.Build.Dense(0, index => 42)); + Assert.DoesNotThrow(() => Vector.Build.Dense(Array.Empty())); + } + + [Test] + public void SparseVectorBuilderMethods_ZeroLength_DoNotThrowException() + { + Assert.DoesNotThrow(() => Vector.Build.Sparse(0)); + Assert.DoesNotThrow(() => Vector.Build.Sparse(0, 42)); + Assert.DoesNotThrow(() => Vector.Build.Sparse(0, index => 42)); + } + + [Test] + public void DenseVectorStorageBuilderMethods_ZeroLength_DoNotThrowException() + { + Assert.DoesNotThrow(() => new DenseVectorStorage(0)); + Assert.DoesNotThrow(() => new DenseVectorStorage(0, Array.Empty())); + Assert.DoesNotThrow(() => DenseVectorStorage.OfValue(0, 42)); + Assert.DoesNotThrow(() => DenseVectorStorage.OfInit(0, index => 42)); + } + + [Test] + public void SparseVectorStorageBuilderMethods_ZeroLength_DoNotThrowException() + { + Assert.DoesNotThrow(() => new SparseVectorStorage(0)); + Assert.DoesNotThrow(() => SparseVectorStorage.OfValue(0, 42)); + Assert.DoesNotThrow(() => SparseVectorStorage.OfInit(0, index => 42)); + } + + [Test] + public void DenseVectorStorageOfInit_NegativeLength_ThrowsArgumentException() + { + Assert.That(() => DenseVectorStorage.OfInit(-1, index => 42), + Throws.TypeOf() + .With.Message.Contains(Resources.ArgumentNotNegative)); + } + + [Test] + public void DenseVectorStorageOfValue_NegativeLength_ThrowsArgumentException() + { + Assert.That(() => DenseVectorStorage.OfValue(-1, 42), + Throws.TypeOf() + .With.Message.Contains(Resources.ArgumentNotNegative)); + } + + [Test] + public void SparseVectorStorageOfInit_NegativeLength_ThrowsArgumentException() + { + Assert.That(() => SparseVectorStorage.OfInit(-1, index => 42), + Throws.TypeOf() + .With.Message.Contains(Resources.ArgumentNotNegative)); + } + + [Test] + public void SparseVectorStorageOfValue_NegativeLength_ThrowsArgumentException() + { + Assert.That(() => SparseVectorStorage.OfValue(-1, 42), + Throws.TypeOf() + .With.Message.Contains(Resources.ArgumentNotNegative)); + } + } +} diff --git a/src/Numerics/LinearAlgebra/Storage/DenseVectorStorage.cs b/src/Numerics/LinearAlgebra/Storage/DenseVectorStorage.cs index 9a3a9df9..100639fe 100644 --- a/src/Numerics/LinearAlgebra/Storage/DenseVectorStorage.cs +++ b/src/Numerics/LinearAlgebra/Storage/DenseVectorStorage.cs @@ -115,9 +115,9 @@ namespace MathNet.Numerics.LinearAlgebra.Storage public static DenseVectorStorage OfValue(int length, T value) { - if (length < 1) + if (length < 0) { - throw new ArgumentOutOfRangeException(nameof(length), string.Format(Resources.ArgumentLessThanOne, length)); + throw new ArgumentOutOfRangeException(nameof(length), Resources.ArgumentNotNegative); } var data = new T[length]; @@ -133,9 +133,9 @@ namespace MathNet.Numerics.LinearAlgebra.Storage public static DenseVectorStorage OfInit(int length, Func init) { - if (length < 1) + if (length < 0) { - throw new ArgumentOutOfRangeException(nameof(length), string.Format(Resources.ArgumentLessThanOne, length)); + throw new ArgumentOutOfRangeException(nameof(length), Resources.ArgumentNotNegative); } var data = new T[length]; diff --git a/src/Numerics/LinearAlgebra/Storage/MatrixStorage.cs b/src/Numerics/LinearAlgebra/Storage/MatrixStorage.cs index 9459747d..7f9618c5 100644 --- a/src/Numerics/LinearAlgebra/Storage/MatrixStorage.cs +++ b/src/Numerics/LinearAlgebra/Storage/MatrixStorage.cs @@ -51,12 +51,12 @@ namespace MathNet.Numerics.LinearAlgebra.Storage protected MatrixStorage(int rowCount, int columnCount) { - if (rowCount <= 0) + if (rowCount < 0) { throw new ArgumentOutOfRangeException(nameof(rowCount), Resources.MatrixRowsMustBePositive); } - if (columnCount <= 0) + if (columnCount < 0) { throw new ArgumentOutOfRangeException(nameof(columnCount), Resources.MatrixColumnsMustBePositive); } diff --git a/src/Numerics/LinearAlgebra/Storage/SparseVectorStorage.cs b/src/Numerics/LinearAlgebra/Storage/SparseVectorStorage.cs index bd8da317..0cf7d9b4 100644 --- a/src/Numerics/LinearAlgebra/Storage/SparseVectorStorage.cs +++ b/src/Numerics/LinearAlgebra/Storage/SparseVectorStorage.cs @@ -315,9 +315,9 @@ namespace MathNet.Numerics.LinearAlgebra.Storage return new SparseVectorStorage(length); } - if (length < 1) + if (length < 0) { - throw new ArgumentOutOfRangeException(nameof(length), string.Format(Resources.ArgumentLessThanOne, length)); + throw new ArgumentOutOfRangeException(nameof(length), Resources.ArgumentNotNegative); } var indices = new int[length]; @@ -338,9 +338,9 @@ namespace MathNet.Numerics.LinearAlgebra.Storage public static SparseVectorStorage OfInit(int length, Func init) { - if (length < 1) + if (length < 0) { - throw new ArgumentOutOfRangeException(nameof(length), string.Format(Resources.ArgumentLessThanOne, length)); + throw new ArgumentOutOfRangeException(nameof(length), Resources.ArgumentNotNegative); } var indices = new List(); diff --git a/src/Numerics/LinearAlgebra/Storage/VectorStorage.cs b/src/Numerics/LinearAlgebra/Storage/VectorStorage.cs index f38337fb..8fe8af83 100644 --- a/src/Numerics/LinearAlgebra/Storage/VectorStorage.cs +++ b/src/Numerics/LinearAlgebra/Storage/VectorStorage.cs @@ -48,9 +48,9 @@ namespace MathNet.Numerics.LinearAlgebra.Storage protected VectorStorage(int length) { - if (length <= 0) + if (length < 0) { - throw new ArgumentOutOfRangeException(nameof(length), Resources.ArgumentMustBePositive); + throw new ArgumentOutOfRangeException(nameof(length), Resources.ArgumentNotNegative); } Length = length;