-
Notifications
You must be signed in to change notification settings - Fork 5k
/
Copy pathDateTimeFormatInfoLongTimePattern.cs
137 lines (125 loc) · 5.63 KB
/
DateTimeFormatInfoLongTimePattern.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.Generic;
using Xunit;
namespace System.Globalization.Tests
{
public class DateTimeFormatInfoLongTimePattern
{
[Fact]
public void LongTimePattern_GetInvariantInfo_ReturnsExpected()
{
Assert.Equal("HH:mm:ss", DateTimeFormatInfo.InvariantInfo.LongTimePattern);
}
public static IEnumerable<object[]> LongTimePattern_Set_TestData()
{
yield return new object[] { string.Empty };
yield return new object[] { "garbage" };
yield return new object[] { "dddd, dd MMMM yyyy HH:mm:ss" };
yield return new object[] { "HH" };
yield return new object[] { "T" };
yield return new object[] { "HH:mm:ss dddd, dd MMMM yyyy" };
yield return new object[] { "HH:mm:ss" };
}
[Theory]
[MemberData(nameof(LongTimePattern_Set_TestData))]
public void LongTimePattern_Set_GetReturnsExpected(string value)
{
var format = new DateTimeFormatInfo();
format.LongTimePattern = value;
Assert.Equal(value, format.LongTimePattern);
}
[Fact]
public void LongTimePattern_Set_InvalidatesDerivedPatterns()
{
const string Pattern = "#$";
var format = new DateTimeFormatInfo();
var d = DateTimeOffset.Now;
d.ToString("F", format); // FullDateTimePattern
d.ToString("G", format); // GeneralLongTimePattern
d.ToString(format); // DateTimeOffsetPattern
format.LongTimePattern = Pattern;
Assert.Contains(Pattern, d.ToString("F", format));
Assert.Contains(Pattern, d.ToString("G", format));
Assert.Contains(Pattern, d.ToString(format));
}
[Fact]
public void LongTimePattern_SetNullValue_ThrowsArgumentNullException()
{
var format = new DateTimeFormatInfo();
AssertExtensions.Throws<ArgumentNullException>("value", () => format.LongTimePattern = null);
}
[Fact]
public void LongTimePattern_SetReadOnly_ThrowsInvalidOperationException()
{
Assert.Throws<InvalidOperationException>(() => DateTimeFormatInfo.InvariantInfo.LongTimePattern = "HH:mm:ss");
}
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsIcuGlobalization))]
public void LongTimePattern_CheckReadingTimeFormatWithSingleQuotes_ICU()
{
// Usually fr-CA long time format has a single quotes e.g. "HH 'h' mm 'min' ss 's'".
// Ensuring when reading such formats from ICU we'll not eat the spaces after the single quotes.
string longTimeFormat = CultureInfo.GetCultureInfo("fr-CA").DateTimeFormat.LongTimePattern;
int startIndex = 0;
while ((startIndex = longTimeFormat.IndexOf('\'', startIndex)) >= 0 && startIndex < longTimeFormat.Length - 1)
{
// We have the opening single quote, find the closing one.
startIndex++;
if ((startIndex = longTimeFormat.IndexOf('\'', startIndex)) > 0 && startIndex < longTimeFormat.Length - 1)
{
Assert.Equal(' ', longTimeFormat[++startIndex]);
}
else
{
break; // done.
}
}
}
[Fact]
public void LongTimePattern_VerifyTimePatterns()
{
Assert.All(CultureInfo.GetCultures(CultureTypes.AllCultures), culture => {
if (DateTimeFormatInfoData.HasBadIcuTimePatterns(culture))
{
return;
}
var pattern = culture.DateTimeFormat.LongTimePattern;
bool use24Hour = false;
bool use12Hour = false;
bool useAMPM = false;
for (var i = 0; i < pattern.Length; i++)
{
switch (pattern[i])
{
case 'H': use24Hour = true; break;
case 'h': use12Hour = true; break;
case 't': useAMPM = true; break;
case '\\': i++; break;
case '\'':
i++;
for (; i < pattern.Length; i++)
{
var c = pattern[i];
if (c == '\'') break;
if (c == '\\') i++;
}
break;
}
}
Assert.True((use24Hour || useAMPM) && (use12Hour ^ use24Hour), $"Bad long time pattern for culture {culture.Name}: '{pattern}'");
});
}
[Fact]
public void LongTimePattern_CheckTimeFormatWithSpaces()
{
var date = DateTime.Today + TimeSpan.FromHours(15) + TimeSpan.FromMinutes(15);
var culture = new CultureInfo("en-US");
string formattedDate = date.ToString("t", culture);
bool containsSpace = formattedDate.Contains(' ');
bool containsNoBreakSpace = formattedDate.Contains('\u00A0');
bool containsNarrowNoBreakSpace = formattedDate.Contains('\u202F');
Assert.True(containsSpace || containsNoBreakSpace || containsNarrowNoBreakSpace,
$"Formatted date string '{formattedDate}' does not contain any of the specified spaces.");
}
}
}