diff --git a/MatFileHandler.Tests/MatFileReaderTests.cs b/MatFileHandler.Tests/MatFileReaderLevel5Tests.cs
old mode 100755
new mode 100644
similarity index 91%
rename from MatFileHandler.Tests/MatFileReaderTests.cs
rename to MatFileHandler.Tests/MatFileReaderLevel5Tests.cs
index fd35342..76689bf
--- a/MatFileHandler.Tests/MatFileReaderTests.cs
+++ b/MatFileHandler.Tests/MatFileReaderLevel5Tests.cs
@@ -1,485 +1,490 @@
-// Copyright 2017-2018 Alexander Luzgarev
-
-using System;
-using System.IO;
-using System.Linq;
-using System.Numerics;
-using NUnit.Framework;
-
-namespace MatFileHandler.Tests
-{
- ///
- /// Tests of file reading API.
- ///
- [TestFixture]
- public class MatFileReaderTests
- {
- private const string TestDirectory = "test-data";
-
- ///
- /// Test reading all files in a given test set.
- ///
- /// Name of the set.
- [TestCase("good")]
- public void TestReader(string testSet)
- {
- 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 = GetTests("good")["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 = GetTests("good")["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 an ASCII-encoded string.
- ///
- [Test]
- public void TestAscii()
- {
- var matFile = GetTests("good")["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 = GetTests("good")["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 = GetTests("good")["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 = GetTests("good")["struct"];
- var array = matFile.Variables[0].Value;
- return array.ConvertToDoubleArray();
- }
-
- ///
- /// Test converting a structure array to a Complex array.
- ///
- /// Should return null.
- [Test(ExpectedResult = null)]
- public Complex[] TestConvertToComplexArray()
- {
- var matFile = GetTests("good")["struct"];
- var array = matFile.Variables[0].Value;
- return array.ConvertToComplexArray();
- }
-
- ///
- /// Test reading a structure array.
- ///
- [Test]
- public void TestStruct()
- {
- var matFile = GetTests("good")["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 = GetTests("good")["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 = GetTests("good")["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 logical array.
- ///
- [Test]
- public void TestSparseLogical()
- {
- var matFile = GetTests("good")["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 = GetTests("good")["global"];
- var variable = matFile.Variables.First();
- Assert.That(variable.IsGlobal, Is.True);
- }
-
- ///
- /// Test reading a sparse complex array.
- ///
- [Test]
- public void TextSparseComplex()
- {
- var matFile = GetTests("good")["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 an object.
- ///
- [Test]
- public void TestObject()
- {
- var matFile = GetTests("good")["object"];
- var obj = matFile["object_"].Value as IMatObject;
- Assert.IsNotNull(obj);
- Assert.That(obj.ClassName, Is.EqualTo("Point"));
- Assert.That(obj.FieldNames, Is.EquivalentTo(new[] { "x", "y" }));
- Assert.That(obj["x", 0].ConvertToDoubleArray(), Is.EqualTo(new[] { 3.0 }));
- Assert.That(obj["y", 0].ConvertToDoubleArray(), Is.EqualTo(new[] { 5.0 }));
- Assert.That(obj["x", 1].ConvertToDoubleArray(), Is.EqualTo(new[] { -2.0 }));
- Assert.That(obj["y", 1].ConvertToDoubleArray(), Is.EqualTo(new[] { 6.0 }));
- }
-
- ///
- /// Test reading another object.
- ///
- [Test]
- public void TestObject2()
- {
- var matFile = GetTests("good")["object2"];
- var obj = matFile["object2"].Value as IMatObject;
- Assert.IsNotNull(obj);
- Assert.That(obj.ClassName, Is.EqualTo("Point"));
- Assert.That(obj.FieldNames, Is.EquivalentTo(new[] { "x", "y" }));
- Assert.That(obj["x", 0, 0].ConvertToDoubleArray(), Is.EqualTo(new[] { 3.0 }));
- Assert.That(obj["y", 0, 0].ConvertToDoubleArray(), Is.EqualTo(new[] { 5.0 }));
- Assert.That(obj["x", 1, 0].ConvertToDoubleArray(), Is.EqualTo(new[] { 1.0 }));
- Assert.That(obj["y", 1, 0].ConvertToDoubleArray(), Is.EqualTo(new[] { 0.0 }));
- Assert.That(obj["x", 0, 1].ConvertToDoubleArray(), Is.EqualTo(new[] { -2.0 }));
- Assert.That(obj["y", 0, 1].ConvertToDoubleArray(), Is.EqualTo(new[] { 6.0 }));
- Assert.That(obj["x", 1, 1].ConvertToDoubleArray(), Is.EqualTo(new[] { 0.0 }));
- Assert.That(obj["y", 1, 1].ConvertToDoubleArray(), Is.EqualTo(new[] { 1.0 }));
- Assert.That(obj[0, 1]["x"].ConvertToDoubleArray(), Is.EqualTo(new[] { -2.0 }));
- Assert.That(obj[2]["x"].ConvertToDoubleArray(), Is.EqualTo(new[] { -2.0 }));
- }
-
- ///
- /// Test reading a table.
- ///
- [Test]
- public void TestTable()
- {
- var matFile = GetTests("good")["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 subobjects within objects.
- ///
- [Test]
- public void TestSubobjects()
- {
- var matFile = GetTests("good")["pointWithSubpoints"];
- var p = matFile["p"].Value as IMatObject;
- Assert.That(p.ClassName, Is.EqualTo("Point"));
- var x = p["x"] as IMatObject;
- Assert.That(x.ClassName, Is.EqualTo("SubPoint"));
- Assert.That(x.FieldNames, Is.EquivalentTo(new[] { "a", "b", "c" }));
- var y = p["y"] as IMatObject;
- Assert.That(y.ClassName, Is.EqualTo("SubPoint"));
- Assert.That(y.FieldNames, Is.EquivalentTo(new[] { "a", "b", "c" }));
- Assert.That(x["a"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 1.0 }));
- Assert.That(x["b"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 2.0 }));
- Assert.That(x["c"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 3.0 }));
- Assert.That(y["a"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 14.0 }));
- Assert.That(y["b"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 15.0 }));
- Assert.That(y["c"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 16.0 }));
- }
-
- ///
- /// Test nested objects.
- ///
- [Test]
- public void TestNestedObjects()
- {
- var matFile = GetTests("good")["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 }));
- }
-
- ///
- /// Test datetime objects.
- ///
- [Test]
- public void TestDatetime()
- {
- var matFile = GetTests("good")["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)));
- }
-
- ///
- /// Another test for datetime objects.
- ///
- [Test]
- public void TestDatetime2()
- {
- var matFile = GetTests("good")["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 string objects.
- ///
- [Test]
- public void TestString()
- {
- var matFile = GetTests("good")["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 = GetTests("good")["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 = GetTests("good")["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));
- }
-
- 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])));
- }
- }
+// Copyright 2017-2018 Alexander Luzgarev
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Numerics;
+using NUnit.Framework;
+
+namespace MatFileHandler.Tests
+{
+ ///
+ /// Tests of file reading API.
+ ///
+ [TestFixture]
+ public class MatFileReaderLevel5Tests
+ {
+ private const string TestDirectory = "test-data";
+
+ ///
+ /// Test reading all files in a given test set.
+ ///
+ /// Name of the set.
+ [TestCase("level5")]
+ public void TestReader(string testSet)
+ {
+ 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);
+ }
+
+ ///
+ /// Test writing lower and upper limits of integer-based complex data types.
+ ///
+ [Test]
+ public void TestComplexLimits()
+ {
+ var matFile = ReadLevel5TestFile("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 an ASCII-encoded string.
+ ///
+ [Test]
+ public void TestAscii()
+ {
+ 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();
+ }
+
+ ///
+ /// Test converting a structure array to a Complex array.
+ ///
+ /// Should return null.
+ [Test(ExpectedResult = null)]
+ public Complex[] TestConvertToComplexArray()
+ {
+ var matFile = ReadLevel5TestFile("struct");
+ var array = matFile.Variables[0].Value;
+ return array.ConvertToComplexArray();
+ }
+
+ ///
+ /// Test reading a structure array.
+ ///
+ [Test]
+ public void TestStruct()
+ {
+ 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);
+ }
+
+ ///
+ /// Test reading a sparse array.
+ ///
+ [Test]
+ public void TestSparse()
+ {
+ 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));
+ }
+
+ ///
+ /// Test reading a logical array.
+ ///
+ [Test]
+ public void TestLogical()
+ {
+ var matFile = ReadLevel5TestFile("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 logical array.
+ ///
+ [Test]
+ public void TestSparseLogical()
+ {
+ 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);
+ }
+
+ ///
+ /// Test reading a global variable.
+ ///
+ [Test]
+ public void TestGlobal()
+ {
+ 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)));
+ }
+
+ ///
+ /// Test reading an object.
+ ///
+ [Test]
+ public void TestObject()
+ {
+ var matFile = ReadLevel5TestFile("object");
+ var obj = matFile["object_"].Value as IMatObject;
+ Assert.IsNotNull(obj);
+ Assert.That(obj.ClassName, Is.EqualTo("Point"));
+ Assert.That(obj.FieldNames, Is.EquivalentTo(new[] { "x", "y" }));
+ Assert.That(obj["x", 0].ConvertToDoubleArray(), Is.EqualTo(new[] { 3.0 }));
+ Assert.That(obj["y", 0].ConvertToDoubleArray(), Is.EqualTo(new[] { 5.0 }));
+ Assert.That(obj["x", 1].ConvertToDoubleArray(), Is.EqualTo(new[] { -2.0 }));
+ Assert.That(obj["y", 1].ConvertToDoubleArray(), Is.EqualTo(new[] { 6.0 }));
+ }
+
+ ///
+ /// Test reading another object.
+ ///
+ [Test]
+ public void TestObject2()
+ {
+ var matFile = ReadLevel5TestFile("object2");
+ var obj = matFile["object2"].Value as IMatObject;
+ Assert.IsNotNull(obj);
+ Assert.That(obj.ClassName, Is.EqualTo("Point"));
+ Assert.That(obj.FieldNames, Is.EquivalentTo(new[] { "x", "y" }));
+ Assert.That(obj["x", 0, 0].ConvertToDoubleArray(), Is.EqualTo(new[] { 3.0 }));
+ Assert.That(obj["y", 0, 0].ConvertToDoubleArray(), Is.EqualTo(new[] { 5.0 }));
+ Assert.That(obj["x", 1, 0].ConvertToDoubleArray(), Is.EqualTo(new[] { 1.0 }));
+ Assert.That(obj["y", 1, 0].ConvertToDoubleArray(), Is.EqualTo(new[] { 0.0 }));
+ Assert.That(obj["x", 0, 1].ConvertToDoubleArray(), Is.EqualTo(new[] { -2.0 }));
+ Assert.That(obj["y", 0, 1].ConvertToDoubleArray(), Is.EqualTo(new[] { 6.0 }));
+ Assert.That(obj["x", 1, 1].ConvertToDoubleArray(), Is.EqualTo(new[] { 0.0 }));
+ Assert.That(obj["y", 1, 1].ConvertToDoubleArray(), Is.EqualTo(new[] { 1.0 }));
+ Assert.That(obj[0, 1]["x"].ConvertToDoubleArray(), Is.EqualTo(new[] { -2.0 }));
+ Assert.That(obj[2]["x"].ConvertToDoubleArray(), Is.EqualTo(new[] { -2.0 }));
+ }
+
+ ///
+ /// Test reading a table.
+ ///
+ [Test]
+ public void TestTable()
+ {
+ 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 subobjects within objects.
+ ///
+ [Test]
+ public void TestSubobjects()
+ {
+ var matFile = ReadLevel5TestFile("pointWithSubpoints");
+ var p = matFile["p"].Value as IMatObject;
+ Assert.That(p.ClassName, Is.EqualTo("Point"));
+ var x = p["x"] as IMatObject;
+ Assert.That(x.ClassName, Is.EqualTo("SubPoint"));
+ Assert.That(x.FieldNames, Is.EquivalentTo(new[] { "a", "b", "c" }));
+ var y = p["y"] as IMatObject;
+ Assert.That(y.ClassName, Is.EqualTo("SubPoint"));
+ Assert.That(y.FieldNames, Is.EquivalentTo(new[] { "a", "b", "c" }));
+ Assert.That(x["a"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 1.0 }));
+ Assert.That(x["b"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 2.0 }));
+ Assert.That(x["c"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 3.0 }));
+ Assert.That(y["a"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 14.0 }));
+ Assert.That(y["b"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 15.0 }));
+ Assert.That(y["c"].ConvertToDoubleArray(), Is.EquivalentTo(new[] { 16.0 }));
+ }
+
+ ///
+ /// Test nested objects.
+ ///
+ [Test]
+ public void TestNestedObjects()
+ {
+ 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 }));
+ }
+
+ ///
+ /// Test datetime objects.
+ ///
+ [Test]
+ public void TestDatetime()
+ {
+ 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)));
+ }
+
+ ///
+ /// 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 string objects.
+ ///
+ [Test]
+ public void TestString()
+ {
+ 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));
+ }
+
+ 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 IMatFile ReadLevel5TestFile(string testName)
+ {
+ return GetTests("level5")[testName];
+ }
+ }
}
\ No newline at end of file
diff --git a/MatFileHandler.Tests/MatFileWriterTests.cs b/MatFileHandler.Tests/MatFileWriterTests.cs
index 335220a..a6c2889 100755
--- a/MatFileHandler.Tests/MatFileWriterTests.cs
+++ b/MatFileHandler.Tests/MatFileWriterTests.cs
@@ -27,7 +27,7 @@ namespace MatFileHandler.Tests
array[1] = 17.0;
var variable = builder.NewVariable("test", array);
var actual = builder.NewFile(new[] { variable });
- MatCompareWithTestData("good", "double-array", actual);
+ MatCompareWithLevel5TestData("double-array", actual);
}
///
@@ -65,7 +65,7 @@ namespace MatFileHandler.Tests
var int64 = builder.NewVariable("int64_", builder.NewArray(CommonData.Int64Limits, 1, 2));
var uint64 = builder.NewVariable("uint64_", builder.NewArray(CommonData.UInt64Limits, 1, 2));
var actual = builder.NewFile(new[] { int16, int32, int64, int8, uint16, uint32, uint64, uint8 });
- MatCompareWithTestData("good", "limits", actual);
+ MatCompareWithLevel5TestData("limits", actual);
}
///
@@ -104,7 +104,7 @@ namespace MatFileHandler.Tests
int16Complex, int32Complex, int64Complex, int8Complex,
uint16Complex, uint32Complex, uint64Complex, uint8Complex,
});
- MatCompareWithTestData("good", "limits_complex", actual);
+ MatCompareWithLevel5TestData("limits_complex", actual);
}
///
@@ -116,7 +116,7 @@ namespace MatFileHandler.Tests
var builder = new DataBuilder();
var s = builder.NewVariable("s", builder.NewCharArray("🍆"));
var actual = builder.NewFile(new[] { s });
- MatCompareWithTestData("good", "unicode-wide", actual);
+ MatCompareWithLevel5TestData("unicode-wide", actual);
}
///
@@ -133,7 +133,7 @@ namespace MatFileHandler.Tests
sparseArray[2, 3] = 4;
var sparse = builder.NewVariable("sparse_", sparseArray);
var actual = builder.NewFile(new[] { sparse });
- MatCompareWithTestData("good", "sparse", actual);
+ MatCompareWithLevel5TestData("sparse", actual);
}
///
@@ -161,7 +161,7 @@ namespace MatFileHandler.Tests
structure["y", 1, 2] = builder.NewEmpty();
var struct_ = builder.NewVariable("struct_", structure);
var actual = builder.NewFile(new[] { struct_ });
- MatCompareWithTestData("good", "struct", actual);
+ MatCompareWithLevel5TestData("struct", actual);
}
///
@@ -174,7 +174,7 @@ namespace MatFileHandler.Tests
var logical = builder.NewArray(new[] { true, false, true, true, false, true }, 2, 3);
var logicalVariable = builder.NewVariable("logical_", logical);
var actual = builder.NewFile(new[] { logicalVariable });
- MatCompareWithTestData("good", "logical", actual);
+ MatCompareWithLevel5TestData("logical", actual);
}
///
@@ -191,7 +191,7 @@ namespace MatFileHandler.Tests
array[1, 2] = true;
var sparseLogical = builder.NewVariable("sparse_logical", array);
var actual = builder.NewFile(new[] { sparseLogical });
- MatCompareWithTestData("good", "sparse_logical", actual);
+ MatCompareWithLevel5TestData("sparse_logical", actual);
}
///
@@ -207,7 +207,7 @@ namespace MatFileHandler.Tests
array[1, 1] = 0.5 + Complex.ImaginaryOne;
var sparseComplex = builder.NewVariable("sparse_complex", array);
var actual = builder.NewFile(new[] { sparseComplex });
- MatCompareWithTestData("good", "sparse_complex", actual);
+ MatCompareWithLevel5TestData("sparse_complex", actual);
}
///
@@ -220,7 +220,7 @@ namespace MatFileHandler.Tests
var array = builder.NewArray(new double[] { 1, 3, 5 }, 1, 3);
var global = builder.NewVariable("global_", array, true);
var actual = builder.NewFile(new[] { global });
- MatCompareWithTestData("good", "global", actual);
+ MatCompareWithLevel5TestData("global", actual);
}
private static AbstractTestDataFactory GetMatTestData(string factoryName) =>
@@ -398,6 +398,11 @@ namespace MatFileHandler.Tests
}
}
+ private void MatCompareWithLevel5TestData(string testName, IMatFile actual)
+ {
+ MatCompareWithTestData("level5", testName, actual);
+ }
+
private void MatCompareWithTestData(string factoryName, string testName, IMatFile actual)
{
var expected = GetMatTestData(factoryName)[testName];
diff --git a/MatFileHandler.Tests/test-data/good/ascii.mat b/MatFileHandler.Tests/test-data/level5/ascii.mat
old mode 100755
new mode 100644
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/ascii.mat
rename to MatFileHandler.Tests/test-data/level5/ascii.mat
diff --git a/MatFileHandler.Tests/test-data/good/datetime-unrepresentable.mat b/MatFileHandler.Tests/test-data/level5/datetime-unrepresentable.mat
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/datetime-unrepresentable.mat
rename to MatFileHandler.Tests/test-data/level5/datetime-unrepresentable.mat
diff --git a/MatFileHandler.Tests/test-data/good/datetime.mat b/MatFileHandler.Tests/test-data/level5/datetime.mat
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/datetime.mat
rename to MatFileHandler.Tests/test-data/level5/datetime.mat
diff --git a/MatFileHandler.Tests/test-data/good/datetime2.mat b/MatFileHandler.Tests/test-data/level5/datetime2.mat
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/datetime2.mat
rename to MatFileHandler.Tests/test-data/level5/datetime2.mat
diff --git a/MatFileHandler.Tests/test-data/good/double-array.mat b/MatFileHandler.Tests/test-data/level5/double-array.mat
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/double-array.mat
rename to MatFileHandler.Tests/test-data/level5/double-array.mat
diff --git a/MatFileHandler.Tests/test-data/good/duration.mat b/MatFileHandler.Tests/test-data/level5/duration.mat
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/duration.mat
rename to MatFileHandler.Tests/test-data/level5/duration.mat
diff --git a/MatFileHandler.Tests/test-data/good/global.mat b/MatFileHandler.Tests/test-data/level5/global.mat
old mode 100755
new mode 100644
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/global.mat
rename to MatFileHandler.Tests/test-data/level5/global.mat
diff --git a/MatFileHandler.Tests/test-data/good/limits.mat b/MatFileHandler.Tests/test-data/level5/limits.mat
old mode 100755
new mode 100644
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/limits.mat
rename to MatFileHandler.Tests/test-data/level5/limits.mat
diff --git a/MatFileHandler.Tests/test-data/good/limits_complex.mat b/MatFileHandler.Tests/test-data/level5/limits_complex.mat
old mode 100755
new mode 100644
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/limits_complex.mat
rename to MatFileHandler.Tests/test-data/level5/limits_complex.mat
diff --git a/MatFileHandler.Tests/test-data/good/logical.mat b/MatFileHandler.Tests/test-data/level5/logical.mat
old mode 100755
new mode 100644
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/logical.mat
rename to MatFileHandler.Tests/test-data/level5/logical.mat
diff --git a/MatFileHandler.Tests/test-data/good/object.mat b/MatFileHandler.Tests/test-data/level5/object.mat
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/object.mat
rename to MatFileHandler.Tests/test-data/level5/object.mat
diff --git a/MatFileHandler.Tests/test-data/good/object2.mat b/MatFileHandler.Tests/test-data/level5/object2.mat
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/object2.mat
rename to MatFileHandler.Tests/test-data/level5/object2.mat
diff --git a/MatFileHandler.Tests/test-data/good/pointWithSubpoints.mat b/MatFileHandler.Tests/test-data/level5/pointWithSubpoints.mat
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/pointWithSubpoints.mat
rename to MatFileHandler.Tests/test-data/level5/pointWithSubpoints.mat
diff --git a/MatFileHandler.Tests/test-data/good/sparse.mat b/MatFileHandler.Tests/test-data/level5/sparse.mat
old mode 100755
new mode 100644
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/sparse.mat
rename to MatFileHandler.Tests/test-data/level5/sparse.mat
diff --git a/MatFileHandler.Tests/test-data/good/sparse_complex.mat b/MatFileHandler.Tests/test-data/level5/sparse_complex.mat
old mode 100755
new mode 100644
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/sparse_complex.mat
rename to MatFileHandler.Tests/test-data/level5/sparse_complex.mat
diff --git a/MatFileHandler.Tests/test-data/good/sparse_logical.mat b/MatFileHandler.Tests/test-data/level5/sparse_logical.mat
old mode 100755
new mode 100644
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/sparse_logical.mat
rename to MatFileHandler.Tests/test-data/level5/sparse_logical.mat
diff --git a/MatFileHandler.Tests/test-data/good/string.mat b/MatFileHandler.Tests/test-data/level5/string.mat
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/string.mat
rename to MatFileHandler.Tests/test-data/level5/string.mat
diff --git a/MatFileHandler.Tests/test-data/good/struct.mat b/MatFileHandler.Tests/test-data/level5/struct.mat
old mode 100755
new mode 100644
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/struct.mat
rename to MatFileHandler.Tests/test-data/level5/struct.mat
diff --git a/MatFileHandler.Tests/test-data/good/subsubPoint.mat b/MatFileHandler.Tests/test-data/level5/subsubPoint.mat
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/subsubPoint.mat
rename to MatFileHandler.Tests/test-data/level5/subsubPoint.mat
diff --git a/MatFileHandler.Tests/test-data/good/table.mat b/MatFileHandler.Tests/test-data/level5/table.mat
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/table.mat
rename to MatFileHandler.Tests/test-data/level5/table.mat
diff --git a/MatFileHandler.Tests/test-data/good/unicode-wide.mat b/MatFileHandler.Tests/test-data/level5/unicode-wide.mat
old mode 100755
new mode 100644
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/unicode-wide.mat
rename to MatFileHandler.Tests/test-data/level5/unicode-wide.mat
diff --git a/MatFileHandler.Tests/test-data/good/unicode.mat b/MatFileHandler.Tests/test-data/level5/unicode.mat
old mode 100755
new mode 100644
similarity index 100%
rename from MatFileHandler.Tests/test-data/good/unicode.mat
rename to MatFileHandler.Tests/test-data/level5/unicode.mat
diff --git a/MatFileHandler/MatFileHandler.csproj b/MatFileHandler/MatFileHandler.csproj
index 6e87fc5..e4dee63 100755
--- a/MatFileHandler/MatFileHandler.csproj
+++ b/MatFileHandler/MatFileHandler.csproj
@@ -26,12 +26,13 @@
+
- All
+ All
-
+