[System.Threading.Tasks.Dataflow] Replace implementation with CoreFx version
[mono.git] / mcs / class / corlib / Test / System / DateTimeOffsetTestCoreFx.cs
1 // Copyright (c) Microsoft. All rights reserved.
2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
4 using System;
5 using System.Globalization;
6 using NUnit.Framework;
7
8
9 namespace MonoTests.System {
10
11 [TestFixture]
12 public static class DateTimeOffsetUnixTimeConversionTests
13 {
14     private class TestTime
15     {
16         private TestTime(DateTimeOffset dateTimeOffset, long unixTimeMilliseconds, long unixTimeSeconds)
17         {
18             DateTimeOffset = dateTimeOffset;
19             UnixTimeMilliseconds = unixTimeMilliseconds;
20             UnixTimeSeconds = unixTimeSeconds;
21         }
22
23         public static TestTime FromMilliseconds(DateTimeOffset dateTimeOffset, long unixTimeMilliseconds)
24         {
25             long unixTimeSeconds = unixTimeMilliseconds / 1000;
26
27             // Always round UnixTimeSeconds down toward 1/1/0001 00:00:00
28             // (this happens automatically for unixTimeMilliseconds > 0)
29             bool hasSubSecondPrecision = unixTimeMilliseconds % 1000 != 0;
30             if (unixTimeMilliseconds < 0 && hasSubSecondPrecision)
31             {
32                 --unixTimeSeconds;
33             }
34
35             return new TestTime(dateTimeOffset, unixTimeMilliseconds, unixTimeSeconds);
36         }
37
38         public static TestTime FromSeconds(DateTimeOffset dateTimeOffset, long unixTimeSeconds)
39         {
40             return new TestTime(dateTimeOffset, unixTimeSeconds * 1000, unixTimeSeconds);
41         }
42
43         public DateTimeOffset DateTimeOffset { get; private set; }
44         public long UnixTimeMilliseconds { get; private set; }
45         public long UnixTimeSeconds { get; private set; }
46     }
47
48     private static readonly TestTime[] s_testTimes = {
49         TestTime.FromMilliseconds(DateTimeOffset.MinValue, -62135596800000),
50         TestTime.FromMilliseconds(DateTimeOffset.MaxValue, 253402300799999),
51         TestTime.FromMilliseconds(new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero), 0),
52         TestTime.FromMilliseconds(new DateTimeOffset(2014, 6, 13, 17, 21, 50, TimeSpan.Zero), 1402680110000),
53         TestTime.FromMilliseconds(new DateTimeOffset(2830, 12, 15, 1, 23, 45, TimeSpan.Zero), 27169089825000),
54         TestTime.FromMilliseconds(new DateTimeOffset(2830, 12, 15, 1, 23, 45, 399, TimeSpan.Zero), 27169089825399),
55         TestTime.FromMilliseconds(new DateTimeOffset(9999, 12, 30, 23, 24, 25, TimeSpan.Zero), 253402212265000),
56         TestTime.FromMilliseconds(new DateTimeOffset(1907, 7, 7, 7, 7, 7, TimeSpan.Zero), -1971967973000),
57         TestTime.FromMilliseconds(new DateTimeOffset(1907, 7, 7, 7, 7, 7, 1, TimeSpan.Zero), -1971967972999),
58         TestTime.FromMilliseconds(new DateTimeOffset(1907, 7, 7, 7, 7, 7, 777, TimeSpan.Zero), -1971967972223),
59         TestTime.FromMilliseconds(new DateTimeOffset(601636288270011234, TimeSpan.Zero), -1971967972999)
60     };
61
62     [Test]
63     public static void TestToUnixTime()
64     {
65         foreach (var test in s_testTimes)
66         {
67             TestToUnixTimeMilliseconds(test);
68             TestToUnixTimeSeconds(test);
69         }
70     }
71
72     private static void TestToUnixTimeMilliseconds(TestTime test)
73     {
74         long expectedMilliseconds = test.UnixTimeMilliseconds;
75         long actualMilliseconds = test.DateTimeOffset.ToUnixTimeMilliseconds();
76         Assert.Equals(expectedMilliseconds, actualMilliseconds);
77     }
78
79     private static void TestToUnixTimeSeconds(TestTime test)
80     {
81         long expectedSeconds = test.UnixTimeSeconds;
82         long actualSeconds = test.DateTimeOffset.ToUnixTimeSeconds();
83         Assert.Equals(expectedSeconds, actualSeconds);
84     }
85
86     [Test]
87     public static void TestFromUnixTime()
88     {
89         foreach (var test in s_testTimes)
90         {
91             TestFromUnixTimeMilliseconds(test);
92             TestFromUnixTimeSeconds(test);
93         }
94     }
95
96     private static void TestFromUnixTimeMilliseconds(TestTime test)
97     {
98         // Only assert that expected == actual up to millisecond precision for conversion from milliseconds
99         long expectedTicks = (test.DateTimeOffset.UtcTicks / TimeSpan.TicksPerMillisecond) * TimeSpan.TicksPerMillisecond;
100         long actualTicks = DateTimeOffset.FromUnixTimeMilliseconds(test.UnixTimeMilliseconds).UtcTicks;
101         Assert.Equals(expectedTicks, actualTicks);
102     }
103
104     private static void TestFromUnixTimeSeconds(TestTime test)
105     {
106         // Only assert that expected == actual up to second precision for conversion from seconds
107         long expectedTicks = (test.DateTimeOffset.UtcTicks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond;
108         long actualTicks = DateTimeOffset.FromUnixTimeSeconds(test.UnixTimeSeconds).UtcTicks;
109         Assert.Equals(expectedTicks, actualTicks);
110     }
111
112
113     [Test]
114     public static void TestRoundtripDateTimes()
115     {
116         foreach (var test in s_testTimes)
117         {
118             // Roundtrip through Unix time in milliseconds
119             long unixTimeMilliseconds = test.DateTimeOffset.ToUnixTimeMilliseconds();
120             TestFromUnixTimeMilliseconds(TestTime.FromMilliseconds(test.DateTimeOffset, unixTimeMilliseconds));
121
122             // Roundtrip through Unix time in seconds
123             long unixTimeSeconds = test.DateTimeOffset.ToUnixTimeSeconds();
124             TestFromUnixTimeSeconds(TestTime.FromSeconds(test.DateTimeOffset, unixTimeSeconds));
125         }
126     }
127
128     [Test]
129     public static void TestRoundtripUnixTimes()
130     {
131         foreach (var test in s_testTimes)
132         {
133             // Roundtrip Unix time in milliseconds
134             DateTimeOffset dateTime = DateTimeOffset.FromUnixTimeMilliseconds(test.UnixTimeMilliseconds);
135             TestToUnixTimeMilliseconds(TestTime.FromMilliseconds(dateTime, test.UnixTimeMilliseconds));
136
137             // Roundtrip Unix time in seconds
138             dateTime = DateTimeOffset.FromUnixTimeSeconds(test.UnixTimeSeconds);
139             TestToUnixTimeSeconds(TestTime.FromSeconds(dateTime, test.UnixTimeSeconds));
140         }
141     }
142 }
143 }