private static void TestSerializationCore(SerializationContext context, DateTimeConversionMethod expected)
        {
            Assert.That(context.DefaultDateTimeConversionMethod, Is.EqualTo(expected));

            var now         = Timestamp.UtcNow;
            var dateTimeNow = now.ToDateTimeOffset();
            var source      =
                new ClassHasTimestamp
            {
                Timestamp      = now,
                DateTime       = dateTimeNow.AddSeconds(1).UtcDateTime,
                DateTimeOffset = dateTimeNow.AddSeconds(2),
#if (!SILVERLIGHT || WINDOWS_PHONE) && !XAMARIN && !UNITY && !UNITY
                FileTime = now.Add(TimeSpan.FromSeconds(3)).ToDateTime().ToWin32FileTimeUtc()
#endif // ( !SILVERLIGHT || WINDOWS_PHONE ) && !XAMARIN && !UNITY && !UNITY
            };

            using (var buffer = new MemoryStream())
            {
                var serializer = context.GetSerializer <ClassHasTimestamp>();
                serializer.Pack(
                    buffer,
                    source
                    );

                // Test representation
                buffer.Position = 0;
                var native = MessagePackSerializer.UnpackMessagePackObject(buffer);
                Assert.That(native.IsArray, Is.True);
                var nativeMembers = native.AsList();
                Assert.That(nativeMembers.Count, Is.EqualTo(ClassHasTimestamp.MemberCount));

                for (var i = 0; i < ClassHasTimestamp.MemberCount; i++)
                {
                    switch (expected)
                    {
                    case DateTimeConversionMethod.Native:
                    {
                        if (i == 2)
                        {
                            // DateTimeOffset -> [long, shourt]
                            Assert.That(nativeMembers[i].IsArray, Is.True);
                            var dtoComponents = nativeMembers[i].AsList();
                            Assert.That(dtoComponents.Count, Is.EqualTo(2));
                            Assert.That(dtoComponents[0].IsTypeOf <long>(), Is.True);
                            Assert.That(dtoComponents[1].IsTypeOf <short>(), Is.True);
                        }
                        else
                        {
                            Assert.That(nativeMembers[i].IsTypeOf <long>(), Is.True);
                        }
                        break;
                    }

                    case DateTimeConversionMethod.UnixEpoc:
                    {
                        Assert.That(nativeMembers[i].IsTypeOf <long>(), Is.True);
                        break;
                    }

                    case DateTimeConversionMethod.Timestamp:
                    {
                        Assert.That(nativeMembers[i].IsTypeOf <MessagePackExtendedTypeObject>(), Is.True);
                        var asExt = nativeMembers[i].AsMessagePackExtendedTypeObject();
                        Assert.That(asExt.TypeCode, Is.EqualTo(0xFF));
                        // Actual encoding should be tested in Timestamp tests.
                        break;
                    }
                    }
                }

                // Test round trip
                buffer.Position = 0;

                var result = serializer.Unpack(buffer);
                switch (expected)
                {
                case DateTimeConversionMethod.Native:
                {
                    Assert.That(result.Timestamp, Is.EqualTo(new Timestamp(now.UnixEpochSecondsPart, now.NanosecondsPart / 100 * 100)));
                    Assert.That(result.DateTime, Is.EqualTo(now.ToDateTime().AddSeconds(1)));
                    Assert.That(result.DateTimeOffset, Is.EqualTo(now.ToDateTimeOffset().AddSeconds(2)));
#if (!SILVERLIGHT || WINDOWS_PHONE) && !XAMARIN && !UNITY && !UNITY
                    Assert.That(result.FileTime, Is.EqualTo(now.Add(TimeSpan.FromSeconds(3).Subtract(TimeSpan.FromTicks(now.NanosecondsPart % 100))).ToDateTime().ToWin32FileTimeUtc()));
#endif // ( !SILVERLIGHT || WINDOWS_PHONE ) && !XAMARIN && !UNITY && !UNITY
                    break;
                }

                case DateTimeConversionMethod.UnixEpoc:
                {
                    Assert.That(result.Timestamp, Is.EqualTo(new Timestamp(now.UnixEpochSecondsPart, now.NanosecondsPart / 1000000 * 1000000)));
                    Assert.That(result.DateTime, Is.EqualTo(now.ToDateTime().AddSeconds(1).Subtract(TimeSpan.FromTicks(now.NanosecondsPart / 100 % 10000))));
                    Assert.That(result.DateTimeOffset, Is.EqualTo(now.ToDateTimeOffset().AddSeconds(2).Subtract(TimeSpan.FromTicks(now.NanosecondsPart / 100 % 10000))));
#if (!SILVERLIGHT || WINDOWS_PHONE) && !XAMARIN && !UNITY && !UNITY
                    Assert.That(result.FileTime, Is.EqualTo(now.Add(TimeSpan.FromSeconds(3).Subtract(TimeSpan.FromTicks(now.NanosecondsPart / 100 % 10000))).ToDateTime().ToWin32FileTimeUtc()));
#endif // ( !SILVERLIGHT || WINDOWS_PHONE ) && !XAMARIN && !UNITY && !UNITY
                    break;
                }

                case DateTimeConversionMethod.Timestamp:
                {
                    Assert.That(result.Timestamp, Is.EqualTo(now));
                    Assert.That(result.DateTime, Is.EqualTo(now.ToDateTime().AddSeconds(1)));
                    Assert.That(result.DateTimeOffset, Is.EqualTo(now.ToDateTimeOffset().AddSeconds(2)));
#if (!SILVERLIGHT || WINDOWS_PHONE) && !XAMARIN && !UNITY && !UNITY
                    Assert.That(result.FileTime, Is.EqualTo(now.Add(TimeSpan.FromSeconds(3)).ToDateTime().ToWin32FileTimeUtc()));
#endif // ( !SILVERLIGHT || WINDOWS_PHONE ) && !XAMARIN && !UNITY && !UNITY
                    break;
                }
                }
            }
        }
