From aaefd0eb8684ed65b8b9f89fb10b692a4c747542 Mon Sep 17 00:00:00 2001 From: Alexander Luzgarev Date: Sat, 23 Mar 2019 09:18:03 +0100 Subject: [PATCH] Unify MatFileReader tests --- MatFileHandler.Tests/MatFileReaderHdfTests.cs | 321 --------- ...erLevel5Tests.cs => MatFileReaderTests.cs} | 641 ++++++++++-------- .../test-data/level5/matrix.mat | Bin 0 -> 184 bytes .../test-data/level5/matrix_complex.mat | Bin 0 -> 210 bytes 4 files changed, 360 insertions(+), 602 deletions(-) delete mode 100644 MatFileHandler.Tests/MatFileReaderHdfTests.cs rename MatFileHandler.Tests/{MatFileReaderLevel5Tests.cs => MatFileReaderTests.cs} (77%) create mode 100644 MatFileHandler.Tests/test-data/level5/matrix.mat create mode 100644 MatFileHandler.Tests/test-data/level5/matrix_complex.mat diff --git a/MatFileHandler.Tests/MatFileReaderHdfTests.cs b/MatFileHandler.Tests/MatFileReaderHdfTests.cs deleted file mode 100644 index 5434423..0000000 --- a/MatFileHandler.Tests/MatFileReaderHdfTests.cs +++ /dev/null @@ -1,321 +0,0 @@ -// Copyright 2017-2018 Alexander Luzgarev - -using System.IO; -using System.Linq; -using System.Numerics; -using NUnit.Framework; - -namespace MatFileHandler.Tests -{ - /// - /// Tests of file reading API (HDF cases). - /// - [TestFixture] - public class MatFileReaderHdfTests - { - private const string TestDirectory = "test-data"; - - /// - /// Test reading an ASCII-encoded string. - /// - [Test] - public void TestAscii() - { - var matFile = ReadHdfTestFile("ascii"); - var arrayAscii = matFile["s"].Value as ICharArray; - Assert.That(arrayAscii, Is.Not.Null); - Assert.That(arrayAscii.Dimensions, Is.EqualTo(new[] { 1, 3 })); - Assert.That(arrayAscii.String, Is.EqualTo("abc")); - Assert.That(arrayAscii[2], Is.EqualTo('c')); - } - - /// - /// Test reading a Unicode string. - /// - [Test] - public void TestUnicode() - { - var matFile = ReadHdfTestFile("unicode"); - var arrayUnicode = matFile["s"].Value as ICharArray; - Assert.That(arrayUnicode, Is.Not.Null); - Assert.That(arrayUnicode.Dimensions, Is.EqualTo(new[] { 1, 2 })); - Assert.That(arrayUnicode.String, Is.EqualTo("必フ")); - Assert.That(arrayUnicode[0], Is.EqualTo('必')); - Assert.That(arrayUnicode[1], Is.EqualTo('フ')); - } - - /// - /// Test reading a wide Unicode string. - /// - [Test] - public void TestUnicodeWide() - { - var matFile = ReadHdfTestFile("unicode-wide"); - var arrayUnicodeWide = matFile["s"].Value as ICharArray; - Assert.That(arrayUnicodeWide, Is.Not.Null); - Assert.That(arrayUnicodeWide.Dimensions, Is.EqualTo(new[] { 1, 2 })); - Assert.That(arrayUnicodeWide.String, Is.EqualTo("🍆")); - } - - /// - /// Test reading a two-dimensional double array. - /// - [Test] - public void TestMatrix() - { - var matFile = ReadHdfTestFile("matrix"); - var matrix = matFile["matrix"].Value as IArrayOf; - Assert.That(matrix.Dimensions, Is.EqualTo(new[] { 3, 2 })); - Assert.That(matrix.ConvertToDoubleArray(), Is.EqualTo(new[] { 1.0, 3.0, 5.0, 2.0, 4.0, 6.0 })); - Assert.That(matrix[0, 0], Is.EqualTo(1.0)); - Assert.That(matrix[0, 1], Is.EqualTo(2.0)); - Assert.That(matrix[1, 0], Is.EqualTo(3.0)); - Assert.That(matrix[1, 1], Is.EqualTo(4.0)); - Assert.That(matrix[2, 0], Is.EqualTo(5.0)); - Assert.That(matrix[2, 1], Is.EqualTo(6.0)); - } - - /// - /// Test reading a two-dimensional complex array. - /// - [Test] - public void TestComplexMatrix() - { - var matFile = ReadHdfTestFile("matrix_complex"); - var matrix = matFile["matrix"].Value as IArrayOf; - Assert.That(matrix.Dimensions, Is.EqualTo(new[] { 3, 2 })); - Assert.That(matrix.ConvertToComplexArray(), Is.EqualTo(new[] - { - new Complex(1.0, 4.0), - new Complex(3.0, 1.0), - new Complex(5.0, 0.25), - new Complex(2.0, 2.0), - new Complex(4.0, 0.5), - new Complex(6.0, 0.125), - })); - Assert.That(matrix[0, 0], Is.EqualTo(new Complex(1.0, 4.0))); - Assert.That(matrix[0, 1], Is.EqualTo(new Complex(2.0, 2.0))); - Assert.That(matrix[1, 0], Is.EqualTo(new Complex(3.0, 1.0))); - Assert.That(matrix[1, 1], Is.EqualTo(new Complex(4.0, 0.5))); - Assert.That(matrix[2, 0], Is.EqualTo(new Complex(5.0, 0.25))); - Assert.That(matrix[2, 1], Is.EqualTo(new Complex(6.0, 0.125))); - } - - /// - /// Test reading lower and upper limits of integer data types. - /// - [Test] - public void TestLimits() - { - var matFile = ReadHdfTestFile("limits"); - IArray array; - array = matFile["int8_"].Value; - CheckLimits(array as IArrayOf, CommonData.Int8Limits); - Assert.That(array.ConvertToDoubleArray(), Is.EqualTo(new[] { -128.0, 127.0 })); - - array = matFile["uint8_"].Value; - CheckLimits(array as IArrayOf, CommonData.UInt8Limits); - - array = matFile["int16_"].Value; - CheckLimits(array as IArrayOf, CommonData.Int16Limits); - - array = matFile["uint16_"].Value; - CheckLimits(array as IArrayOf, CommonData.UInt16Limits); - - array = matFile["int32_"].Value; - CheckLimits(array as IArrayOf, CommonData.Int32Limits); - - array = matFile["uint32_"].Value; - CheckLimits(array as IArrayOf, CommonData.UInt32Limits); - - array = matFile["int64_"].Value; - CheckLimits(array as IArrayOf, CommonData.Int64Limits); - - array = matFile["uint64_"].Value; - CheckLimits(array as IArrayOf, CommonData.UInt64Limits); - } - - /// - /// Test writing lower and upper limits of integer-based complex data types. - /// - [Test] - public void TestComplexLimits() - { - var matFile = ReadHdfTestFile("limits_complex"); - IArray array; - array = matFile["int8_complex"].Value; - CheckComplexLimits(array as IArrayOf>, CommonData.Int8Limits); - Assert.That( - array.ConvertToComplexArray(), - Is.EqualTo(new[] { -128.0 + (127.0 * Complex.ImaginaryOne), 127.0 - (128.0 * Complex.ImaginaryOne) })); - - array = matFile["uint8_complex"].Value; - CheckComplexLimits(array as IArrayOf>, CommonData.UInt8Limits); - - array = matFile["int16_complex"].Value; - CheckComplexLimits(array as IArrayOf>, CommonData.Int16Limits); - - array = matFile["uint16_complex"].Value; - CheckComplexLimits(array as IArrayOf>, CommonData.UInt16Limits); - - array = matFile["int32_complex"].Value; - CheckComplexLimits(array as IArrayOf>, CommonData.Int32Limits); - - array = matFile["uint32_complex"].Value; - CheckComplexLimits(array as IArrayOf>, CommonData.UInt32Limits); - - array = matFile["int64_complex"].Value; - CheckComplexLimits(array as IArrayOf>, CommonData.Int64Limits); - - array = matFile["uint64_complex"].Value; - CheckComplexLimits(array as IArrayOf>, CommonData.UInt64Limits); - } - - /// - /// Test reading a structure array. - /// - [Test] - public void TestStruct() - { - var matFile = ReadHdfTestFile("struct"); - var structure = matFile["struct_"].Value as IStructureArray; - Assert.That(structure, Is.Not.Null); - Assert.That(structure.FieldNames, Is.EquivalentTo(new[] { "x", "y" })); - var element = structure[0, 0]; - Assert.That(element.ContainsKey("x"), Is.True); - Assert.That(element.Count, Is.EqualTo(2)); - Assert.That(element.TryGetValue("x", out var _), Is.True); - Assert.That(element.TryGetValue("z", out var _), Is.False); - Assert.That(element.Keys, Has.Exactly(2).Items); - Assert.That(element.Values, Has.Exactly(2).Items); - var keys = element.Select(pair => pair.Key); - Assert.That(keys, Is.EquivalentTo(new[] { "x", "y" })); - - Assert.That((element["x"] as IArrayOf)?[0], Is.EqualTo(12.345)); - - Assert.That((structure["x", 0, 0] as IArrayOf)?[0], Is.EqualTo(12.345)); - Assert.That((structure["y", 0, 0] as ICharArray)?.String, Is.EqualTo("abc")); - Assert.That((structure["x", 1, 0] as ICharArray)?.String, Is.EqualTo("xyz")); - Assert.That(structure["y", 1, 0].IsEmpty, Is.True); - Assert.That((structure["x", 0, 1] as IArrayOf)?[0], Is.EqualTo(2.0)); - Assert.That((structure["y", 0, 1] as IArrayOf)?[0], Is.EqualTo(13.0)); - Assert.That(structure["x", 1, 1].IsEmpty, Is.True); - Assert.That((structure["y", 1, 1] as ICharArray)?[0, 0], Is.EqualTo('a')); - Assert.That(((structure["x", 0, 2] as ICellArray)?[0] as ICharArray)?.String, Is.EqualTo("x")); - Assert.That(((structure["x", 0, 2] as ICellArray)?[1] as ICharArray)?.String, Is.EqualTo("yz")); - Assert.That((structure["y", 0, 2] as IArrayOf)?.Dimensions, Is.EqualTo(new[] { 2, 3 })); - Assert.That((structure["y", 0, 2] as IArrayOf)?[0, 2], Is.EqualTo(3.0)); - Assert.That((structure["x", 1, 2] as IArrayOf)?[0], Is.EqualTo(1.5f)); - Assert.That(structure["y", 1, 2].IsEmpty, Is.True); - } - - /// - /// Test reading a sparse array. - /// - [Test] - public void TestSparse() - { - var matFile = ReadHdfTestFile("sparse"); - var sparseArray = matFile["sparse_"].Value as ISparseArrayOf; - Assert.That(sparseArray, Is.Not.Null); - Assert.That(sparseArray.Dimensions, Is.EqualTo(new[] { 4, 5 })); - Assert.That(sparseArray.Data[(1, 1)], Is.EqualTo(1.0)); - Assert.That(sparseArray[1, 1], Is.EqualTo(1.0)); - Assert.That(sparseArray[1, 2], Is.EqualTo(2.0)); - Assert.That(sparseArray[2, 1], Is.EqualTo(3.0)); - Assert.That(sparseArray[2, 3], Is.EqualTo(4.0)); - Assert.That(sparseArray[0, 4], Is.EqualTo(0.0)); - Assert.That(sparseArray[3, 0], Is.EqualTo(0.0)); - Assert.That(sparseArray[3, 4], Is.EqualTo(0.0)); - } - - /// - /// Test reading a logical array. - /// - [Test] - public void TestLogical() - { - var matFile = ReadHdfTestFile("logical"); - var array = matFile["logical_"].Value; - var logicalArray = array as IArrayOf; - Assert.That(logicalArray, Is.Not.Null); - Assert.That(logicalArray[0, 0], Is.True); - Assert.That(logicalArray[0, 1], Is.True); - Assert.That(logicalArray[0, 2], Is.False); - Assert.That(logicalArray[1, 0], Is.False); - Assert.That(logicalArray[1, 1], Is.True); - Assert.That(logicalArray[1, 2], Is.True); - } - - /// - /// Test reading a sparse complex array. - /// - [Test] - public void TextSparseComplex() - { - var matFile = ReadHdfTestFile("sparse_complex"); - var array = matFile["sparse_complex"].Value; - var sparseArray = array as ISparseArrayOf; - Assert.That(sparseArray, Is.Not.Null); - Assert.That(sparseArray[0, 0], Is.EqualTo(-1.5 + (2.5 * Complex.ImaginaryOne))); - Assert.That(sparseArray[1, 0], Is.EqualTo(2 - (3 * Complex.ImaginaryOne))); - Assert.That(sparseArray[0, 1], Is.EqualTo(Complex.Zero)); - Assert.That(sparseArray[1, 1], Is.EqualTo(0.5 + (1.0 * Complex.ImaginaryOne))); - } - - /// - /// Test reading a sparse logical array. - /// - [Test] - public void TestSparseLogical() - { - var matFile = ReadHdfTestFile("sparse_logical"); - var array = matFile["sparse_logical"].Value; - var sparseArray = array as ISparseArrayOf; - Assert.That(sparseArray, Is.Not.Null); - Assert.That(sparseArray.Data[(0, 0)], Is.True); - Assert.That(sparseArray[0, 0], Is.True); - Assert.That(sparseArray[0, 1], Is.True); - Assert.That(sparseArray[0, 2], Is.False); - Assert.That(sparseArray[1, 0], Is.False); - Assert.That(sparseArray[1, 1], Is.True); - Assert.That(sparseArray[1, 2], Is.True); - } - - /// - /// Test reading a global variable. - /// - [Test] - public void TestGlobal() - { - var matFile = ReadHdfTestFile("global"); - var variable = matFile.Variables.First(); - Assert.That(variable.IsGlobal, Is.True); - } - - private static void CheckComplexLimits(IArrayOf> array, T[] limits) - where T : struct - { - Assert.That(array, Is.Not.Null); - Assert.That(array.Dimensions, Is.EqualTo(new[] { 1, 2 })); - Assert.That(array[0], Is.EqualTo(new ComplexOf(limits[0], limits[1]))); - Assert.That(array[1], Is.EqualTo(new ComplexOf(limits[1], limits[0]))); - } - - private static void CheckLimits(IArrayOf array, T[] limits) - where T : struct - { - Assert.That(array, Is.Not.Null); - Assert.That(array.Dimensions, Is.EqualTo(new[] { 1, 2 })); - Assert.That(array.Data, Is.EqualTo(limits)); - } - - private static AbstractTestDataFactory GetTests(string factoryName) => - new MatTestDataFactory(Path.Combine(TestDirectory, factoryName)); - - private IMatFile ReadHdfTestFile(string testName) - { - return GetTests("hdf")[testName]; - } - } -} diff --git a/MatFileHandler.Tests/MatFileReaderLevel5Tests.cs b/MatFileHandler.Tests/MatFileReaderTests.cs similarity index 77% rename from MatFileHandler.Tests/MatFileReaderLevel5Tests.cs rename to MatFileHandler.Tests/MatFileReaderTests.cs index 188be0f..21ce2ec 100644 --- a/MatFileHandler.Tests/MatFileReaderLevel5Tests.cs +++ b/MatFileHandler.Tests/MatFileReaderTests.cs @@ -12,64 +12,35 @@ namespace MatFileHandler.Tests /// Tests of file reading API (Level 5 cases). /// [TestFixture] - public class MatFileReaderLevel5Tests + public class MatFileReaderTests { private const string TestDirectory = "test-data"; /// - /// Test reading all files in a given test set. + /// Test reading an ASCII-encoded string. /// - /// Name of the set. - [TestCase("level5")] - public void TestReader(string testSet) + /// Test case name. + [TestCase("level5/ascii")] + [TestCase("hdf/ascii")] + public void TestAscii(string testCaseName) { - foreach (var matFile in GetTests(testSet).GetAllTestData()) - { - Assert.That(matFile.Variables, Is.Not.Empty); - } - } - - /// - /// Test reading lower and upper limits of integer data types. - /// - [Test] - public void TestLimits() - { - var matFile = ReadLevel5TestFile("limits"); - IArray array; - array = matFile["int8_"].Value; - CheckLimits(array as IArrayOf, CommonData.Int8Limits); - Assert.That(array.ConvertToDoubleArray(), Is.EqualTo(new[] { -128.0, 127.0 })); - - array = matFile["uint8_"].Value; - CheckLimits(array as IArrayOf, CommonData.UInt8Limits); - - array = matFile["int16_"].Value; - CheckLimits(array as IArrayOf, CommonData.Int16Limits); - - array = matFile["uint16_"].Value; - CheckLimits(array as IArrayOf, CommonData.UInt16Limits); - - array = matFile["int32_"].Value; - CheckLimits(array as IArrayOf, CommonData.Int32Limits); - - array = matFile["uint32_"].Value; - CheckLimits(array as IArrayOf, CommonData.UInt32Limits); - - array = matFile["int64_"].Value; - CheckLimits(array as IArrayOf, CommonData.Int64Limits); - - array = matFile["uint64_"].Value; - CheckLimits(array as IArrayOf, CommonData.UInt64Limits); + var matFile = GetTestCase(testCaseName); + var arrayAscii = matFile["s"].Value as ICharArray; + Assert.That(arrayAscii, Is.Not.Null); + Assert.That(arrayAscii.Dimensions, Is.EqualTo(new[] { 1, 3 })); + Assert.That(arrayAscii.String, Is.EqualTo("abc")); + Assert.That(arrayAscii[2], Is.EqualTo('c')); } /// /// Test writing lower and upper limits of integer-based complex data types. /// - [Test] - public void TestComplexLimits() + /// Test case name. + [TestCase("level5/limits_complex")] + [TestCase("hdf/limits_complex")] + public void TestComplexLimits(string testCaseName) { - var matFile = ReadLevel5TestFile("limits_complex"); + var matFile = GetTestCase(testCaseName); IArray array; array = matFile["int8_complex"].Value; CheckComplexLimits(array as IArrayOf>, CommonData.Int8Limits); @@ -100,136 +71,174 @@ namespace MatFileHandler.Tests } /// - /// Test reading an ASCII-encoded string. + /// Test reading a two-dimensional complex array. /// - [Test] - public void TestAscii() + /// Test case name. + [TestCase("level5/matrix_complex")] + [TestCase("hdf/matrix_complex")] + public void TestComplexMatrix(string testCaseName) { - var matFile = ReadLevel5TestFile("ascii"); - var arrayAscii = matFile["s"].Value as ICharArray; - Assert.That(arrayAscii, Is.Not.Null); - Assert.That(arrayAscii.Dimensions, Is.EqualTo(new[] { 1, 3 })); - Assert.That(arrayAscii.String, Is.EqualTo("abc")); - Assert.That(arrayAscii[2], Is.EqualTo('c')); - } - - /// - /// Test reading a Unicode string. - /// - [Test] - public void TestUnicode() - { - var matFile = ReadLevel5TestFile("unicode"); - var arrayUnicode = matFile["s"].Value as ICharArray; - Assert.That(arrayUnicode, Is.Not.Null); - Assert.That(arrayUnicode.Dimensions, Is.EqualTo(new[] { 1, 2 })); - Assert.That(arrayUnicode.String, Is.EqualTo("必フ")); - Assert.That(arrayUnicode[0], Is.EqualTo('必')); - Assert.That(arrayUnicode[1], Is.EqualTo('フ')); - } - - /// - /// Test reading a wide Unicode string. - /// - [Test] - public void TestUnicodeWide() - { - var matFile = ReadLevel5TestFile("unicode-wide"); - var arrayUnicodeWide = matFile["s"].Value as ICharArray; - Assert.That(arrayUnicodeWide, Is.Not.Null); - Assert.That(arrayUnicodeWide.Dimensions, Is.EqualTo(new[] { 1, 2 })); - Assert.That(arrayUnicodeWide.String, Is.EqualTo("🍆")); - } - - /// - /// Test converting a structure array to a Double array. - /// - /// Should return null. - [Test(ExpectedResult = null)] - public double[] TestConvertToDoubleArray() - { - var matFile = ReadLevel5TestFile("struct"); - var array = matFile.Variables[0].Value; - return array.ConvertToDoubleArray(); + var matFile = GetTestCase(testCaseName); + var matrix = matFile["matrix"].Value as IArrayOf; + Assert.That(matrix.Dimensions, Is.EqualTo(new[] { 3, 2 })); + Assert.That(matrix.ConvertToComplexArray(), Is.EqualTo(new[] + { + new Complex(1.0, 4.0), + new Complex(3.0, 1.0), + new Complex(5.0, 0.25), + new Complex(2.0, 2.0), + new Complex(4.0, 0.5), + new Complex(6.0, 0.125), + })); + Assert.That(matrix[0, 0], Is.EqualTo(new Complex(1.0, 4.0))); + Assert.That(matrix[0, 1], Is.EqualTo(new Complex(2.0, 2.0))); + Assert.That(matrix[1, 0], Is.EqualTo(new Complex(3.0, 1.0))); + Assert.That(matrix[1, 1], Is.EqualTo(new Complex(4.0, 0.5))); + Assert.That(matrix[2, 0], Is.EqualTo(new Complex(5.0, 0.25))); + Assert.That(matrix[2, 1], Is.EqualTo(new Complex(6.0, 0.125))); } /// /// Test converting a structure array to a Complex array. /// - /// Should return null. - [Test(ExpectedResult = null)] - public Complex[] TestConvertToComplexArray() + /// Test case name. + [TestCase("level5/struct")] + [TestCase("hdf/struct")] + public void TestConvertToComplexArray(string testCaseName) { - var matFile = ReadLevel5TestFile("struct"); + var matFile = GetTestCase(testCaseName); var array = matFile.Variables[0].Value; - return array.ConvertToComplexArray(); + Assert.IsNull(array.ConvertToComplexArray()); } /// - /// Test reading a structure array. + /// Test converting a structure array to a Double array. /// - [Test] - public void TestStruct() + /// Test case name. + [TestCase("level5/struct")] + [TestCase("hdf/struct")] + public void TestConvertToDoubleArray(string testCaseName) { - var matFile = ReadLevel5TestFile("struct"); - var structure = matFile["struct_"].Value as IStructureArray; - Assert.That(structure, Is.Not.Null); - Assert.That(structure.FieldNames, Is.EquivalentTo(new[] { "x", "y" })); - var element = structure[0, 0]; - Assert.That(element.ContainsKey("x"), Is.True); - Assert.That(element.Count, Is.EqualTo(2)); - Assert.That(element.TryGetValue("x", out var _), Is.True); - Assert.That(element.TryGetValue("z", out var _), Is.False); - Assert.That(element.Keys, Has.Exactly(2).Items); - Assert.That(element.Values, Has.Exactly(2).Items); - var keys = element.Select(pair => pair.Key); - Assert.That(keys, Is.EquivalentTo(new[] { "x", "y" })); - - Assert.That((element["x"] as IArrayOf)?[0], Is.EqualTo(12.345)); - - Assert.That((structure["x", 0, 0] as IArrayOf)?[0], Is.EqualTo(12.345)); - Assert.That((structure["y", 0, 0] as ICharArray)?.String, Is.EqualTo("abc")); - Assert.That((structure["x", 1, 0] as ICharArray)?.String, Is.EqualTo("xyz")); - Assert.That(structure["y", 1, 0].IsEmpty, Is.True); - Assert.That((structure["x", 0, 1] as IArrayOf)?[0], Is.EqualTo(2.0)); - Assert.That((structure["y", 0, 1] as IArrayOf)?[0], Is.EqualTo(13.0)); - Assert.That(structure["x", 1, 1].IsEmpty, Is.True); - Assert.That((structure["y", 1, 1] as ICharArray)?[0, 0], Is.EqualTo('a')); - Assert.That(((structure["x", 0, 2] as ICellArray)?[0] as ICharArray)?.String, Is.EqualTo("x")); - Assert.That(((structure["x", 0, 2] as ICellArray)?[1] as ICharArray)?.String, Is.EqualTo("yz")); - Assert.That((structure["y", 0, 2] as IArrayOf)?.Dimensions, Is.EqualTo(new[] { 2, 3 })); - Assert.That((structure["y", 0, 2] as IArrayOf)?[0, 2], Is.EqualTo(3.0)); - Assert.That((structure["x", 1, 2] as IArrayOf)?[0], Is.EqualTo(1.5f)); - Assert.That(structure["y", 1, 2].IsEmpty, Is.True); + var matFile = GetTestCase(testCaseName); + var array = matFile.Variables[0].Value; + Assert.IsNull(array.ConvertToDoubleArray()); } /// - /// Test reading a sparse array. + /// Test datetime objects. /// [Test] - public void TestSparse() + public void TestDatetime() { - var matFile = ReadLevel5TestFile("sparse"); - var sparseArray = matFile["sparse_"].Value as ISparseArrayOf; - Assert.That(sparseArray, Is.Not.Null); - Assert.That(sparseArray.Dimensions, Is.EqualTo(new[] { 4, 5 })); - Assert.That(sparseArray.Data[(1, 1)], Is.EqualTo(1.0)); - Assert.That(sparseArray[1, 1], Is.EqualTo(1.0)); - Assert.That(sparseArray[1, 2], Is.EqualTo(2.0)); - Assert.That(sparseArray[2, 1], Is.EqualTo(3.0)); - Assert.That(sparseArray[2, 3], Is.EqualTo(4.0)); - Assert.That(sparseArray[0, 4], Is.EqualTo(0.0)); - Assert.That(sparseArray[3, 0], Is.EqualTo(0.0)); - Assert.That(sparseArray[3, 4], Is.EqualTo(0.0)); + var matFile = ReadLevel5TestFile("datetime"); + var d = matFile["d"].Value as IMatObject; + var datetime = new DatetimeAdapter(d); + Assert.That(datetime.Dimensions, Is.EquivalentTo(new[] { 1, 2 })); + Assert.That(datetime[0], Is.EqualTo(new DateTimeOffset(2000, 1, 1, 0, 0, 0, TimeSpan.Zero))); + Assert.That(datetime[1], Is.EqualTo(new DateTimeOffset(1987, 1, 2, 3, 4, 5, TimeSpan.Zero))); + } + + /// + /// Test unrepresentable datetime. + /// + [Test] + public void TestDatetime_Unrepresentable() + { + var matFile = ReadLevel5TestFile("datetime-unrepresentable"); + var obj = matFile["d"].Value as IMatObject; + var datetime = new DatetimeAdapter(obj); + var d0 = datetime[0]; + Assert.That(d0, Is.Null); + } + + /// + /// Another test for datetime objects. + /// + [Test] + public void TestDatetime2() + { + var matFile = ReadLevel5TestFile("datetime2"); + var d = matFile["d"].Value as IMatObject; + var datetime = new DatetimeAdapter(d); + Assert.That(datetime.Dimensions, Is.EquivalentTo(new[] { 1, 1 })); + var diff = new DateTimeOffset(2, 1, 1, 1, 1, 1, 235, TimeSpan.Zero); + Assert.That(datetime[0] - diff < TimeSpan.FromMilliseconds(1)); + Assert.That(diff - datetime[0] < TimeSpan.FromMilliseconds(1)); + } + + /// + /// Test duration objects. + /// + [Test] + public void TestDuration() + { + var matFile = ReadLevel5TestFile("duration"); + var d = matFile["d"].Value as IMatObject; + var duration = new DurationAdapter(d); + Assert.That(duration.Dimensions, Is.EquivalentTo(new[] { 1, 3 })); + Assert.That(duration[0], Is.EqualTo(TimeSpan.FromTicks(12345678L))); + Assert.That(duration[1], Is.EqualTo(new TimeSpan(0, 2, 4))); + Assert.That(duration[2], Is.EqualTo(new TimeSpan(1, 3, 5))); + } + + /// + /// Test reading a global variable. + /// + /// Test case name. + [TestCase("level5/global")] + [TestCase("hdf/global")] + public void TestGlobal(string testCaseName) + { + var matFile = GetTestCase(testCaseName); + var variable = matFile.Variables.First(); + Assert.That(variable.IsGlobal, Is.True); + } + + /// + /// Test reading lower and upper limits of integer data types. + /// + /// Test case name. + [TestCase("level5/limits")] + [TestCase("hdf/limits")] + public void TestLimits(string testCaseName) + { + var matFile = GetTestCase(testCaseName); + IArray array; + array = matFile["int8_"].Value; + CheckLimits(array as IArrayOf, CommonData.Int8Limits); + Assert.That(array.ConvertToDoubleArray(), Is.EqualTo(new[] { -128.0, 127.0 })); + + array = matFile["uint8_"].Value; + CheckLimits(array as IArrayOf, CommonData.UInt8Limits); + + array = matFile["int16_"].Value; + CheckLimits(array as IArrayOf, CommonData.Int16Limits); + + array = matFile["uint16_"].Value; + CheckLimits(array as IArrayOf, CommonData.UInt16Limits); + + array = matFile["int32_"].Value; + CheckLimits(array as IArrayOf, CommonData.Int32Limits); + + array = matFile["uint32_"].Value; + CheckLimits(array as IArrayOf, CommonData.UInt32Limits); + + array = matFile["int64_"].Value; + CheckLimits(array as IArrayOf, CommonData.Int64Limits); + + array = matFile["uint64_"].Value; + CheckLimits(array as IArrayOf, CommonData.UInt64Limits); } /// /// Test reading a logical array. /// - [Test] - public void TestLogical() + /// Test case name. + [TestCase("level5/logical")] + [TestCase("hdf/logical")] + public void TestLogical(string testCaseName) { - var matFile = ReadLevel5TestFile("logical"); + var matFile = GetTestCase(testCaseName); var array = matFile["logical_"].Value; var logicalArray = array as IArrayOf; Assert.That(logicalArray, Is.Not.Null); @@ -242,49 +251,41 @@ namespace MatFileHandler.Tests } /// - /// Test reading a sparse logical array. + /// Test reading a two-dimensional double array. /// - [Test] - public void TestSparseLogical() + /// Test case name. + [TestCase("level5/matrix")] + [TestCase("hdf/matrix")] + public void TestMatrix(string testCaseName) { - var matFile = ReadLevel5TestFile("sparse_logical"); - var array = matFile["sparse_logical"].Value; - var sparseArray = array as ISparseArrayOf; - Assert.That(sparseArray, Is.Not.Null); - Assert.That(sparseArray.Data[(0, 0)], Is.True); - Assert.That(sparseArray[0, 0], Is.True); - Assert.That(sparseArray[0, 1], Is.True); - Assert.That(sparseArray[0, 2], Is.False); - Assert.That(sparseArray[1, 0], Is.False); - Assert.That(sparseArray[1, 1], Is.True); - Assert.That(sparseArray[1, 2], Is.True); + var matFile = GetTestCase(testCaseName); + var matrix = matFile["matrix"].Value as IArrayOf; + Assert.That(matrix.Dimensions, Is.EqualTo(new[] { 3, 2 })); + Assert.That(matrix.ConvertToDoubleArray(), Is.EqualTo(new[] { 1.0, 3.0, 5.0, 2.0, 4.0, 6.0 })); + Assert.That(matrix[0, 0], Is.EqualTo(1.0)); + Assert.That(matrix[0, 1], Is.EqualTo(2.0)); + Assert.That(matrix[1, 0], Is.EqualTo(3.0)); + Assert.That(matrix[1, 1], Is.EqualTo(4.0)); + Assert.That(matrix[2, 0], Is.EqualTo(5.0)); + Assert.That(matrix[2, 1], Is.EqualTo(6.0)); } /// - /// Test reading a global variable. + /// Test nested objects. /// [Test] - public void TestGlobal() + public void TestNestedObjects() { - var matFile = ReadLevel5TestFile("global"); - var variable = matFile.Variables.First(); - Assert.That(variable.IsGlobal, Is.True); - } - - /// - /// Test reading a sparse complex array. - /// - [Test] - public void TextSparseComplex() - { - var matFile = ReadLevel5TestFile("sparse_complex"); - var array = matFile["sparse_complex"].Value; - var sparseArray = array as ISparseArrayOf; - Assert.That(sparseArray, Is.Not.Null); - Assert.That(sparseArray[0, 0], Is.EqualTo(-1.5 + (2.5 * Complex.ImaginaryOne))); - Assert.That(sparseArray[1, 0], Is.EqualTo(2 - (3 * Complex.ImaginaryOne))); - Assert.That(sparseArray[0, 1], Is.EqualTo(Complex.Zero)); - Assert.That(sparseArray[1, 1], Is.EqualTo(0.5 + (1.0 * Complex.ImaginaryOne))); + var matFile = ReadLevel5TestFile("subsubPoint"); + var p = matFile["p"].Value as IMatObject; + Assert.That(p.ClassName, Is.EqualTo("Point")); + Assert.That(p["x"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 1.0 })); + var pp = p["y"] as IMatObject; + Assert.That(pp.ClassName == "Point"); + Assert.That(pp["x"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 10.0 })); + var ppp = pp["y"] as IMatObject; + Assert.That(ppp["x"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 100.0 })); + Assert.That(ppp["y"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 200.0 })); } /// @@ -328,24 +329,116 @@ namespace MatFileHandler.Tests } /// - /// Test reading a table. + /// Test reading all files in a given test set. + /// + /// Name of the set. + [TestCase("level5")] + [TestCase("hdf")] + public void TestReader(string testSet) + { + foreach (var matFile in GetTests(testSet).GetAllTestData()) + { + Assert.That(matFile.Variables, Is.Not.Empty); + } + } + + /// + /// Test reading a sparse array. + /// + /// Test case name. + [TestCase("level5/sparse")] + [TestCase("hdf/sparse")] + public void TestSparse(string testCaseName) + { + var matFile = GetTestCase(testCaseName); + var sparseArray = matFile["sparse_"].Value as ISparseArrayOf; + Assert.That(sparseArray, Is.Not.Null); + Assert.That(sparseArray.Dimensions, Is.EqualTo(new[] { 4, 5 })); + Assert.That(sparseArray.Data[(1, 1)], Is.EqualTo(1.0)); + Assert.That(sparseArray[1, 1], Is.EqualTo(1.0)); + Assert.That(sparseArray[1, 2], Is.EqualTo(2.0)); + Assert.That(sparseArray[2, 1], Is.EqualTo(3.0)); + Assert.That(sparseArray[2, 3], Is.EqualTo(4.0)); + Assert.That(sparseArray[0, 4], Is.EqualTo(0.0)); + Assert.That(sparseArray[3, 0], Is.EqualTo(0.0)); + Assert.That(sparseArray[3, 4], Is.EqualTo(0.0)); + } + + /// + /// Test reading a sparse logical array. + /// + /// Test case name. + [TestCase("level5/sparse_logical")] + [TestCase("hdf/sparse_logical")] + public void TestSparseLogical(string testCaseName) + { + var matFile = GetTestCase(testCaseName); + var array = matFile["sparse_logical"].Value; + var sparseArray = array as ISparseArrayOf; + Assert.That(sparseArray, Is.Not.Null); + Assert.That(sparseArray.Data[(0, 0)], Is.True); + Assert.That(sparseArray[0, 0], Is.True); + Assert.That(sparseArray[0, 1], Is.True); + Assert.That(sparseArray[0, 2], Is.False); + Assert.That(sparseArray[1, 0], Is.False); + Assert.That(sparseArray[1, 1], Is.True); + Assert.That(sparseArray[1, 2], Is.True); + } + + /// + /// Test string objects. /// [Test] - public void TestTable() + public void TestString() { - var matFile = ReadLevel5TestFile("table"); - var obj = matFile["table_"].Value as IMatObject; - var table = new TableAdapter(obj); - Assert.That(table.NumberOfRows, Is.EqualTo(3)); - Assert.That(table.NumberOfVariables, Is.EqualTo(2)); - Assert.That(table.Description, Is.EqualTo("Some table")); - Assert.That(table.VariableNames, Is.EqualTo(new[] { "variable1", "variable2" })); - var variable1 = table["variable1"] as ICellArray; - Assert.That((variable1[0] as ICharArray).String, Is.EqualTo("First row")); - Assert.That((variable1[1] as ICharArray).String, Is.EqualTo("Second row")); - Assert.That((variable1[2] as ICharArray).String, Is.EqualTo("Third row")); - var variable2 = table["variable2"]; - Assert.That(variable2.ConvertToDoubleArray(), Is.EqualTo(new[] { 1.0, 3.0, 5.0, 2.0, 4.0, 6.0 })); + var matFile = ReadLevel5TestFile("string"); + var s = matFile["s"].Value as IMatObject; + var str = new StringAdapter(s); + Assert.That(str.Dimensions, Is.EquivalentTo(new[] { 4, 1 })); + Assert.That(str[0], Is.EqualTo("abc")); + Assert.That(str[1], Is.EqualTo("defgh")); + Assert.That(str[2], Is.EqualTo("абвгд")); + Assert.That(str[3], Is.EqualTo("æøå")); + } + + /// + /// Test reading a structure array. + /// + /// Test case name. + [TestCase("level5/struct")] + [TestCase("hdf/struct")] + public void TestStruct(string testCaseName) + { + var matFile = GetTestCase(testCaseName); + var structure = matFile["struct_"].Value as IStructureArray; + Assert.That(structure, Is.Not.Null); + Assert.That(structure.FieldNames, Is.EquivalentTo(new[] { "x", "y" })); + var element = structure[0, 0]; + Assert.That(element.ContainsKey("x"), Is.True); + Assert.That(element.Count, Is.EqualTo(2)); + Assert.That(element.TryGetValue("x", out var _), Is.True); + Assert.That(element.TryGetValue("z", out var _), Is.False); + Assert.That(element.Keys, Has.Exactly(2).Items); + Assert.That(element.Values, Has.Exactly(2).Items); + var keys = element.Select(pair => pair.Key); + Assert.That(keys, Is.EquivalentTo(new[] { "x", "y" })); + + Assert.That((element["x"] as IArrayOf)?[0], Is.EqualTo(12.345)); + + Assert.That((structure["x", 0, 0] as IArrayOf)?[0], Is.EqualTo(12.345)); + Assert.That((structure["y", 0, 0] as ICharArray)?.String, Is.EqualTo("abc")); + Assert.That((structure["x", 1, 0] as ICharArray)?.String, Is.EqualTo("xyz")); + Assert.That(structure["y", 1, 0].IsEmpty, Is.True); + Assert.That((structure["x", 0, 1] as IArrayOf)?[0], Is.EqualTo(2.0)); + Assert.That((structure["y", 0, 1] as IArrayOf)?[0], Is.EqualTo(13.0)); + Assert.That(structure["x", 1, 1].IsEmpty, Is.True); + Assert.That((structure["y", 1, 1] as ICharArray)?[0, 0], Is.EqualTo('a')); + Assert.That(((structure["x", 0, 2] as ICellArray)?[0] as ICharArray)?.String, Is.EqualTo("x")); + Assert.That(((structure["x", 0, 2] as ICellArray)?[1] as ICharArray)?.String, Is.EqualTo("yz")); + Assert.That((structure["y", 0, 2] as IArrayOf)?.Dimensions, Is.EqualTo(new[] { 2, 3 })); + Assert.That((structure["y", 0, 2] as IArrayOf)?[0, 2], Is.EqualTo(3.0)); + Assert.That((structure["x", 1, 2] as IArrayOf)?[0], Is.EqualTo(1.5f)); + Assert.That(structure["y", 1, 2].IsEmpty, Is.True); } /// @@ -372,105 +465,74 @@ namespace MatFileHandler.Tests } /// - /// Test nested objects. + /// Test reading a table. /// [Test] - public void TestNestedObjects() + public void TestTable() { - var matFile = ReadLevel5TestFile("subsubPoint"); - var p = matFile["p"].Value as IMatObject; - Assert.That(p.ClassName, Is.EqualTo("Point")); - Assert.That(p["x"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 1.0 })); - var pp = p["y"] as IMatObject; - Assert.That(pp.ClassName == "Point"); - Assert.That(pp["x"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 10.0 })); - var ppp = pp["y"] as IMatObject; - Assert.That(ppp["x"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 100.0 })); - Assert.That(ppp["y"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 200.0 })); + var matFile = ReadLevel5TestFile("table"); + var obj = matFile["table_"].Value as IMatObject; + var table = new TableAdapter(obj); + Assert.That(table.NumberOfRows, Is.EqualTo(3)); + Assert.That(table.NumberOfVariables, Is.EqualTo(2)); + Assert.That(table.Description, Is.EqualTo("Some table")); + Assert.That(table.VariableNames, Is.EqualTo(new[] { "variable1", "variable2" })); + var variable1 = table["variable1"] as ICellArray; + Assert.That((variable1[0] as ICharArray).String, Is.EqualTo("First row")); + Assert.That((variable1[1] as ICharArray).String, Is.EqualTo("Second row")); + Assert.That((variable1[2] as ICharArray).String, Is.EqualTo("Third row")); + var variable2 = table["variable2"]; + Assert.That(variable2.ConvertToDoubleArray(), Is.EqualTo(new[] { 1.0, 3.0, 5.0, 2.0, 4.0, 6.0 })); } /// - /// Test datetime objects. + /// Test reading a Unicode string. /// - [Test] - public void TestDatetime() + /// Test case name. + [TestCase("level5/unicode")] + [TestCase("hdf/unicode")] + public void TestUnicode(string testCaseName) { - var matFile = ReadLevel5TestFile("datetime"); - var d = matFile["d"].Value as IMatObject; - var datetime = new DatetimeAdapter(d); - Assert.That(datetime.Dimensions, Is.EquivalentTo(new[] { 1, 2 })); - Assert.That(datetime[0], Is.EqualTo(new DateTimeOffset(2000, 1, 1, 0, 0, 0, TimeSpan.Zero))); - Assert.That(datetime[1], Is.EqualTo(new DateTimeOffset(1987, 1, 2, 3, 4, 5, TimeSpan.Zero))); + var matFile = GetTestCase(testCaseName); + var arrayUnicode = matFile["s"].Value as ICharArray; + Assert.That(arrayUnicode, Is.Not.Null); + Assert.That(arrayUnicode.Dimensions, Is.EqualTo(new[] { 1, 2 })); + Assert.That(arrayUnicode.String, Is.EqualTo("必フ")); + Assert.That(arrayUnicode[0], Is.EqualTo('必')); + Assert.That(arrayUnicode[1], Is.EqualTo('フ')); } /// - /// Another test for datetime objects. + /// Test reading a wide Unicode string. /// - [Test] - public void TestDatetime2() + /// Test case name. + [TestCase("level5/unicode-wide")] + [TestCase("hdf/unicode-wide")] + public void TestUnicodeWide(string testCaseName) { - var matFile = ReadLevel5TestFile("datetime2"); - var d = matFile["d"].Value as IMatObject; - var datetime = new DatetimeAdapter(d); - Assert.That(datetime.Dimensions, Is.EquivalentTo(new[] { 1, 1 })); - var diff = new DateTimeOffset(2, 1, 1, 1, 1, 1, 235, TimeSpan.Zero); - Assert.That(datetime[0] - diff < TimeSpan.FromMilliseconds(1)); - Assert.That(diff - datetime[0] < TimeSpan.FromMilliseconds(1)); + var matFile = GetTestCase(testCaseName); + var arrayUnicodeWide = matFile["s"].Value as ICharArray; + Assert.That(arrayUnicodeWide, Is.Not.Null); + Assert.That(arrayUnicodeWide.Dimensions, Is.EqualTo(new[] { 1, 2 })); + Assert.That(arrayUnicodeWide.String, Is.EqualTo("🍆")); } /// - /// Test string objects. + /// Test reading a sparse complex array. /// - [Test] - public void TestString() + /// Test case name. + [TestCase("level5/sparse_complex")] + [TestCase("hdf/sparse_complex")] + public void TextSparseComplex(string testCaseName) { - var matFile = ReadLevel5TestFile("string"); - var s = matFile["s"].Value as IMatObject; - var str = new StringAdapter(s); - Assert.That(str.Dimensions, Is.EquivalentTo(new[] { 4, 1 })); - Assert.That(str[0], Is.EqualTo("abc")); - Assert.That(str[1], Is.EqualTo("defgh")); - Assert.That(str[2], Is.EqualTo("абвгд")); - Assert.That(str[3], Is.EqualTo("æøå")); - } - - /// - /// Test duration objects. - /// - [Test] - public void TestDuration() - { - var matFile = ReadLevel5TestFile("duration"); - var d = matFile["d"].Value as IMatObject; - var duration = new DurationAdapter(d); - Assert.That(duration.Dimensions, Is.EquivalentTo(new[] { 1, 3 })); - Assert.That(duration[0], Is.EqualTo(TimeSpan.FromTicks(12345678L))); - Assert.That(duration[1], Is.EqualTo(new TimeSpan(0, 2, 4))); - Assert.That(duration[2], Is.EqualTo(new TimeSpan(1, 3, 5))); - } - - /// - /// Test unrepresentable datetime. - /// - [Test] - public void TestDatetime_Unrepresentable() - { - var matFile = ReadLevel5TestFile("datetime-unrepresentable"); - var obj = matFile["d"].Value as IMatObject; - var datetime = new DatetimeAdapter(obj); - var d0 = datetime[0]; - Assert.That(d0, Is.Null); - } - - private static AbstractTestDataFactory GetTests(string factoryName) => - new MatTestDataFactory(Path.Combine(TestDirectory, factoryName)); - - private static void CheckLimits(IArrayOf array, T[] limits) - where T : struct - { - Assert.That(array, Is.Not.Null); - Assert.That(array.Dimensions, Is.EqualTo(new[] { 1, 2 })); - Assert.That(array.Data, Is.EqualTo(limits)); + var matFile = GetTestCase(testCaseName); + var array = matFile["sparse_complex"].Value; + var sparseArray = array as ISparseArrayOf; + Assert.That(sparseArray, Is.Not.Null); + Assert.That(sparseArray[0, 0], Is.EqualTo(-1.5 + (2.5 * Complex.ImaginaryOne))); + Assert.That(sparseArray[1, 0], Is.EqualTo(2 - (3 * Complex.ImaginaryOne))); + Assert.That(sparseArray[0, 1], Is.EqualTo(Complex.Zero)); + Assert.That(sparseArray[1, 1], Is.EqualTo(0.5 + (1.0 * Complex.ImaginaryOne))); } private static void CheckComplexLimits(IArrayOf> array, T[] limits) @@ -482,6 +544,23 @@ namespace MatFileHandler.Tests Assert.That(array[1], Is.EqualTo(new ComplexOf(limits[1], limits[0]))); } + private static void CheckLimits(IArrayOf array, T[] limits) + where T : struct + { + Assert.That(array, Is.Not.Null); + Assert.That(array.Dimensions, Is.EqualTo(new[] { 1, 2 })); + Assert.That(array.Data, Is.EqualTo(limits)); + } + + private static IMatFile GetTestCase(string testCaseName) + { + var parts = testCaseName.Split('/'); + return GetTests(parts[0])[parts[1]]; + } + + private static AbstractTestDataFactory GetTests(string factoryName) => + new MatTestDataFactory(Path.Combine(TestDirectory, factoryName)); + private IMatFile ReadLevel5TestFile(string testName) { return GetTests("level5")[testName]; diff --git a/MatFileHandler.Tests/test-data/level5/matrix.mat b/MatFileHandler.Tests/test-data/level5/matrix.mat new file mode 100644 index 0000000000000000000000000000000000000000..6f7006ff6f5bff48e440f76a039027a8c6fe5df0 GIT binary patch literal 184 zcmeZu4DoSvQZUssQ1EpO(M`+DN!3vZ$Vn_o%P-2cQV4Jk_w+L}(NS}aZCnOXwB$+8Z pYq+Fvfa|F-v!SqnvD4EcVec*@ZG|KSJ7r^SVeScx454qB^#I3`Dn$SQ literal 0 HcmV?d00001 diff --git a/MatFileHandler.Tests/test-data/level5/matrix_complex.mat b/MatFileHandler.Tests/test-data/level5/matrix_complex.mat new file mode 100644 index 0000000000000000000000000000000000000000..8227373680adcf9b66f21f4dfdb376d740612ecc GIT binary patch literal 210 zcmeZu4DoSvQZUssQ1EpO(M`+DN!3vZ$Vn_o%P-2cQV4Jk_w+L}(NS}aZCnT(3NHSA+ z#&A)Ai6dfRO`1X)Q