diff --git a/CHANGES.txt b/CHANGES.txt index 0de4aca8e..326598977 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -753,3 +753,8 @@ Release 1.0.0 2018-6-14 * Fix map keys order emitted by asymmetric (serialization only) serializer are inconsistent across platform. * Fix Unity build does not honor serialization related attributes correctly. * Fix internal inconsitency between serialization related attributes detection and their parameter retrieval. + +Release 1.0.1 2018-09-09 + + BUG FIXES + * Fix conversion from DateTime[Offset] to Timestamp failure for before Unix epoc. #296 diff --git a/MsgPack.nuspec b/MsgPack.nuspec index 3a4062a4f..aa088e4d2 100644 --- a/MsgPack.nuspec +++ b/MsgPack.nuspec @@ -76,6 +76,12 @@ This package provides MessagePack serialization/deserialization APIs. This pacak + + + + + + @@ -89,4 +95,4 @@ This package provides MessagePack serialization/deserialization APIs. This pacak - \ No newline at end of file + diff --git a/README.md b/README.md index bbf89204a..9ed575081 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,17 @@ # MessagePack for CLI -[![Build status release](https://ci.appveyor.com/api/projects/status/5ln7u7efwjepj6o8?svg=true)](https://ci.appveyor.com/project/yfakariya/msgpack-cli-x2p85) -[![Build status debug](https://ci.appveyor.com/api/projects/status/dlc0v4rrolwj0t2t?svg=true)](https://ci.appveyor.com/project/yfakariya/msgpack-cli) -[![Build status debug net35](https://ci.appveyor.com/api/projects/status/cjp8phlnbwj7gkj9?svg=true)](https://ci.appveyor.com/project/yfakariya/msgpack-cli-3jme9) -[![Build status debug net35 CodeDOM](https://ci.appveyor.com/api/projects/status/1mw78wkxx50jvab1?svg=true)](https://ci.appveyor.com/project/yfakariya/msgpack-cli-rhnh0) +## CI Status + +|**Configuration**|**Status**| +|:--|:--| +|Release |[![Build status release](https://ci.appveyor.com/api/projects/status/5ln7u7efwjepj6o8?svg=true)](https://ci.appveyor.com/project/yfakariya/msgpack-cli-x2p85)| +|Debug (.NET Core 2.0) |[![Build status debug (.NET Core 2.0)](https://ci.appveyor.com/api/projects/status/dlc0v4rrolwj0t2t?svg=true)](https://ci.appveyor.com/project/yfakariya/msgpack-cli)| +|Debug (.NET Core 2.0) |[![Build status debug (.NET Core 1.0)](https://ci.appveyor.com/api/projects/status/avurf519all92v5u?svg=true)](https://ci.appveyor.com/project/yfakariya/msgpack-cli-g3guk)| +|Debug (.NET Framework 4.x) |[![Build status debug (.NET Framework 4.x)](https://ci.appveyor.com/api/projects/status/np6723q2uiqofr1a?svg=true)](https://ci.appveyor.com/project/yfakariya/msgpack-cli-nuf62)| +|Debug (Code DOM)] |[![Build status debug (Code DOM)](https://ci.appveyor.com/api/projects/status/1mw78wkxx50jvab1?svg=true)](https://ci.appveyor.com/project/yfakariya/msgpack-cli-rhnh0)| +|Debug (miscs)] |[![Build status debug (miscs)](https://ci.appveyor.com/api/projects/status/avufc51yu2cm6idw?svg=true)](https://ci.appveyor.com/project/yfakariya/msgpack-cli-bo856)| +|Debug (.NET Framework 3.5) |[![Build status debug (.NET Framework 3.5)](https://ci.appveyor.com/api/projects/status/cjp8phlnbwj7gkj9?svg=true)](https://ci.appveyor.com/project/yfakariya/msgpack-cli-3jme9)| +|Debug (.NET Framework 3.5 Code DOM) |[![Build status debug (.NET Framework 3.5 Code DOM)](https://ci.appveyor.com/api/projects/status/1mw78wkxx50jvab1?svg=true)](https://ci.appveyor.com/project/yfakariya/msgpack-cli-rhnh0)| ## What is it? diff --git a/appveyor-debug-codedom.yml b/appveyor-debug-codedom.yml new file mode 100644 index 000000000..d4aebb8cc --- /dev/null +++ b/appveyor-debug-codedom.yml @@ -0,0 +1,39 @@ +version: '{branch}-{build}' +image: Visual Studio 2017 +skip_tags: true +configuration: Debug +assembly_info: + patch: true + file: '**\*AssemblyInfo.cs' + assembly_version: $(AssemblyBaseVersion).0 + assembly_file_version: $(AssemblyBaseVersion).{build} + assembly_informational_version: $(PackageVersion) +environment: + XamarinMSBuildExtensionsPath: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild +install: +- cmd: >- + cd .\build +- ps: >- + ./SetBuildEnv.ps1 + + cd .. +build_script: +- ps: >- + Write-Host "Configuration=${env:CONFIGURATION}" + + cd ./build + + ./Build.ps1 + + if ( $LastExitCode -ne 0 ) + { + Write-Error "Failed to build." + exit 1 + } + + cd .. +test_script: +- cmd: >- + cd ./build + + ./RunUnitTests-CodeDOM.cmd diff --git a/appveyor-debug-netcore10.yml b/appveyor-debug-netcore10.yml new file mode 100644 index 000000000..5389a70c0 --- /dev/null +++ b/appveyor-debug-netcore10.yml @@ -0,0 +1,39 @@ +version: '{branch}-{build}' +image: Visual Studio 2017 +skip_tags: true +configuration: Debug +assembly_info: + patch: true + file: '**\*AssemblyInfo.cs' + assembly_version: $(AssemblyBaseVersion).0 + assembly_file_version: $(AssemblyBaseVersion).{build} + assembly_informational_version: $(PackageVersion) +environment: + XamarinMSBuildExtensionsPath: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild +install: +- cmd: >- + cd .\build +- ps: >- + ./SetBuildEnv.ps1 + + cd .. +build_script: +- ps: >- + Write-Host "Configuration=${env:CONFIGURATION}" + + cd ./build + + ./Build.ps1 + + if ( $LastExitCode -ne 0 ) + { + Write-Error "Failed to build." + exit 1 + } + + cd .. +test_script: +- cmd: >- + cd ./build + + ./RunUnitTests-NetCore10.cmd diff --git a/appveyor-debug4x.yml b/appveyor-debug4x.yml new file mode 100644 index 000000000..66fff7217 --- /dev/null +++ b/appveyor-debug4x.yml @@ -0,0 +1,39 @@ +version: '{branch}-{build}' +image: Visual Studio 2017 +skip_tags: true +configuration: Debug +assembly_info: + patch: true + file: '**\*AssemblyInfo.cs' + assembly_version: $(AssemblyBaseVersion).0 + assembly_file_version: $(AssemblyBaseVersion).{build} + assembly_informational_version: $(PackageVersion) +environment: + XamarinMSBuildExtensionsPath: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild +install: +- cmd: >- + cd .\build +- ps: >- + ./SetBuildEnv.ps1 + + cd .. +build_script: +- ps: >- + Write-Host "Configuration=${env:CONFIGURATION}" + + cd ./build + + ./Build.ps1 + + if ( $LastExitCode -ne 0 ) + { + Write-Error "Failed to build." + exit 1 + } + + cd .. +test_script: +- cmd: >- + cd ./build + + ./RunUnitTests4x.cmd diff --git a/appveyor-release.yml b/appveyor-release.yml index b763baea5..49dca6f53 100644 --- a/appveyor-release.yml +++ b/appveyor-release.yml @@ -3,9 +3,7 @@ image: Visual Studio 2017 branches: only: - master - - 0.7 - - 0.8 - - 0.9 + - /[0-9]+\.[0-9]+(\.[xX])?/ configuration: Release assembly_info: patch: true diff --git a/build/Build.ps1 b/build/Build.ps1 index 8f4e35827..c397399b9 100644 --- a/build/Build.ps1 +++ b/build/Build.ps1 @@ -158,7 +158,7 @@ if ( $buildConfig -eq 'Release' ) { Write-Host "Build NuGet packages..." - & $msbuild ../src/MsgPack/MsgPack.csproj /t:pack /v:minimal /p:Configuration=$buildConfig /p:IncludeSource=true /p:NuspecProperties=version=$env:PackageVersion + & $msbuild ../src/MsgPack/MsgPack.csproj /t:pack /v:minimal /p:Configuration=$buildConfig /p:IncludeSource=true /p:IncludeSymbols=true /p:NuspecProperties=version=$env:PackageVersion Move-Item ../bin/*.nupkg ../dist/ Copy-Item ../bin/* ./MsgPack-CLI/ -Recurse -Exclude @("*.vshost.*") diff --git a/build/RunUnitTests-CodeDOM.cmd b/build/RunUnitTests-CodeDOM.cmd new file mode 100644 index 000000000..4274d15f5 --- /dev/null +++ b/build/RunUnitTests-CodeDOM.cmd @@ -0,0 +1,8 @@ +dotnet test %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest.CodeDom/MsgPack.UnitTest.CodeDom.csproj +if not %errorlevel% == 0 exit /b 1 +@rem WinRT related tests require developer license... +@rem vstest.console /logger:Appveyor /InIsolation %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest.WinRT/AppPackages/MsgPack.UnitTest.WinRT_1.1.0.0_AnyCPU_Debug_Test/MsgPack.UnitTest.WinRT_1.1.0.0_AnyCPU_Debug.appx +@rem vstest.console /logger:Appveyor /InIsolation %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest.BclExtensions.WinRT/AppPackages/MsgPack.UnitTest.BclExtensions.WinRT_1.1.0.0_AnyCPU_Debug_Test/MsgPack.UnitTest.BclExtensions.WinRT_1.1.0.0_AnyCPU_Debug.appx +@rem vstest.console /logger:Appveyor /InIsolation %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest.WinRT.WindowsPhone/AppPackages/MsgPack.UnitTest.WinRT.WindowsPhone_1.0.0.0_x86_Debug_Test/MsgPack.UnitTest.WinRT.WindowsPhone_1.0.0.0_x86_Debug.appx +@rem UWP test with NUnit3 is not available in cli +@rem Xamarin tests are not available in cli \ No newline at end of file diff --git a/build/RunUnitTests-NetCore10.cmd b/build/RunUnitTests-NetCore10.cmd new file mode 100644 index 000000000..b1ec28612 --- /dev/null +++ b/build/RunUnitTests-NetCore10.cmd @@ -0,0 +1,10 @@ +dotnet test %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest/MsgPack.UnitTest.csproj --framework netcoreapp1.0 +if not %errorlevel% == 0 exit /b 1 +dotnet test %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest.BclExtensions/MsgPack.UnitTest.BclExtensions.csproj --framework netcoreapp1.0 +if not %errorlevel% == 0 exit /b 1 +@rem WinRT related tests require developer license... +@rem vstest.console /logger:Appveyor /InIsolation %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest.WinRT/AppPackages/MsgPack.UnitTest.WinRT_1.1.0.0_AnyCPU_Debug_Test/MsgPack.UnitTest.WinRT_1.1.0.0_AnyCPU_Debug.appx +@rem vstest.console /logger:Appveyor /InIsolation %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest.BclExtensions.WinRT/AppPackages/MsgPack.UnitTest.BclExtensions.WinRT_1.1.0.0_AnyCPU_Debug_Test/MsgPack.UnitTest.BclExtensions.WinRT_1.1.0.0_AnyCPU_Debug.appx +@rem vstest.console /logger:Appveyor /InIsolation %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest.WinRT.WindowsPhone/AppPackages/MsgPack.UnitTest.WinRT.WindowsPhone_1.0.0.0_x86_Debug_Test/MsgPack.UnitTest.WinRT.WindowsPhone_1.0.0.0_x86_Debug.appx +@rem UWP test with NUnit3 is not available in cli +@rem Xamarin tests are not available in cli \ No newline at end of file diff --git a/build/RunUnitTests.cmd b/build/RunUnitTests.cmd index a8f210bdb..ed3e8884c 100644 --- a/build/RunUnitTests.cmd +++ b/build/RunUnitTests.cmd @@ -1,8 +1,6 @@ -dotnet test %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest/MsgPack.UnitTest.csproj +dotnet test %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest/MsgPack.UnitTest.csproj --framework netcoreapp2.0 if not %errorlevel% == 0 exit /b 1 -dotnet test %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest.BclExtensions/MsgPack.UnitTest.BclExtensions.csproj -if not %errorlevel% == 0 exit /b 1 -dotnet test %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest.CodeDom/MsgPack.UnitTest.CodeDom.csproj +dotnet test %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest.BclExtensions/MsgPack.UnitTest.BclExtensions.csproj --framework netcoreapp2.0 if not %errorlevel% == 0 exit /b 1 @rem WinRT related tests require developer license... @rem vstest.console /logger:Appveyor /InIsolation %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest.WinRT/AppPackages/MsgPack.UnitTest.WinRT_1.1.0.0_AnyCPU_Debug_Test/MsgPack.UnitTest.WinRT_1.1.0.0_AnyCPU_Debug.appx diff --git a/build/RunUnitTests4x.cmd b/build/RunUnitTests4x.cmd new file mode 100644 index 000000000..4b1b79408 --- /dev/null +++ b/build/RunUnitTests4x.cmd @@ -0,0 +1,10 @@ +dotnet test %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest/MsgPack.UnitTest.csproj --framework net47 +if not %errorlevel% == 0 exit /b 1 +dotnet test %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest.BclExtensions/MsgPack.UnitTest.BclExtensions.csproj --framework net47 +if not %errorlevel% == 0 exit /b 1 +@rem WinRT related tests require developer license... +@rem vstest.console /logger:Appveyor /InIsolation %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest.WinRT/AppPackages/MsgPack.UnitTest.WinRT_1.1.0.0_AnyCPU_Debug_Test/MsgPack.UnitTest.WinRT_1.1.0.0_AnyCPU_Debug.appx +@rem vstest.console /logger:Appveyor /InIsolation %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest.BclExtensions.WinRT/AppPackages/MsgPack.UnitTest.BclExtensions.WinRT_1.1.0.0_AnyCPU_Debug_Test/MsgPack.UnitTest.BclExtensions.WinRT_1.1.0.0_AnyCPU_Debug.appx +@rem vstest.console /logger:Appveyor /InIsolation %APPVEYOR_BUILD_FOLDER%/test/MsgPack.UnitTest.WinRT.WindowsPhone/AppPackages/MsgPack.UnitTest.WinRT.WindowsPhone_1.0.0.0_x86_Debug_Test/MsgPack.UnitTest.WinRT.WindowsPhone_1.0.0.0_x86_Debug.appx +@rem UWP test with NUnit3 is not available in cli +@rem Xamarin tests are not available in cli \ No newline at end of file diff --git a/build/Version.txt b/build/Version.txt index afaf360d3..7f207341d 100644 --- a/build/Version.txt +++ b/build/Version.txt @@ -1 +1 @@ -1.0.0 \ No newline at end of file +1.0.1 \ No newline at end of file diff --git a/src/MsgPack/PackerUnpackerStreamOptions.cs b/src/MsgPack/PackerUnpackerStreamOptions.cs index 71a1bf8f5..9500851db 100644 --- a/src/MsgPack/PackerUnpackerStreamOptions.cs +++ b/src/MsgPack/PackerUnpackerStreamOptions.cs @@ -82,9 +82,19 @@ private static bool ShouldWrapStream( Stream stream ) #else internal #endif - static readonly PackerUnpackerStreamOptions SingletonForAsync = + static readonly PackerUnpackerStreamOptions SingletonForAsyncPacking = + // It is OK for serialize to do buffering because we explicitly call FlushAsync for it. new PackerUnpackerStreamOptions { OwnsStream = true, WithBuffering = true }; + #if UNITY && DEBUG + public +#else + internal +#endif + static readonly PackerUnpackerStreamOptions SingletonForAsyncUnpacking = + // Buffering causes data loss in deserialization because buffered bytes will be gone in a tail of Deserialize(Stream) call. + new PackerUnpackerStreamOptions { OwnsStream = true, WithBuffering = false }; + #if UNITY && DEBUG public #else diff --git a/src/MsgPack/Serialization/MessagePackSerializer`1.cs b/src/MsgPack/Serialization/MessagePackSerializer`1.cs index 8434bc622..5355763f1 100644 --- a/src/MsgPack/Serialization/MessagePackSerializer`1.cs +++ b/src/MsgPack/Serialization/MessagePackSerializer`1.cs @@ -219,7 +219,7 @@ public Task PackAsync( Stream stream, T objectTree ) /// public async Task PackAsync( Stream stream, T objectTree, CancellationToken cancellationToken ) { - var packer = Packer.Create( stream, this.PackerCompatibilityOptions, PackerUnpackerStreamOptions.SingletonForAsync ); + var packer = Packer.Create( stream, this.PackerCompatibilityOptions, PackerUnpackerStreamOptions.SingletonForAsyncPacking ); try { await this.PackToAsync( packer, objectTree, cancellationToken ).ConfigureAwait( false ); @@ -324,7 +324,7 @@ public Task UnpackAsync( Stream stream ) public async Task UnpackAsync( Stream stream, CancellationToken cancellationToken ) { // Unpacker does not have finalizer, so just avoiding unpacker disposing prevents stream closing. - var unpacker = Unpacker.Create( stream, PackerUnpackerStreamOptions.SingletonForAsync, DefaultUnpackerOptions ); + var unpacker = Unpacker.Create( stream, PackerUnpackerStreamOptions.SingletonForAsyncUnpacking, DefaultUnpackerOptions ); if ( !( await unpacker.ReadAsync( cancellationToken ).ConfigureAwait( false ) ) ) { SerializationExceptions.ThrowUnexpectedEndOfStream( unpacker ); diff --git a/src/MsgPack/Timestamp.Conversion.cs b/src/MsgPack/Timestamp.Conversion.cs index f6fbc24ef..56b28063c 100644 --- a/src/MsgPack/Timestamp.Conversion.cs +++ b/src/MsgPack/Timestamp.Conversion.cs @@ -133,6 +133,14 @@ private static void FromOffsetTicks( long ticks, out long unixEpocSeconds, out i long remaining; unixEpocSeconds = DivRem( ticks, SecondsToTicks, out remaining ); nanoSeconds = unchecked( ( int )remaining ) * 100; + if ( nanoSeconds < 0 ) + { + // In this case, we must adjust these values + // from "negative nanosec from nearest larger negative integer" + // to "positive nanosec from nearest smaller nagative integer". + unixEpocSeconds -= 1; + nanoSeconds = ( MaxNanoSeconds + 1 ) + nanoSeconds; + } } /// diff --git a/test/MsgPack.UnitTest.BclExtensions.WinRT/MsgPack.UnitTest.BclExtensions.WinRT.csproj b/test/MsgPack.UnitTest.BclExtensions.WinRT/MsgPack.UnitTest.BclExtensions.WinRT.csproj index d1374018d..f262117be 100644 --- a/test/MsgPack.UnitTest.BclExtensions.WinRT/MsgPack.UnitTest.BclExtensions.WinRT.csproj +++ b/test/MsgPack.UnitTest.BclExtensions.WinRT/MsgPack.UnitTest.BclExtensions.WinRT.csproj @@ -15,7 +15,7 @@ MsgPack.UnitTest.BclExtensions.WinRT_TemporaryKey.pfx ..\..\ true - 34322AD6CF171CC843FCCE936CB6B9B616B961E1 + AA68CFB533B03B5B4FAD8AE85A404BD5936CB7C7 8.1 12 @@ -23,7 +23,8 @@ - + + $(DefineConstants);NETFX_CORE;NETSTANDARD1_1;FEATURE_TAP;MSTEST ;2008 diff --git a/test/MsgPack.UnitTest.BclExtensions.WinRT/MsgPack.UnitTest.BclExtensions.WinRT_TemporaryKey.pfx b/test/MsgPack.UnitTest.BclExtensions.WinRT/MsgPack.UnitTest.BclExtensions.WinRT_TemporaryKey.pfx index 322dc6f60..9c3c1d013 100644 Binary files a/test/MsgPack.UnitTest.BclExtensions.WinRT/MsgPack.UnitTest.BclExtensions.WinRT_TemporaryKey.pfx and b/test/MsgPack.UnitTest.BclExtensions.WinRT/MsgPack.UnitTest.BclExtensions.WinRT_TemporaryKey.pfx differ diff --git a/test/MsgPack.UnitTest.Uwp.Aot/MsgPack.UnitTest.Uwp.Aot.csproj b/test/MsgPack.UnitTest.Uwp.Aot/MsgPack.UnitTest.Uwp.Aot.csproj index ac6872671..405c158f6 100644 --- a/test/MsgPack.UnitTest.Uwp.Aot/MsgPack.UnitTest.Uwp.Aot.csproj +++ b/test/MsgPack.UnitTest.Uwp.Aot/MsgPack.UnitTest.Uwp.Aot.csproj @@ -14,7 +14,7 @@ {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} MsgPack.UnitTest.Uwp.Aot_TemporaryKey.pfx 14.0 - C125CA52683091C62F7746FF9A159E44B2A18673 + 880646284800F8F3356B8C7E3E734562D8BB304F diff --git a/test/MsgPack.UnitTest.Uwp.Aot/MsgPack.UnitTest.Uwp.Aot_TemporaryKey.pfx b/test/MsgPack.UnitTest.Uwp.Aot/MsgPack.UnitTest.Uwp.Aot_TemporaryKey.pfx index bdea5d913..8a0d0bd47 100644 Binary files a/test/MsgPack.UnitTest.Uwp.Aot/MsgPack.UnitTest.Uwp.Aot_TemporaryKey.pfx and b/test/MsgPack.UnitTest.Uwp.Aot/MsgPack.UnitTest.Uwp.Aot_TemporaryKey.pfx differ diff --git a/test/MsgPack.UnitTest.Uwp/MsgPack.UnitTest.Uwp.csproj b/test/MsgPack.UnitTest.Uwp/MsgPack.UnitTest.Uwp.csproj index 081f56673..6f5dfbce1 100644 --- a/test/MsgPack.UnitTest.Uwp/MsgPack.UnitTest.Uwp.csproj +++ b/test/MsgPack.UnitTest.Uwp/MsgPack.UnitTest.Uwp.csproj @@ -14,11 +14,12 @@ {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} MsgPack.UnitTest.Uwp_TemporaryKey.pfx 14.0 - 0CEFF2E3DC6DD3A7245B2FB641B6DE056C5A79D9 + 807856C98966D121CA69C33F7D6475CF03AA8633 - + + $(DefineConstants);NETFX_CORE;WINDOWS_UWP;NETSTANDARD1_3;FEATURE_TAP ;2008 false diff --git a/test/MsgPack.UnitTest.Uwp/MsgPack.UnitTest.Uwp_TemporaryKey.pfx b/test/MsgPack.UnitTest.Uwp/MsgPack.UnitTest.Uwp_TemporaryKey.pfx index d9a6dd761..604dac0b0 100644 Binary files a/test/MsgPack.UnitTest.Uwp/MsgPack.UnitTest.Uwp_TemporaryKey.pfx and b/test/MsgPack.UnitTest.Uwp/MsgPack.UnitTest.Uwp_TemporaryKey.pfx differ diff --git a/test/MsgPack.UnitTest.WinRT/MsgPack.UnitTest.WinRT.csproj b/test/MsgPack.UnitTest.WinRT/MsgPack.UnitTest.WinRT.csproj index e0e54b445..ef2acfe77 100644 --- a/test/MsgPack.UnitTest.WinRT/MsgPack.UnitTest.WinRT.csproj +++ b/test/MsgPack.UnitTest.WinRT/MsgPack.UnitTest.WinRT.csproj @@ -11,7 +11,7 @@ 512 {BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} MsgPack.UnitTest.WinRT_TemporaryKey.pfx - A411E1A11B99FF48CFDEDA3098F7F4D0FB6D746D + DEBDFCC31BC8F851996AD84C394EA999CA3ED9D1 8.1 12 @@ -19,7 +19,8 @@ - + + $(DefineConstants);NETFX_CORE;NETSTANDARD1_1;FEATURE_TAP;MSTEST ;2008 diff --git a/test/MsgPack.UnitTest.WinRT/MsgPack.UnitTest.WinRT_TemporaryKey.pfx b/test/MsgPack.UnitTest.WinRT/MsgPack.UnitTest.WinRT_TemporaryKey.pfx index 66ea08c7a..194d5586e 100644 Binary files a/test/MsgPack.UnitTest.WinRT/MsgPack.UnitTest.WinRT_TemporaryKey.pfx and b/test/MsgPack.UnitTest.WinRT/MsgPack.UnitTest.WinRT_TemporaryKey.pfx differ diff --git a/test/MsgPack.UnitTest/Serialization/RegressionTests.cs b/test/MsgPack.UnitTest/Serialization/RegressionTests.cs index 65bdf4434..36be0c54f 100644 --- a/test/MsgPack.UnitTest/Serialization/RegressionTests.cs +++ b/test/MsgPack.UnitTest/Serialization/RegressionTests.cs @@ -547,5 +547,27 @@ public void TestIssue269() var forString = Assert.Throws( () => target.AsString() ); Assert.That( forString.Message, Is.EqualTo( "Do not convert MsgPack.MessagePackExtendedTypeObject MessagePackObject to System.String." ) ); } + +#if FEATURE_TAP + [Test] + public async Task TestIssue321_AsyncBuffering() + { + var context = new SerializationContext(); + var serializer = context.GetSerializer(); + using ( var stream = new MyMemoryStream() ) + { + await serializer.PackAsync( stream, "hello" ); + await serializer.PackAsync( stream, "world" ); + stream.Position = 0; + var result1 = await serializer.UnpackAsync( stream ); + // Ensure no exceptions are thrown. + var result2 = await serializer.UnpackAsync( stream ); + } + } +#endif // FEATURE_TAP + + public class MyMemoryStream : MemoryStream + { + } } } diff --git a/test/MsgPack.UnitTest/TimestampTest.Conversion.cs b/test/MsgPack.UnitTest/TimestampTest.Conversion.cs index e57acad2f..2dd85b81b 100644 --- a/test/MsgPack.UnitTest/TimestampTest.Conversion.cs +++ b/test/MsgPack.UnitTest/TimestampTest.Conversion.cs @@ -285,6 +285,7 @@ private static void AssertSubseconds( Timestamp target, DateTime expected ) Assert.That( target.Microsecond, Is.EqualTo( ticks / 10 ), "Microsecond" ); Assert.That( target.Nanosecond, Is.EqualTo( ( ticks % 10 ) * 100 ), "Nanosecond" ); } + [Test] public void TestFromDateTimeOffset_UtcNow_OK() { @@ -536,5 +537,379 @@ private static void AssertSubseconds( Timestamp target, DateTimeOffset expected Assert.That( target.Microsecond, Is.EqualTo( ticks / 10 ), "Microsecond" ); Assert.That( target.Nanosecond, Is.EqualTo( ( ticks % 10 ) * 100 ), "Nanosecond" ); } + +#if !NET35 && !SILVERLIGHT && !NETSTANDARD1_1 + + [Test] + public void TestFromDateTime_UnixEpoc_OK() + { + var source = DateTimeOffset.FromUnixTimeMilliseconds( 0 ).DateTime; + var target = Timestamp.FromDateTime( source ); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + } + + [Test] + public void TestFromDateTime_UnixEpocMinus1Millisecond_OK() + { + var source = DateTimeOffset.FromUnixTimeMilliseconds( -1 ).DateTime; + var target = Timestamp.FromDateTime( source ); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + } + + [Test] + public void TestFromDateTime_UnixEpocPlus1Millisecond_OK() + { + var source = DateTimeOffset.FromUnixTimeMilliseconds( 1 ).DateTime; + var target = Timestamp.FromDateTime( source ); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + } + + [Test] + public void TestFromDateTime_UnixEpocMinusSecond_OK() + { + var source = DateTimeOffset.FromUnixTimeSeconds( -1 ).DateTime; + var target = Timestamp.FromDateTime( source ); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + } + + [Test] + public void TestFromDateTime_UnixEpocPlus1Second_OK() + { + var source = DateTimeOffset.FromUnixTimeSeconds( 1 ).DateTime; + var target = Timestamp.FromDateTime( source ); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + } + + [Test] + public void TestToDateTime_UnixEpoc_OK() + { + var source = default( Timestamp ); + var target = source.ToDateTime(); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + AssertUtc( target ); + } + + [Test] + public void TestToDateTime_UnixEpocMinus1Millisecond_OK() + { + var source = default( Timestamp ).Add( TimeSpan.FromMilliseconds( -1 ) ); + var target = source.ToDateTime(); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + AssertUtc( target ); + } + + [Test] + public void TestToDateTime_UnixEpocPlus1Millisecond_OK() + { + var source = default( Timestamp ).Add( TimeSpan.FromMilliseconds( 1 ) ); + var target = source.ToDateTime(); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + AssertUtc( target ); + } + + [Test] + public void TestToDateTime_UnixEpocMinus1Second_OK() + { + var source = default( Timestamp ).Add( TimeSpan.FromSeconds( -1 ) ); + var target = source.ToDateTime(); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + AssertUtc( target ); + } + + [Test] + public void TestToDateTime_UnixEpocPlus1Second_OK() + { + var source = default( Timestamp ).Add( TimeSpan.FromSeconds( 1 ) ); + var target = source.ToDateTime(); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + AssertUtc( target ); + } + + [Test] + public void TestFromDateTimeOffset_UnixEpoc_OK() + { + var source = DateTimeOffset.FromUnixTimeMilliseconds( 0 ); + var target = Timestamp.FromDateTimeOffset( source ); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + } + + [Test] + public void TestFromDateTimeOffset_UnixEpocMinus1Millisecond_OK() + { + var source = DateTimeOffset.FromUnixTimeMilliseconds( -1 ); + var target = Timestamp.FromDateTimeOffset( source ); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + } + + [Test] + public void TestFromDateTimeOffset_UnixEpocPlus1Millisecond_OK() + { + var source = DateTimeOffset.FromUnixTimeMilliseconds( 1 ); + var target = Timestamp.FromDateTimeOffset( source ); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + } + + [Test] + public void TestFromDateTimeOffset_UnixEpocMinus1Second_OK() + { + var source = DateTimeOffset.FromUnixTimeSeconds( -1 ); + var target = Timestamp.FromDateTimeOffset( source ); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + } + + [Test] + public void TestFromDateTimeOffset_UnixEpocPlus1Second_OK() + { + var source = DateTimeOffset.FromUnixTimeSeconds( 1 ); + var target = Timestamp.FromDateTimeOffset( source ); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + } + + [Test] + public void TestToDateTimeOffset_UnixEpoc_OK() + { + var source = default( Timestamp ); + var target = source.ToDateTimeOffset(); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + AssertUtc( target ); + } + + [Test] + public void TestToDateTimeOffset_UnixEpocMinus1Millisecond_OK() + { + var source = default( Timestamp ).Add( TimeSpan.FromMilliseconds( -1 ) ); + var target = source.ToDateTimeOffset(); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + AssertUtc( target ); + } + + [Test] + public void TestToDateTimeOffset_UnixEpocPlus1Millisecond_OK() + { + var source = default( Timestamp ).Add( TimeSpan.FromMilliseconds( 1 ) ); + var target = source.ToDateTimeOffset(); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + AssertUtc( target ); + } + + [Test] + public void TestToDateTimeOffset_UnixEpocMinus1Second_OK() + { + var source = default( Timestamp ).Add( TimeSpan.FromSeconds( -1 ) ); + var target = source.ToDateTimeOffset(); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + AssertUtc( target ); + } + + [Test] + public void TestToDateTimeOffset_UnixEpocPlus1Second_OK() + { + var source = default( Timestamp ).Add( TimeSpan.FromSeconds( 1 ) ); + var target = source.ToDateTimeOffset(); + var expected = source; + Assert.That( target.Year, Is.EqualTo( expected.Year ), "Year" ); + Assert.That( target.Month, Is.EqualTo( expected.Month ), "Month" ); + Assert.That( target.Day, Is.EqualTo( expected.Day ), "Day" ); + Assert.That( target.DayOfYear, Is.EqualTo( expected.DayOfYear ), "DayOfYear" ); + Assert.That( target.DayOfWeek, Is.EqualTo( expected.DayOfWeek ), "DayOfWeek" ); + Assert.That( target.Hour, Is.EqualTo( expected.Hour ), "Hour" ); + Assert.That( target.Minute, Is.EqualTo( expected.Minute ), "Minute" ); + Assert.That( target.Second, Is.EqualTo( expected.Second ), "Second" ); + Assert.That( target.Millisecond, Is.EqualTo( expected.Millisecond ), "Millisecond" ); + AssertSubseconds( target, expected ); + AssertUtc( target ); + } + +#endif // NET35 && !SILVERLIGHT && !NETSTANDARD1_1 } } diff --git a/test/MsgPack.UnitTest/TimestampTest.Conversion.tt b/test/MsgPack.UnitTest/TimestampTest.Conversion.tt index d0030d8a3..1621c3772 100644 --- a/test/MsgPack.UnitTest/TimestampTest.Conversion.tt +++ b/test/MsgPack.UnitTest/TimestampTest.Conversion.tt @@ -126,9 +126,38 @@ foreach ( var type in new [] { "DateTime", "DateTimeOffset" } ) Assert.That( target.Microsecond, Is.EqualTo( ticks / 10 ), "Microsecond" ); Assert.That( target.Nanosecond, Is.EqualTo( ( ticks % 10 ) * 100 ), "Nanosecond" ); } + <# } #> +#if !NET35 && !SILVERLIGHT && !NETSTANDARD1_1 + +<# + WriteConversionTest( "FromDateTime_UnixEpoc_OK", "DateTimeOffset.FromUnixTimeMilliseconds( 0 ).DateTime", "Timestamp.FromDateTime( {0} )", null, null ); + WriteConversionTest( "FromDateTime_UnixEpocMinus1Millisecond_OK", "DateTimeOffset.FromUnixTimeMilliseconds( -1 ).DateTime", "Timestamp.FromDateTime( {0} )", null, null ); + WriteConversionTest( "FromDateTime_UnixEpocPlus1Millisecond_OK", "DateTimeOffset.FromUnixTimeMilliseconds( 1 ).DateTime", "Timestamp.FromDateTime( {0} )", null, null ); + WriteConversionTest( "FromDateTime_UnixEpocMinusSecond_OK", "DateTimeOffset.FromUnixTimeSeconds( -1 ).DateTime", "Timestamp.FromDateTime( {0} )", null, null ); + WriteConversionTest( "FromDateTime_UnixEpocPlus1Second_OK", "DateTimeOffset.FromUnixTimeSeconds( 1 ).DateTime", "Timestamp.FromDateTime( {0} )", null, null ); + + WriteConversionTest( "ToDateTime_UnixEpoc_OK", "default( Timestamp )", "{0}.ToDateTime()", null, "AssertUtc( {0} )" ); + WriteConversionTest( "ToDateTime_UnixEpocMinus1Millisecond_OK", "default( Timestamp ).Add( TimeSpan.FromMilliseconds( -1 ) )", "{0}.ToDateTime()", null, "AssertUtc( {0} )" ); + WriteConversionTest( "ToDateTime_UnixEpocPlus1Millisecond_OK", "default( Timestamp ).Add( TimeSpan.FromMilliseconds( 1 ) )", "{0}.ToDateTime()", null, "AssertUtc( {0} )" ); + WriteConversionTest( "ToDateTime_UnixEpocMinus1Second_OK", "default( Timestamp ).Add( TimeSpan.FromSeconds( -1 ) )", "{0}.ToDateTime()", null, "AssertUtc( {0} )" ); + WriteConversionTest( "ToDateTime_UnixEpocPlus1Second_OK", "default( Timestamp ).Add( TimeSpan.FromSeconds( 1 ) )", "{0}.ToDateTime()", null, "AssertUtc( {0} )" ); + + WriteConversionTest( "FromDateTimeOffset_UnixEpoc_OK", "DateTimeOffset.FromUnixTimeMilliseconds( 0 )", "Timestamp.FromDateTimeOffset( {0} )", null, null ); + WriteConversionTest( "FromDateTimeOffset_UnixEpocMinus1Millisecond_OK", "DateTimeOffset.FromUnixTimeMilliseconds( -1 )", "Timestamp.FromDateTimeOffset( {0} )", null, null ); + WriteConversionTest( "FromDateTimeOffset_UnixEpocPlus1Millisecond_OK", "DateTimeOffset.FromUnixTimeMilliseconds( 1 )", "Timestamp.FromDateTimeOffset( {0} )", null, null ); + WriteConversionTest( "FromDateTimeOffset_UnixEpocMinus1Second_OK", "DateTimeOffset.FromUnixTimeSeconds( -1 )", "Timestamp.FromDateTimeOffset( {0} )", null, null ); + WriteConversionTest( "FromDateTimeOffset_UnixEpocPlus1Second_OK", "DateTimeOffset.FromUnixTimeSeconds( 1 )", "Timestamp.FromDateTimeOffset( {0} )", null, null ); + + WriteConversionTest( "ToDateTimeOffset_UnixEpoc_OK", "default( Timestamp )", "{0}.ToDateTimeOffset()", null, "AssertUtc( {0} )" ); + WriteConversionTest( "ToDateTimeOffset_UnixEpocMinus1Millisecond_OK", "default( Timestamp ).Add( TimeSpan.FromMilliseconds( -1 ) )", "{0}.ToDateTimeOffset()", null, "AssertUtc( {0} )" ); + WriteConversionTest( "ToDateTimeOffset_UnixEpocPlus1Millisecond_OK", "default( Timestamp ).Add( TimeSpan.FromMilliseconds( 1 ) )", "{0}.ToDateTimeOffset()", null, "AssertUtc( {0} )" ); + WriteConversionTest( "ToDateTimeOffset_UnixEpocMinus1Second_OK", "default( Timestamp ).Add( TimeSpan.FromSeconds( -1 ) )", "{0}.ToDateTimeOffset()", null, "AssertUtc( {0} )" ); + WriteConversionTest( "ToDateTimeOffset_UnixEpocPlus1Second_OK", "default( Timestamp ).Add( TimeSpan.FromSeconds( 1 ) )", "{0}.ToDateTimeOffset()", null, "AssertUtc( {0} )" ); +#> +#endif // NET35 && !SILVERLIGHT && !NETSTANDARD1_1 } } <#+