Ejemplo n.º 2
0
 public DateTimeOffsetMessagePackSerializer(SerializationContext ownerContext, DateTimeConversionMethod conversion)
     : base(ownerContext)
 {
     this._conversion = conversion;
 }
        private static void TestDeserializationCore(DateTimeConversionMethod kind)
        {
            var now         = Timestamp.UtcNow;
            var dateTimeNow = now.ToDateTimeOffset();

            using (var buffer = new MemoryStream())
                using (var packer = Packer.Create(buffer, PackerCompatibilityOptions.None))
                {
                    packer.PackArrayHeader(ClassHasTimestamp.MemberCount);
                    for (var i = 0; i < ClassHasTimestamp.MemberCount; i++)
                    {
                        switch (kind)
                        {
                        case DateTimeConversionMethod.Native:
                        {
                            if (i == 2)
                            {
                                // DateTimeOffset -> [long, shourt]
                                packer.PackArrayHeader(2);
                                packer.Pack(dateTimeNow.AddSeconds(i).Ticks);
                                packer.Pack(( short )0);
                            }
                            else
                            {
                                packer.Pack(dateTimeNow.AddSeconds(i).Ticks);
                            }

                            break;
                        }

                        case DateTimeConversionMethod.UnixEpoc:
                        {
                            packer.Pack(MessagePackConvert.FromDateTimeOffset(dateTimeNow.AddSeconds(i)));
                            break;
                        }

                        case DateTimeConversionMethod.Timestamp:
                        {
                            packer.PackExtendedTypeValue((now.Add(TimeSpan.FromSeconds(i)).Encode()));
                            break;
                        }

                        default:
                        {
                            Assert.Fail("Unexpected Kind");
                            break;
                        }
                        }
                    }

                    var context = new SerializationContext();
                    context.DefaultDateTimeConversionMethod = kind;

                    var serializer = context.GetSerializer <ClassHasTimestamp>();
                    buffer.Position = 0;

                    var result = serializer.Unpack(buffer);
                    switch (kind)
                    {
                    case DateTimeConversionMethod.Native:
                    {
                        Assert.That(result.Timestamp, Is.EqualTo(new Timestamp(now.UnixEpochSecondsPart, now.NanosecondsPart / 100 * 100)));
                        Assert.That(result.DateTime, Is.EqualTo(now.ToDateTime().AddSeconds(1)));
                        Assert.That(result.DateTimeOffset, Is.EqualTo(now.ToDateTimeOffset().AddSeconds(2)));
#if (!SILVERLIGHT || WINDOWS_PHONE) && !XAMARIN && !UNITY && !UNITY
                        Assert.That(result.FileTime, Is.EqualTo(now.Add(TimeSpan.FromSeconds(3).Subtract(TimeSpan.FromTicks(now.NanosecondsPart % 100))).ToDateTime().ToWin32FileTimeUtc()));
#endif // ( !SILVERLIGHT || WINDOWS_PHONE ) && !XAMARIN && !UNITY && !UNITY
                        break;
                    }

                    case DateTimeConversionMethod.UnixEpoc:
                    {
                        Assert.That(result.Timestamp, Is.EqualTo(new Timestamp(now.UnixEpochSecondsPart, now.NanosecondsPart / 1000000 * 1000000)));
                        Assert.That(result.DateTime, Is.EqualTo(now.ToDateTime().AddSeconds(1).Subtract(TimeSpan.FromTicks(now.NanosecondsPart / 100 % 10000))));
                        Assert.That(result.DateTimeOffset, Is.EqualTo(now.ToDateTimeOffset().AddSeconds(2).Subtract(TimeSpan.FromTicks(now.NanosecondsPart / 100 % 10000))));
#if (!SILVERLIGHT || WINDOWS_PHONE) && !XAMARIN && !UNITY && !UNITY
                        Assert.That(result.FileTime, Is.EqualTo(now.Add(TimeSpan.FromSeconds(3).Subtract(TimeSpan.FromTicks(now.NanosecondsPart / 100 % 10000))).ToDateTime().ToWin32FileTimeUtc()));
#endif // ( !SILVERLIGHT || WINDOWS_PHONE ) && !XAMARIN && !UNITY && !UNITY
                        break;
                    }

                    case DateTimeConversionMethod.Timestamp:
                    {
                        Assert.That(result.Timestamp, Is.EqualTo(now));
                        Assert.That(result.DateTime, Is.EqualTo(now.ToDateTime().AddSeconds(1)));
                        Assert.That(result.DateTimeOffset, Is.EqualTo(now.ToDateTimeOffset().AddSeconds(2)));
#if (!SILVERLIGHT || WINDOWS_PHONE) && !XAMARIN && !UNITY && !UNITY
                        Assert.That(result.FileTime, Is.EqualTo(now.Add(TimeSpan.FromSeconds(3)).ToDateTime().ToWin32FileTimeUtc()));
#endif // ( !SILVERLIGHT || WINDOWS_PHONE ) && !XAMARIN && !UNITY && !UNITY
                        break;
                    }
                    }
                }
        }
 public DateTimeOffsetMessagePackSerializer(SerializationContext ownerContext, DateTimeConversionMethod conversion)
     : base(ownerContext, SerializerCapabilities.PackTo | SerializerCapabilities.UnpackFrom)
 {
     this._conversion = conversion;
 }