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