1 // Licensed to the .NET Foundation under one or more agreements. 2 // The .NET Foundation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using System.Globalization; 6 using Xunit; 7 8 namespace System.Tests 9 { 10 public static partial class DateTimeOffsetTests 11 { 12 [Fact] ToString_ParseSpan_RoundtripsSuccessfully()13 public static void ToString_ParseSpan_RoundtripsSuccessfully() 14 { 15 DateTimeOffset expected = DateTimeOffset.MaxValue; 16 string expectedString = expected.ToString(); 17 18 Assert.Equal(expectedString, DateTimeOffset.Parse(expectedString.AsReadOnlySpan()).ToString()); 19 Assert.Equal(expectedString, DateTimeOffset.Parse(expectedString.AsReadOnlySpan(), null).ToString()); 20 Assert.Equal(expectedString, DateTimeOffset.Parse(expectedString.AsReadOnlySpan(), null, DateTimeStyles.None).ToString()); 21 22 Assert.True(DateTimeOffset.TryParse(expectedString.AsReadOnlySpan(), out DateTimeOffset actual)); 23 Assert.Equal(expectedString, actual.ToString()); 24 Assert.True(DateTimeOffset.TryParse(expectedString.AsReadOnlySpan(), null, DateTimeStyles.None, out actual)); 25 Assert.Equal(expectedString, actual.ToString()); 26 } 27 28 [Fact] ToString_ParseExactSpan_RoundtripsSuccessfully()29 public static void ToString_ParseExactSpan_RoundtripsSuccessfully() 30 { 31 DateTimeOffset expected = DateTimeOffset.MaxValue; 32 string expectedString = expected.ToString("u"); 33 34 Assert.Equal(expectedString, DateTimeOffset.ParseExact(expectedString, "u", null, DateTimeStyles.None).ToString("u")); 35 Assert.Equal(expectedString, DateTimeOffset.ParseExact(expectedString, new[] { "u" }, null, DateTimeStyles.None).ToString("u")); 36 37 Assert.True(DateTimeOffset.TryParseExact(expectedString, "u", null, DateTimeStyles.None, out DateTimeOffset actual)); 38 Assert.Equal(expectedString, actual.ToString("u")); 39 Assert.True(DateTimeOffset.TryParseExact(expectedString, new[] { "u" }, null, DateTimeStyles.None, out actual)); 40 Assert.Equal(expectedString, actual.ToString("u")); 41 } 42 43 [Fact] TryFormat_ToString_EqualResults()44 public static void TryFormat_ToString_EqualResults() 45 { 46 DateTimeOffset expected = DateTimeOffset.MaxValue; 47 string expectedString = expected.ToString(); 48 49 // Just the right amount of space, succeeds 50 Span<char> actual = new char[expectedString.Length]; 51 Assert.True(expected.TryFormat(actual, out int charsWritten)); 52 Assert.Equal(expectedString.Length, charsWritten); 53 Assert.Equal<char>(expectedString.ToCharArray(), actual.ToArray()); 54 55 // Too little space, fails 56 actual = new char[expectedString.Length - 1]; 57 Assert.False(expected.TryFormat(actual, out charsWritten)); 58 Assert.Equal(0, charsWritten); 59 60 // More than enough space, succeeds 61 actual = new char[expectedString.Length + 1]; 62 Assert.True(expected.TryFormat(actual, out charsWritten)); 63 Assert.Equal(expectedString.Length, charsWritten); 64 Assert.Equal<char>(expectedString.ToCharArray(), actual.Slice(0, expectedString.Length).ToArray()); 65 Assert.Equal(0, actual[actual.Length - 1]); 66 } 67 68 [Fact] UnixEpoch()69 public static void UnixEpoch() 70 { 71 VerifyDateTimeOffset(DateTimeOffset.UnixEpoch, 1970, 1, 1, 0, 0, 0, 0, TimeSpan.Zero); 72 } 73 } 74 } 75