|
|
|
@ -0,0 +1,335 @@
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Net;
|
|
|
|
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
|
|
|
using ZeroLevel.Network;
|
|
|
|
|
using ZeroLevel.Services.Serialization;
|
|
|
|
|
|
|
|
|
|
namespace ZeroLevel.UnitTests
|
|
|
|
|
{
|
|
|
|
|
[TestClass]
|
|
|
|
|
public class SerializationTests
|
|
|
|
|
{
|
|
|
|
|
private static bool TestOrderingEquals<T>(IEnumerable<T> A, IEnumerable<T> B, Func<T, T, bool> comparer)
|
|
|
|
|
{
|
|
|
|
|
if (A == null && B == null) return true;
|
|
|
|
|
if (A == null || B == null) return false;
|
|
|
|
|
if (A.Count() != B.Count()) return false;
|
|
|
|
|
var enumA = A.GetEnumerator();
|
|
|
|
|
var enumB = B.GetEnumerator();
|
|
|
|
|
while (enumA.MoveNext() && enumB.MoveNext())
|
|
|
|
|
{
|
|
|
|
|
if (enumA.Current == null && enumB.Current == null) continue;
|
|
|
|
|
if (comparer(enumA.Current, enumB.Current) == false) return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void MakePrimitiveTest<T>(T value, Func<T, T, bool> comparator = null)
|
|
|
|
|
{
|
|
|
|
|
// Act
|
|
|
|
|
var data = MessageSerializer.SerializeCompatible<T>(value);
|
|
|
|
|
var clone = MessageSerializer.DeserializeCompatible<T>(data);
|
|
|
|
|
|
|
|
|
|
// Assert
|
|
|
|
|
if (comparator == null)
|
|
|
|
|
{
|
|
|
|
|
Assert.AreEqual<T>(value, clone);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Assert.IsTrue(comparator(value, clone));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void MakeCollectionTest<T>(IEnumerable<T> value, Func<T, T, bool> comparator = null)
|
|
|
|
|
{
|
|
|
|
|
// Act
|
|
|
|
|
var data = MessageSerializer.SerializeCompatible<IEnumerable<T>>(value);
|
|
|
|
|
var clone = MessageSerializer.DeserializeCompatible<IEnumerable<T>>(data);
|
|
|
|
|
|
|
|
|
|
// Assert
|
|
|
|
|
if (value == null && clone != null && !clone.Any()) return; // OK
|
|
|
|
|
if (comparator == null)
|
|
|
|
|
{
|
|
|
|
|
Assert.IsTrue(CollectionComparsionExtensions.OrderingEquals(value, clone));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Assert.IsTrue(TestOrderingEquals(value, clone, comparator));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeDateTime()
|
|
|
|
|
{
|
|
|
|
|
MakePrimitiveTest<DateTime>(DateTime.Now);
|
|
|
|
|
MakePrimitiveTest<DateTime>(DateTime.UtcNow);
|
|
|
|
|
MakePrimitiveTest<DateTime>(DateTime.Today);
|
|
|
|
|
MakePrimitiveTest<DateTime>(DateTime.Now.AddYears(2000));
|
|
|
|
|
MakePrimitiveTest<DateTime>(DateTime.MinValue);
|
|
|
|
|
MakePrimitiveTest<DateTime>(DateTime.MaxValue);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeIPAddress()
|
|
|
|
|
{
|
|
|
|
|
var comparator = new Func<IPAddress, IPAddress, bool>((left, right) => NetUtils.Compare(left, right) == 0);
|
|
|
|
|
MakePrimitiveTest<IPAddress>(IPAddress.Any, comparator);
|
|
|
|
|
MakePrimitiveTest<IPAddress>(IPAddress.Broadcast, comparator);
|
|
|
|
|
MakePrimitiveTest<IPAddress>(IPAddress.IPv6Any, comparator);
|
|
|
|
|
MakePrimitiveTest<IPAddress>(IPAddress.IPv6Loopback, comparator);
|
|
|
|
|
MakePrimitiveTest<IPAddress>(IPAddress.IPv6None, comparator);
|
|
|
|
|
MakePrimitiveTest<IPAddress>(IPAddress.Loopback, comparator);
|
|
|
|
|
MakePrimitiveTest<IPAddress>(IPAddress.None, comparator);
|
|
|
|
|
MakePrimitiveTest<IPAddress>(IPAddress.Parse("93.111.16.58"), comparator);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeIPEndPoint()
|
|
|
|
|
{
|
|
|
|
|
var comparator = new Func<IPEndPoint, IPEndPoint, bool>((left, right) => NetUtils.Compare(left, right) == 0);
|
|
|
|
|
MakePrimitiveTest<IPEndPoint>(new IPEndPoint(IPAddress.Any, 1), comparator);
|
|
|
|
|
MakePrimitiveTest<IPEndPoint>(new IPEndPoint(IPAddress.Broadcast, 600), comparator);
|
|
|
|
|
MakePrimitiveTest<IPEndPoint>(new IPEndPoint(IPAddress.IPv6Any, IPEndPoint.MaxPort), comparator);
|
|
|
|
|
MakePrimitiveTest<IPEndPoint>(new IPEndPoint(IPAddress.IPv6Loopback, 8080), comparator);
|
|
|
|
|
MakePrimitiveTest<IPEndPoint>(new IPEndPoint(IPAddress.IPv6None, 80), comparator);
|
|
|
|
|
MakePrimitiveTest<IPEndPoint>(new IPEndPoint(IPAddress.Loopback, 9000), comparator);
|
|
|
|
|
MakePrimitiveTest<IPEndPoint>(new IPEndPoint(IPAddress.None, 0), comparator);
|
|
|
|
|
MakePrimitiveTest<IPEndPoint>(new IPEndPoint(IPAddress.Parse("93.111.16.58"), IPEndPoint.MinPort), comparator);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeGuid()
|
|
|
|
|
{
|
|
|
|
|
MakePrimitiveTest<Guid>(Guid.Empty);
|
|
|
|
|
MakePrimitiveTest<Guid>(Guid.NewGuid());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeTimeSpan()
|
|
|
|
|
{
|
|
|
|
|
MakePrimitiveTest<TimeSpan>(TimeSpan.MaxValue);
|
|
|
|
|
MakePrimitiveTest<TimeSpan>(TimeSpan.MinValue);
|
|
|
|
|
MakePrimitiveTest<TimeSpan>(TimeSpan.Zero);
|
|
|
|
|
MakePrimitiveTest<TimeSpan>(TimeSpan.FromDays(1024));
|
|
|
|
|
MakePrimitiveTest<TimeSpan>(TimeSpan.FromMilliseconds(1));
|
|
|
|
|
MakePrimitiveTest<TimeSpan>(TimeSpan.FromTicks(1));
|
|
|
|
|
MakePrimitiveTest<TimeSpan>(TimeSpan.FromTicks(0));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeString()
|
|
|
|
|
{
|
|
|
|
|
var comparator = new Func<string, string, bool>((left, right) =>
|
|
|
|
|
(left == null && right == null) ||
|
|
|
|
|
(left == null && right != null && right.Length == 0) ||
|
|
|
|
|
(left != null && left.Length == 0 && right == null) ||
|
|
|
|
|
string.Compare(left, right, StringComparison.InvariantCulture) == 0);
|
|
|
|
|
MakePrimitiveTest<String>("", comparator);
|
|
|
|
|
MakePrimitiveTest<String>(String.Empty, comparator);
|
|
|
|
|
MakePrimitiveTest<String>(null, comparator);
|
|
|
|
|
MakePrimitiveTest<String>("HELLO!", comparator);
|
|
|
|
|
MakePrimitiveTest<String>("𐌼𐌰𐌲 𐌲𐌻𐌴𐍃 𐌹̈𐍄𐌰𐌽, 𐌽𐌹 𐌼𐌹𐍃 𐍅𐌿 𐌽𐌳𐌰𐌽 𐌱𐍂𐌹𐌲𐌲𐌹𐌸", comparator);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeInt32()
|
|
|
|
|
{
|
|
|
|
|
MakePrimitiveTest<Int32>(-0);
|
|
|
|
|
MakePrimitiveTest<Int32>(0);
|
|
|
|
|
MakePrimitiveTest<Int32>(-10);
|
|
|
|
|
MakePrimitiveTest<Int32>(10);
|
|
|
|
|
MakePrimitiveTest<Int32>(Int32.MinValue);
|
|
|
|
|
MakePrimitiveTest<Int32>(Int32.MaxValue);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeInt64()
|
|
|
|
|
{
|
|
|
|
|
MakePrimitiveTest<Int64>(-0);
|
|
|
|
|
MakePrimitiveTest<Int64>(0);
|
|
|
|
|
MakePrimitiveTest<Int64>(-10);
|
|
|
|
|
MakePrimitiveTest<Int64>(10);
|
|
|
|
|
MakePrimitiveTest<Int64>(Int64.MinValue);
|
|
|
|
|
MakePrimitiveTest<Int64>(Int64.MaxValue);
|
|
|
|
|
MakePrimitiveTest<Int64>(Int64.MinValue / 2);
|
|
|
|
|
MakePrimitiveTest<Int64>(Int64.MaxValue / 2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeDecimal()
|
|
|
|
|
{
|
|
|
|
|
MakePrimitiveTest<Decimal>(-0);
|
|
|
|
|
MakePrimitiveTest<Decimal>(0);
|
|
|
|
|
MakePrimitiveTest<Decimal>(-10);
|
|
|
|
|
MakePrimitiveTest<Decimal>(10);
|
|
|
|
|
MakePrimitiveTest<Decimal>(Decimal.MinValue);
|
|
|
|
|
MakePrimitiveTest<Decimal>(Decimal.MaxValue);
|
|
|
|
|
MakePrimitiveTest<Decimal>(Decimal.MinValue / 2);
|
|
|
|
|
MakePrimitiveTest<Decimal>(Decimal.MaxValue / 2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeFloat()
|
|
|
|
|
{
|
|
|
|
|
MakePrimitiveTest<float>(-0);
|
|
|
|
|
MakePrimitiveTest<float>(0);
|
|
|
|
|
MakePrimitiveTest<float>(-10);
|
|
|
|
|
MakePrimitiveTest<float>(10);
|
|
|
|
|
MakePrimitiveTest<float>(float.MinValue);
|
|
|
|
|
MakePrimitiveTest<float>(float.MaxValue);
|
|
|
|
|
MakePrimitiveTest<float>(float.MinValue / 2);
|
|
|
|
|
MakePrimitiveTest<float>(float.MaxValue / 2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeDouble()
|
|
|
|
|
{
|
|
|
|
|
MakePrimitiveTest<Double>(-0);
|
|
|
|
|
MakePrimitiveTest<Double>(0);
|
|
|
|
|
MakePrimitiveTest<Double>(-10);
|
|
|
|
|
MakePrimitiveTest<Double>(10);
|
|
|
|
|
MakePrimitiveTest<Double>(Double.MinValue);
|
|
|
|
|
MakePrimitiveTest<Double>(Double.MaxValue);
|
|
|
|
|
MakePrimitiveTest<Double>(Double.MinValue / 2);
|
|
|
|
|
MakePrimitiveTest<Double>(Double.MaxValue / 2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeBoolean()
|
|
|
|
|
{
|
|
|
|
|
MakePrimitiveTest<Boolean>(true);
|
|
|
|
|
MakePrimitiveTest<Boolean>(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeByte()
|
|
|
|
|
{
|
|
|
|
|
MakePrimitiveTest<Byte>(0);
|
|
|
|
|
MakePrimitiveTest<Byte>(-0);
|
|
|
|
|
MakePrimitiveTest<Byte>(1);
|
|
|
|
|
MakePrimitiveTest<Byte>(10);
|
|
|
|
|
MakePrimitiveTest<Byte>(128);
|
|
|
|
|
MakePrimitiveTest<Byte>(255);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeBytes()
|
|
|
|
|
{
|
|
|
|
|
var comparator = new Func<byte[], byte[], bool>((left, right) =>
|
|
|
|
|
(left == null && (right == null || right.Length == 0)) || ArrayExtensions.UnsafeEquals(left, right));
|
|
|
|
|
MakePrimitiveTest<Byte[]>(null, comparator);
|
|
|
|
|
MakePrimitiveTest<Byte[]>(new byte[] { }, comparator);
|
|
|
|
|
MakePrimitiveTest<Byte[]>(new byte[] { 1 }, comparator);
|
|
|
|
|
MakePrimitiveTest<Byte[]>(new byte[] { 0, 1, 10, 100, 128, 255 }, comparator);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
COLLECTIONS
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeCollectionDateTime()
|
|
|
|
|
{
|
|
|
|
|
MakeCollectionTest<DateTime>(null);
|
|
|
|
|
MakeCollectionTest<DateTime>(new DateTime[] { });
|
|
|
|
|
MakeCollectionTest<DateTime>(new DateTime[] { DateTime.Now, DateTime.UtcNow, DateTime.Today, DateTime.Now.AddYears(2000), DateTime.MinValue, DateTime.MaxValue });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeCollectionIPAddress()
|
|
|
|
|
{
|
|
|
|
|
var comparator = new Func<IPAddress, IPAddress, bool>((left, right) => NetUtils.Compare(left, right) == 0);
|
|
|
|
|
MakeCollectionTest<IPAddress>(null);
|
|
|
|
|
MakeCollectionTest<IPAddress>(new IPAddress[] { IPAddress.Any, IPAddress.Broadcast, IPAddress.IPv6Any, IPAddress.IPv6Loopback, IPAddress.IPv6None, IPAddress.Loopback, IPAddress.None, IPAddress.Parse("93.111.16.58") }, comparator);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeCollectionIPEndPoint()
|
|
|
|
|
{
|
|
|
|
|
var comparator = new Func<IPEndPoint, IPEndPoint, bool>((left, right) => NetUtils.Compare(left, right) == 0);
|
|
|
|
|
MakeCollectionTest<IPEndPoint>(null);
|
|
|
|
|
MakeCollectionTest<IPEndPoint>(new IPEndPoint[] { });
|
|
|
|
|
MakeCollectionTest<IPEndPoint>(new IPEndPoint[] { new IPEndPoint(IPAddress.Any, 1), new IPEndPoint(IPAddress.Broadcast, 600), new IPEndPoint(IPAddress.IPv6Any, IPEndPoint.MaxPort), new IPEndPoint(IPAddress.IPv6Loopback, 8080), new IPEndPoint(IPAddress.IPv6None, 80), new IPEndPoint(IPAddress.Loopback, 9000), new IPEndPoint(IPAddress.None, 0), new IPEndPoint(IPAddress.Parse("93.111.16.58"), IPEndPoint.MinPort) }, comparator);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeCollectionGuid()
|
|
|
|
|
{
|
|
|
|
|
MakeCollectionTest<Guid>(null);
|
|
|
|
|
MakeCollectionTest<Guid>(new Guid[] { });
|
|
|
|
|
MakeCollectionTest<Guid>(new Guid[] { Guid.Empty, Guid.NewGuid() });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeCollectionTimeSpan()
|
|
|
|
|
{
|
|
|
|
|
MakeCollectionTest<TimeSpan>(new TimeSpan[] { TimeSpan.MaxValue, TimeSpan.MinValue, TimeSpan.Zero, TimeSpan.FromDays(1024), TimeSpan.FromMilliseconds(1), TimeSpan.FromTicks(1), TimeSpan.FromTicks(0) });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeCollectionString()
|
|
|
|
|
{
|
|
|
|
|
var comparator = new Func<string, string, bool>((left, right) =>
|
|
|
|
|
(left == null && right == null) ||
|
|
|
|
|
(left == null && right != null && right.Length == 0) ||
|
|
|
|
|
(left != null && left.Length == 0 && right == null) ||
|
|
|
|
|
string.Compare(left, right, StringComparison.InvariantCulture) == 0);
|
|
|
|
|
MakeCollectionTest<String>(new string[] { "", String.Empty, null, "HELLO!", "𐌼𐌰𐌲 𐌲𐌻𐌴𐍃 𐌹̈𐍄𐌰𐌽, 𐌽𐌹 𐌼𐌹𐍃 𐍅𐌿 𐌽𐌳𐌰𐌽 𐌱𐍂𐌹𐌲𐌲𐌹𐌸" }, comparator);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeCollectionInt32()
|
|
|
|
|
{
|
|
|
|
|
MakeCollectionTest<Int32>(new int[] { -0, 0, -10, 10, Int32.MinValue, Int32.MaxValue });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeCollectionInt64()
|
|
|
|
|
{
|
|
|
|
|
MakeCollectionTest<Int64>(new long[] { -0, 0, -10, 10, Int64.MinValue, Int64.MaxValue, Int64.MinValue / 2, Int64.MaxValue / 2 });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeCollectionDecimal()
|
|
|
|
|
{
|
|
|
|
|
MakeCollectionTest<Decimal>(new Decimal[] { -0, 0, -10, 10, Decimal.MinValue, Decimal.MaxValue, Decimal.MinValue / 2, Decimal.MaxValue / 2 });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeCollectionFloat()
|
|
|
|
|
{
|
|
|
|
|
MakeCollectionTest<float>(new float[] { -0, 0, -10, 10, float.MinValue, float.MaxValue, float.MinValue / 2, float.MaxValue / 2 });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeCollectionDouble()
|
|
|
|
|
{
|
|
|
|
|
MakeCollectionTest<Double>(new Double[] { -0, 0, -10, 10, Double.MinValue, Double.MaxValue, Double.MinValue / 2, Double.MaxValue / 2 });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeCollectionBoolean()
|
|
|
|
|
{
|
|
|
|
|
MakeCollectionTest<Boolean>(new Boolean[] { true, false, true });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeCollectionByte()
|
|
|
|
|
{
|
|
|
|
|
MakeCollectionTest<Byte>(new byte[] { 0, 3, -0, 1, 10, 128, 255 });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public void SerializeCollectionBytes()
|
|
|
|
|
{
|
|
|
|
|
var comparator = new Func<byte[], byte[], bool>((left, right) =>
|
|
|
|
|
(left == null && (right == null || right.Length == 0)) || ArrayExtensions.UnsafeEquals(left, right));
|
|
|
|
|
|
|
|
|
|
MakeCollectionTest<Byte[]>(new Byte[][] { null, new byte[] { }, new byte[] { 1 }, new byte[] { 0, 1, 10, 100, 128, 255 } }, comparator);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|