diff --git a/MatFileHandler.Tests/MatFileReaderTests.cs b/MatFileHandler.Tests/MatFileReaderTests.cs index bdb91e8..b317cf3 100755 --- a/MatFileHandler.Tests/MatFileReaderTests.cs +++ b/MatFileHandler.Tests/MatFileReaderTests.cs @@ -434,6 +434,21 @@ namespace MatFileHandler.Tests 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))); + } + private static AbstractTestDataFactory GetTests(string factoryName) => new MatTestDataFactory(Path.Combine(TestDirectory, factoryName)); diff --git a/MatFileHandler.Tests/test-data/good/duration.mat b/MatFileHandler.Tests/test-data/good/duration.mat new file mode 100644 index 0000000..162bbe5 Binary files /dev/null and b/MatFileHandler.Tests/test-data/good/duration.mat differ diff --git a/MatFileHandler/DurationAdapter.cs b/MatFileHandler/DurationAdapter.cs new file mode 100644 index 0000000..c7a6a35 --- /dev/null +++ b/MatFileHandler/DurationAdapter.cs @@ -0,0 +1,44 @@ +// Copyright 2017-2018 Alexander Luzgarev + +using System; + +namespace MatFileHandler +{ + /// + /// A better interface for using duration objects. + /// + public class DurationAdapter + { + private readonly int[] dimensions; + private readonly double[] data; + + /// + /// Initializes a new instance of the class. + /// + /// Source duration object. + public DurationAdapter(IArray array) + { + var matObject = array as IMatObject; + if (matObject?.ClassName != "duration") + { + throw new ArgumentException("The object provided is not a duration."); + } + + var dataObject = matObject["millis", 0]; + data = dataObject.ConvertToDoubleArray(); + dimensions = dataObject.Dimensions; + } + + /// + /// Gets duration array dimensions. + /// + public int[] Dimensions => dimensions; + + /// + /// Gets duration object at given position. + /// + /// Indices. + /// Value. + public TimeSpan this[params int[] list] => TimeSpan.FromTicks((long)(10000.0 * data[Dimensions.DimFlatten(list)])); + } +} \ No newline at end of file