From 753255defe56d9097238ede1bec855e55fca2541 Mon Sep 17 00:00:00 2001 From: Stefan Lindegger Date: Tue, 28 Apr 2020 21:20:39 +0200 Subject: [PATCH] (GH-81) fixed issue with deserialization of MaybeStruct none case. --- src/BBT.MaybePattern.Tests/MaybeIntTests.cs | 53 +++++++++++++++++++ .../MaybeStructIntTests.cs | 53 +++++++++++++++++++ .../TestData/TestDataClass.cs | 16 ++++++ .../TestData/TestDataStruct.cs | 16 ++++++ src/BBT.MaybePattern.Tests/TestUtils.cs | 50 +++++++++++++++++ src/BBT.MaybePattern/MaybeStruct.cs | 2 +- 6 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 src/BBT.MaybePattern.Tests/MaybeIntTests.cs create mode 100644 src/BBT.MaybePattern.Tests/MaybeStructIntTests.cs create mode 100644 src/BBT.MaybePattern.Tests/TestData/TestDataClass.cs create mode 100644 src/BBT.MaybePattern.Tests/TestData/TestDataStruct.cs create mode 100644 src/BBT.MaybePattern.Tests/TestUtils.cs diff --git a/src/BBT.MaybePattern.Tests/MaybeIntTests.cs b/src/BBT.MaybePattern.Tests/MaybeIntTests.cs new file mode 100644 index 0000000..7b2ad69 --- /dev/null +++ b/src/BBT.MaybePattern.Tests/MaybeIntTests.cs @@ -0,0 +1,53 @@ +namespace BBT.MaybePattern.Tests +{ + using BBT.MaybePattern; + using BBT.MaybePattern.Tests.TestData; + using Shouldly; + using Xunit; + + public sealed class MaybeIntTests + { + public sealed class SerializeAndDeserialize + { + /// + /// Serialize and deserialize a maybe of int. + /// + [Fact] + public void Should_Work_For_None() + { + // Arrange + var maybe = Maybe.None(); + var testData = new TestDataClass() { Maybe = maybe }; + + // Act & Assert + using (var stream = TestUtils.SerializeToStream(testData)) + { + var testDataDeserialized = (TestDataClass)TestUtils.DeserializeFromStream(stream); + + testDataDeserialized.Maybe.ShouldBeOfType>(); + testDataDeserialized.Maybe.HasValue.ShouldBeFalse(); + } + } + + /// + /// Serialize and deserialize a maybe of int. + /// + [Fact] + public void Should_Work_For_Some() + { + // Arrange + var maybe = Maybe.Some(new object()); + var testData = new TestDataClass() { Maybe = maybe }; + + // Act & Assert + using (var stream = TestUtils.SerializeToStream(testData)) + { + var testDataDeserialized = (TestDataClass)TestUtils.DeserializeFromStream(stream); + + testDataDeserialized.Maybe.ShouldBeOfType>(); + testDataDeserialized.Maybe.HasValue.ShouldBeTrue(); + } + } + } + } +} diff --git a/src/BBT.MaybePattern.Tests/MaybeStructIntTests.cs b/src/BBT.MaybePattern.Tests/MaybeStructIntTests.cs new file mode 100644 index 0000000..e44c4f0 --- /dev/null +++ b/src/BBT.MaybePattern.Tests/MaybeStructIntTests.cs @@ -0,0 +1,53 @@ +namespace BBT.MaybePattern.Tests +{ + using BBT.MaybePattern; + using BBT.MaybePattern.Tests.TestData; + using Shouldly; + using Xunit; + + public sealed class MaybeStructIntTests + { + public sealed class SerializeAndDeserialize + { + /// + /// Serialize and deserialize a maybe of int. + /// + [Fact] + public void Should_Work_For_None() + { + // Arrange + var maybeStruct = Maybe.NoneStruct(); + var testData = new TestDataStruct() { MaybeStruct = maybeStruct }; + + // Act & Assert + using (var stream = TestUtils.SerializeToStream(testData)) + { + var testDataDeserialized = (TestDataStruct)TestUtils.DeserializeFromStream(stream); + + testDataDeserialized.MaybeStruct.ShouldBeOfType>(); + testDataDeserialized.MaybeStruct.HasValue.ShouldBeFalse(); + } + } + + /// + /// Serialize and deserialize a maybe of int. + /// + [Fact] + public void Should_Work_For_Some() + { + // Arrange + var maybeStruct = Maybe.SomeStruct(5); + var testData = new TestDataStruct() { MaybeStruct = maybeStruct }; + + // Act & Assert + using (var stream = TestUtils.SerializeToStream(testData)) + { + var testDataDeserialized = (TestDataStruct)TestUtils.DeserializeFromStream(stream); + + testDataDeserialized.MaybeStruct.ShouldBeOfType>(); + testDataDeserialized.MaybeStruct.HasValue.ShouldBeTrue(); + } + } + } + } +} diff --git a/src/BBT.MaybePattern.Tests/TestData/TestDataClass.cs b/src/BBT.MaybePattern.Tests/TestData/TestDataClass.cs new file mode 100644 index 0000000..2d0a019 --- /dev/null +++ b/src/BBT.MaybePattern.Tests/TestData/TestDataClass.cs @@ -0,0 +1,16 @@ +namespace BBT.MaybePattern.Tests.TestData +{ + using System; + + /// + /// Used for test purposes. + /// + [Serializable] + public class TestDataClass + { + /// + /// Gets or sets the maybe. + /// + public Maybe Maybe { get; set; } + } +} diff --git a/src/BBT.MaybePattern.Tests/TestData/TestDataStruct.cs b/src/BBT.MaybePattern.Tests/TestData/TestDataStruct.cs new file mode 100644 index 0000000..e9ad7e8 --- /dev/null +++ b/src/BBT.MaybePattern.Tests/TestData/TestDataStruct.cs @@ -0,0 +1,16 @@ +namespace BBT.MaybePattern.Tests.TestData +{ + using System; + + /// + /// Used for test purposes. + /// + [Serializable] + public class TestDataStruct + { + /// + /// Gets or sets the maybe. + /// + public MaybeStruct MaybeStruct { get; set; } + } +} diff --git a/src/BBT.MaybePattern.Tests/TestUtils.cs b/src/BBT.MaybePattern.Tests/TestUtils.cs new file mode 100644 index 0000000..c6c85e4 --- /dev/null +++ b/src/BBT.MaybePattern.Tests/TestUtils.cs @@ -0,0 +1,50 @@ +namespace BBT.MaybePattern.Tests +{ + using System; + using System.IO; + using System.Runtime.Serialization.Formatters.Binary; + + /// + /// Provides utility method for test purposes. + /// + public class TestUtils + { + /// + /// Serializes the given object into memory stream. + /// + /// the object to be serialized. + /// The serialized object as memory stream. + public static MemoryStream SerializeToStream(object objectType) + { + var stream = new MemoryStream(); + try + { + var lFormatter = new BinaryFormatter(); + lFormatter.Serialize(stream, objectType); + return stream; + } + catch + { + if (stream != null) + { + stream.Dispose(); + } + } + + throw new InvalidOperationException(); + } + + /// + /// Deserializes as an object. + /// + /// the stream to deserialize. + /// the deserialized object. + public static object DeserializeFromStream(MemoryStream stream) + { + var formatter = new BinaryFormatter(); + stream.Seek(0, SeekOrigin.Begin); + var objectType = formatter.Deserialize(stream); + return objectType; + } + } +} diff --git a/src/BBT.MaybePattern/MaybeStruct.cs b/src/BBT.MaybePattern/MaybeStruct.cs index acc82e5..f37f31d 100644 --- a/src/BBT.MaybePattern/MaybeStruct.cs +++ b/src/BBT.MaybePattern/MaybeStruct.cs @@ -34,7 +34,7 @@ internal MaybeStruct(T? value) /// The streaming context. internal MaybeStruct(SerializationInfo info, StreamingContext context) { - this.value = MaybeUtils.GetDeserializedValue(info, nameof(this.value)); + this.value = MaybeUtils.GetDeserializedValue(info, nameof(this.value)); } ///