From 5e70d7fdfded1f7bcccd34da2bd38e6466d043ce Mon Sep 17 00:00:00 2001 From: Alexander Luzgarev Date: Sat, 2 Mar 2019 12:24:15 +0100 Subject: [PATCH] Implement DatetimeAdapter --- MatFileHandler.Tests/MatFileReaderTests.cs | 30 +++++++++ .../test-data/good/datetime.mat | Bin 0 -> 532 bytes .../test-data/good/datetime2.mat | Bin 0 -> 538 bytes MatFileHandler/DatetimeAdapter.cs | 62 ++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 MatFileHandler.Tests/test-data/good/datetime.mat create mode 100644 MatFileHandler.Tests/test-data/good/datetime2.mat create mode 100644 MatFileHandler/DatetimeAdapter.cs diff --git a/MatFileHandler.Tests/MatFileReaderTests.cs b/MatFileHandler.Tests/MatFileReaderTests.cs index 88fd0e8..0757839 100755 --- a/MatFileHandler.Tests/MatFileReaderTests.cs +++ b/MatFileHandler.Tests/MatFileReaderTests.cs @@ -1,5 +1,6 @@ // Copyright 2017-2018 Alexander Luzgarev +using System; using System.IO; using System.Linq; using System.Numerics; @@ -388,6 +389,35 @@ namespace MatFileHandler.Tests 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)); + } + private static AbstractTestDataFactory GetTests(string factoryName) => new MatTestDataFactory(Path.Combine(TestDirectory, factoryName)); diff --git a/MatFileHandler.Tests/test-data/good/datetime.mat b/MatFileHandler.Tests/test-data/good/datetime.mat new file mode 100644 index 0000000000000000000000000000000000000000..6f6899fbff2d9c8f9d9d1c6ede2c9d9e840e2547 GIT binary patch literal 532 zcmeZu4DoSvQZUssQ1EpO(M`+DN!3vZ$Vn_o%P-2cQV4Jk_w+L}(NS64^{ZLMRC zox;6?Jr~ZmxZ3kLABj9r)DvL3@7%wG2E|+x&Iq=wN^iNWldx66PG4Ym>a!(n;;LdI zOT>;Icm67^@Y4MT`@_R;S~{Dr)F&Kx`<^-D)yxG+X97&+9Of_{HEyV24v}LE67m*u zbjk8e%hPg>%HwqQ6m?G9$Q^LRUVr%{M(Kn@T3uWc8$U>H{BZH=K?ZrDw+9+N*h`1V zSl*j4;S6JIKf{cxA51ry-|lR5^gM9e>Kv(s$Dj8H9p?VwXJY8>)4L4-pWw(= literal 0 HcmV?d00001 diff --git a/MatFileHandler.Tests/test-data/good/datetime2.mat b/MatFileHandler.Tests/test-data/good/datetime2.mat new file mode 100644 index 0000000000000000000000000000000000000000..d9d19c59414af34a1345fce7b4b6ae12f8787896 GIT binary patch literal 538 zcmeZu4DoSvQZUssQ1EpO(M`+DN!3vZ$Vn_o%P-2cQV4Jk_w+L}(NS*hC4+){Fy_o+6Mp@!Q+28oRZ4Uz{Hs(B{dIoWjhzd<$2iZ%U{ qIrs0Mu|Q|SK0dZTPaRm8v+6n+tQi9N6qc)donjPVV7NWmSQr2qHOqzo literal 0 HcmV?d00001 diff --git a/MatFileHandler/DatetimeAdapter.cs b/MatFileHandler/DatetimeAdapter.cs new file mode 100644 index 0000000..c86371f --- /dev/null +++ b/MatFileHandler/DatetimeAdapter.cs @@ -0,0 +1,62 @@ +// Copyright 2017-2018 Alexander Luzgarev + +using System; +using System.Linq; +using System.Numerics; + +namespace MatFileHandler +{ + /// + /// A better interface for using datetime objects. + /// + public class DatetimeAdapter + { + private readonly double[] data; + private readonly double[] data2; + private readonly int[] dimensions; + + private readonly DateTimeOffset epoch; + + /// + /// Initializes a new instance of the class. + /// + /// Source datetime object. + public DatetimeAdapter(IArray array) + { + var matObject = array as IMatObject; + if (matObject?.ClassName != "datetime") + { + throw new ArgumentException("The object provided is not a datetime."); + } + + epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + var dataArray = matObject["data", 0] as IArrayOf; + if (dataArray is null) + { + var dataComplex = matObject["data", 0] as IArrayOf; + var complexData = dataComplex.ConvertToComplexArray(); + data = complexData.Select(c => c.Real).ToArray(); + data2 = complexData.Select(c => c.Imaginary).ToArray(); + dimensions = dataComplex.Dimensions; + } + else + { + data = dataArray.ConvertToDoubleArray(); + data2 = new double[data.Length]; + dimensions = dataArray.Dimensions; + } + } + + /// + /// Gets datetime array dimensions. + /// + public int[] Dimensions => dimensions; + + /// + /// Gets values of datetime object at given position in the array converted to . + /// + /// Indices. + /// Value converted to . + public DateTimeOffset this[params int[] list] => epoch.AddMilliseconds(data[Dimensions.DimFlatten(list)]); + } +} \ No newline at end of file