1 // OpenTween - Client of Twitter
2 // Copyright (c) 2018 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
3 // All rights reserved.
5 // This file is part of OpenTween.
7 // This program is free software; you can redistribute it and/or modify it
8 // under the terms of the GNU General Public License as published by the Free
9 // Software Foundation; either version 3 of the License, or (at your option)
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 // You should have received a copy of the GNU General Public License along
18 // with this program. If not, see <http://www.gnu.org/licenses/>, or write to
19 // the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
20 // Boston, MA 02110-1301, USA.
23 using System.Globalization;
28 public class DateTimeUtcTest
31 public void Constructor_DateTest()
33 var utc = new DateTimeUtc(2018, 5, 6);
35 Assert.Equal(new DateTime(2018, 5, 6, 0, 0, 0, 0, DateTimeKind.Utc),
36 utc.ToDateTimeUnsafe());
40 public void Constructor_DateAndTimeTest()
42 var utc = new DateTimeUtc(2018, 5, 6, 11, 22, 33);
44 Assert.Equal(new DateTime(2018, 5, 6, 11, 22, 33, 0, DateTimeKind.Utc),
45 utc.ToDateTimeUnsafe());
49 public void Constructor_DateAndTimeMillisecondsTest()
51 var utc = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 456);
53 Assert.Equal(new DateTime(2018, 5, 6, 11, 22, 33, 456, DateTimeKind.Utc),
54 utc.ToDateTimeUnsafe());
58 public void Constructor_DateTimeOffsetTest()
60 var datetimeOffset = new DateTimeOffset(2018, 5, 6, 11, 22, 33, 456, TimeSpan.FromHours(9));
61 var utc = new DateTimeUtc(datetimeOffset);
63 Assert.Equal(new DateTime(2018, 5, 6, 2, 22, 33, 456, DateTimeKind.Utc),
64 utc.ToDateTimeUnsafe());
68 public void Constructor_DateTimeTest()
70 var datetime = new DateTime(2018, 5, 6, 11, 22, 33, DateTimeKind.Utc);
71 var utc = new DateTimeUtc(datetime);
73 Assert.Equal(datetime, utc.ToDateTimeUnsafe());
77 public void Constructor_LocalDateTimeTest()
79 Assert.Throws<ArgumentException>(
80 () => new DateTimeUtc(new DateTime(2018, 5, 6, 12, 0, 0, DateTimeKind.Local)));
82 Assert.Throws<ArgumentException>(
83 () => new DateTimeUtc(new DateTime(2018, 5, 6, 12, 0, 0, DateTimeKind.Unspecified)));
87 public void ToUnixTime_Test()
89 var utc = new DateTimeUtc(2009, 2, 13, 23, 31, 30, 0);
91 Assert.Equal(1234567890, utc.ToUnixTime());
95 public void ToDateTimeOffset()
97 var utc = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111);
99 Assert.Equal(new DateTimeOffset(2018, 5, 6, 11, 22, 33, 111, TimeSpan.Zero),
100 utc.ToDateTimeOffset());
104 public void ToLocalTime()
106 var utc = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111);
107 var expected = new DateTimeOffset(2018, 5, 6, 11, 22, 33, 111, TimeSpan.Zero).ToLocalTime();
109 Assert.Equal(expected, utc.ToLocalTime());
113 public void CompareTo_Test()
115 var utc1 = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111);
116 var utc2 = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111);
117 var utc3 = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 222);
119 Assert.Equal(0, utc1.CompareTo(utc2));
120 Assert.True(utc1.CompareTo(utc3) < 0);
121 Assert.True(utc3.CompareTo(utc1) > 0);
125 public void Equals_Test()
127 var utc1 = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111);
128 var utc2 = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111);
129 var utc3 = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 222);
131 Assert.True(utc1.Equals(utc2));
132 Assert.True(utc1.Equals((object)utc2));
134 Assert.False(utc1.Equals(utc3));
135 Assert.False(utc1.Equals((object)utc3));
139 public void GetHashCode_Test()
141 var utc1 = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111);
142 var utc2 = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111);
143 var utc3 = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 222);
145 Assert.Equal(utc1.GetHashCode(), utc2.GetHashCode());
146 Assert.NotEqual(utc1.GetHashCode(), utc3.GetHashCode());
150 public void ToString_Test()
152 var datetime = new DateTime(2018, 5, 6, 11, 22, 33, 111, DateTimeKind.Utc);
153 var utc = new DateTimeUtc(datetime);
155 Assert.Equal(datetime.ToString(), utc.ToString());
159 public void ToString_FormatTest()
161 var utc = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111);
163 Assert.Equal("2018-05-06 11:22:33.111 +00:00", utc.ToString("yyyy-MM-dd HH:mm:ss.fff zzz"));
167 public void ToLocalTimeString_Test()
169 var datetime = new DateTime(2018, 5, 6, 11, 22, 33, 111, DateTimeKind.Local);
170 var utc = new DateTimeUtc(datetime.ToUniversalTime());
172 Assert.Equal(datetime.ToString(), utc.ToLocalTimeString());
176 public void ToLocalTimeString_FormatTest()
178 var localDatetime = new DateTime(2018, 5, 6, 11, 22, 33, 111, DateTimeKind.Local);
179 var utc = new DateTimeUtc(localDatetime.ToUniversalTime());
181 Assert.Equal(localDatetime.ToString("O"), utc.ToLocalTimeString("O"));
185 public void OperatorPlus_Test()
187 var utc = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111);
188 var diff = TimeSpan.FromDays(1);
190 Assert.Equal(new DateTime(2018, 5, 7, 11, 22, 33, 111, DateTimeKind.Utc),
191 (utc + diff).ToDateTimeUnsafe());
195 public void OperatorMinus_TimeSpanTest()
197 var utc = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111);
198 var diff = TimeSpan.FromDays(1);
200 Assert.Equal(new DateTime(2018, 5, 5, 11, 22, 33, 111, DateTimeKind.Utc),
201 (utc - diff).ToDateTimeUnsafe());
205 public void OperatorMinus_DateTimeTest()
207 var utc1 = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111);
208 var utc2 = new DateTimeUtc(2018, 5, 7, 11, 22, 33, 111);
210 Assert.Equal(TimeSpan.Zero, utc1 - utc1);
211 Assert.Equal(TimeSpan.FromDays(-1), utc1 - utc2);
212 Assert.Equal(TimeSpan.FromDays(1), utc2 - utc1);
216 public void OperatorEqual_Test()
218 var utc1 = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111);
219 var utc2 = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 222);
221 #pragma warning disable CS1718
222 Assert.True(utc1 == utc1);
223 Assert.False(utc1 == utc2);
225 Assert.False(utc1 != utc1);
226 Assert.True(utc1 != utc2);
227 #pragma warning restore CS1718
231 public void OperatorCompare_Test()
233 var utc1 = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111);
234 var utc2 = new DateTimeUtc(2018, 5, 6, 11, 22, 33, 222);
236 #pragma warning disable CS1718
237 Assert.False(utc1 < utc1);
238 Assert.True(utc1 < utc2);
239 Assert.False(utc2 < utc1);
241 Assert.True(utc1 <= utc1);
242 Assert.True(utc1 <= utc2);
243 Assert.False(utc2 <= utc1);
245 Assert.False(utc1 > utc1);
246 Assert.False(utc1 > utc2);
247 Assert.True(utc2 > utc1);
249 Assert.True(utc1 >= utc1);
250 Assert.False(utc1 >= utc2);
251 Assert.True(utc2 >= utc1);
252 #pragma warning restore CS1718
256 public void MinValue_Test()
257 => Assert.Equal(DateTime.MinValue.Ticks, DateTimeUtc.MinValue.ToDateTimeUnsafe().Ticks);
260 public void MaxValue_Test()
261 => Assert.Equal(DateTime.MaxValue.Ticks, DateTimeUtc.MaxValue.ToDateTimeUnsafe().Ticks);
264 public void FromUnixTime_Test()
266 var utc = DateTimeUtc.FromUnixTime(1234567890);
268 Assert.Equal(new DateTime(2009, 2, 13, 23, 31, 30, 0, DateTimeKind.Utc),
269 utc.ToDateTimeUnsafe());
272 public static TheoryData<string, DateTimeUtc> Parse_Test_Fixtures = new TheoryData<string, DateTimeUtc>
274 { "2018-05-06T11:22:33.111", new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111) },
275 { "2018-05-06T11:22:33.111+00:00", new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111) },
276 { "2018-05-06T11:22:33.111+09:00", new DateTimeUtc(2018, 5, 6, 2, 22, 33, 111) },
280 [MemberData(nameof(Parse_Test_Fixtures))]
281 public void Parse_Test(string input, DateTimeUtc expected)
282 => Assert.Equal(expected, DateTimeUtc.Parse(input, DateTimeFormatInfo.InvariantInfo));
285 public void Parse_ErrorTest()
286 => Assert.Throws<FormatException>(() => DateTimeUtc.Parse("### INVALID ###", DateTimeFormatInfo.InvariantInfo));
288 public static TheoryData<string, bool, DateTimeUtc> TryParse_Test_Fixtures = new TheoryData<string, bool, DateTimeUtc>
290 { "2018-05-06T11:22:33.111", true, new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111) },
291 { "2018-05-06T11:22:33.111+00:00", true, new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111) },
292 { "2018-05-06T11:22:33.111+09:00", true, new DateTimeUtc(2018, 5, 6, 2, 22, 33, 111) },
293 { "### INVALID ###", false, DateTimeUtc.MinValue },
297 [MemberData(nameof(TryParse_Test_Fixtures))]
298 public void TryParse_Test(string input, bool expectedParsed, DateTimeUtc expectedResult)
300 var parsed = DateTimeUtc.TryParse(input, DateTimeFormatInfo.InvariantInfo, out var result);
302 Assert.Equal(expectedParsed, parsed);
303 Assert.Equal(expectedResult, result);
306 public static TheoryData<string, string, bool, DateTimeUtc> TryParseExact_Test_Fixtures = new TheoryData<string, string, bool, DateTimeUtc>
308 { "2018-05-06 11:22:33.111", "yyyy-MM-dd HH:mm:ss.fff", true, new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111) },
309 { "2018-05-06 11:22:33.111 +00:00", "yyyy-MM-dd HH:mm:ss.fff zzz", true, new DateTimeUtc(2018, 5, 6, 11, 22, 33, 111) },
310 { "2018-05-06 11:22:33.111 +09:00", "yyyy-MM-dd HH:mm:ss.fff zzz", true, new DateTimeUtc(2018, 5, 6, 2, 22, 33, 111) },
311 { "2018-05-06 11:22:33.111", "yyyy/MM/dd HH:mm:ss", false, DateTimeUtc.MinValue },
312 { "### INVALID ###", "yyyy-MM-dd HH:mm:ss.fff", false, DateTimeUtc.MinValue },
316 [MemberData(nameof(TryParseExact_Test_Fixtures))]
317 public void TryParseExact_Test(string input, string format, bool expectedParsed, DateTimeUtc expectedResult)
319 var parsed = DateTimeUtc.TryParseExact(input, new[] { format }, DateTimeFormatInfo.InvariantInfo, out var result);
321 Assert.Equal(expectedParsed, parsed);
322 Assert.Equal(expectedResult, result);