diff --git a/dotnet-datetime/DateTimeFormatInCSharp/DateTimeFormatInCSharp/DateTimeFormatInCSharp.csproj b/dotnet-datetime/DateTimeFormatInCSharp/DateTimeFormatInCSharp/DateTimeFormatInCSharp.csproj
index 74abf5c976..dfb40caafc 100644
--- a/dotnet-datetime/DateTimeFormatInCSharp/DateTimeFormatInCSharp/DateTimeFormatInCSharp.csproj
+++ b/dotnet-datetime/DateTimeFormatInCSharp/DateTimeFormatInCSharp/DateTimeFormatInCSharp.csproj
@@ -2,7 +2,7 @@
Exe
- net6.0
+ net10.0
enable
enable
diff --git a/dotnet-datetime/DateTimeFormatInCSharp/Test/CustomFormatTests.cs b/dotnet-datetime/DateTimeFormatInCSharp/Test/CustomFormatTests.cs
index bee4040682..e750be9eb5 100644
--- a/dotnet-datetime/DateTimeFormatInCSharp/Test/CustomFormatTests.cs
+++ b/dotnet-datetime/DateTimeFormatInCSharp/Test/CustomFormatTests.cs
@@ -17,7 +17,7 @@ public void WhenUsingCustomFormatString_ThenValuesAreFromattedOrParsed()
var datetime = new DateTime(2017, 8, 24, 14, 35, 0);
Console.WriteLine("{0:MM/dd/yy H:mm:ss}", datetime); // 08/24/17 14:35:00
- Assert.AreEqual($"08/24/17 14:35:00{Environment.NewLine}", sw.ToString());
+ Assert.AreEqual($"08/24/17 14:35:00{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -31,7 +31,7 @@ public void WhenUsingDayFormatSpecifier_ThenDayValuesAreShown()
Console.WriteLine(datetime.ToString("dd MMMM", CultureInfo.CreateSpecificCulture("en-US"))); // 04 August
Assert.AreEqual($"4 August{Environment.NewLine}" +
- $"04 August{Environment.NewLine}", sw.ToString());
+ $"04 August{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -45,7 +45,7 @@ public void WhenUsingDayFormatSpecifier_ThenWeekDaysAreShown()
Console.WriteLine(datetime.ToString("dddd, d MMMM", new CultureInfo("en-US"))); // Friday, 4 August
Assert.AreEqual($"Fri, 4 August{Environment.NewLine}" +
- $"Friday, 4 August{Environment.NewLine}", sw.ToString());
+ $"Friday, 4 August{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -59,7 +59,7 @@ public void WhenUsingMonthFormatSpecifier_ThenMonthValuesAreShown()
Console.WriteLine(datetime.ToString("MM", CultureInfo.CreateSpecificCulture("en-US"))); // 08
Assert.AreEqual($"8{Environment.NewLine}" +
- $"08{Environment.NewLine}", sw.ToString());
+ $"08{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -73,7 +73,7 @@ public void WhenUsingMonthFormatSpecifier_ThenMonthsAreShown()
Console.WriteLine(datetime.ToString("MMMM", CultureInfo.CreateSpecificCulture("en-US"))); // August
Assert.AreEqual($"Aug{Environment.NewLine}" +
- $"August{Environment.NewLine}", sw.ToString());
+ $"August{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -87,7 +87,7 @@ public void WhenUsingSingleCharacterCustomIdentifier_ThenWorksAsCustomFormatStri
Console.WriteLine(datetime.ToString(" y", CultureInfo.CreateSpecificCulture("en-US")).Trim()); // 17
Assert.AreEqual($"4{Environment.NewLine}" +
- $"17{Environment.NewLine}", sw.ToString());
+ $"17{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -105,7 +105,7 @@ public void WhenUsingYearCustomFormatIdentifier_ThenIsShownWithOneToFourChars()
Assert.AreEqual($"1{Environment.NewLine}" +
$"01{Environment.NewLine}" +
$"2001{Environment.NewLine}" +
- $"2001{Environment.NewLine}", sw.ToString());
+ $"2001{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -119,7 +119,7 @@ public void WhenUsingHourFormatSpecifier_ThenOnetoTwelveDigitsAreShown()
Console.WriteLine(datetime.ToString("hh", CultureInfo.CreateSpecificCulture("en-US"))); // 10
Assert.AreEqual($"10{Environment.NewLine}" +
- $"10{Environment.NewLine}", sw.ToString());
+ $"10{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -133,7 +133,7 @@ public void WhenUsingHourFormatSpecifier_ThenOnetoTwentyThreeDigitsAreShown()
Console.WriteLine(datetime.ToString("HH", CultureInfo.CreateSpecificCulture("en-US"))); // 22
Assert.AreEqual($"22{Environment.NewLine}" +
- $"22{Environment.NewLine}", sw.ToString());
+ $"22{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -147,7 +147,7 @@ public void WhenUsingMinuteFormatSpecifier_ThenMinutesAreShown()
Console.WriteLine(datetime.ToString("mm", CultureInfo.CreateSpecificCulture("en-US"))); // 35
Assert.AreEqual($"35{Environment.NewLine}" +
- $"35{Environment.NewLine}", sw.ToString());
+ $"35{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -161,7 +161,7 @@ public void WhenUsingSecondFormatSpecifier_ThenSecondsAreShown()
Console.WriteLine(datetime.ToString("ss", CultureInfo.CreateSpecificCulture("en-US"))); // 15
Assert.AreEqual($"15{Environment.NewLine}" +
- $"15{Environment.NewLine}", sw.ToString());
+ $"15{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -185,7 +185,7 @@ public void WhenUsingSecondFractionsFormatSpecifier_ThenSecondsFractionsAreShown
$"22:35:15.0180{Environment.NewLine}" +
$"22:35:15.01800{Environment.NewLine}" +
$"22:35:15.018000{Environment.NewLine}" +
- $"22:35:15.0180000{Environment.NewLine}", sw.ToString());
+ $"22:35:15.0180000{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -209,7 +209,7 @@ public void WhenUsingSecondFractionsFormatSpecifier_ThenNonZeroSecondsFractionsA
$"22:35:15.018{Environment.NewLine}" +
$"22:35:15.018{Environment.NewLine}" +
$"22:35:15.018{Environment.NewLine}" +
- $"22:35:15.018{Environment.NewLine}", sw.ToString());
+ $"22:35:15.018{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -223,7 +223,7 @@ public void WhenUsingMeridienFormatSpecifier_ThenMeridienLabelIsShown()
Console.WriteLine(datetime.ToString("hh:mm:ss tt", CultureInfo.CreateSpecificCulture("en-US"))); // 10:35:15 PM
Assert.AreEqual($"10:35:15 P{Environment.NewLine}" +
- $"10:35:15 PM{Environment.NewLine}", sw.ToString());
+ $"10:35:15 PM{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -233,13 +233,18 @@ public void WhenUsingTimeZoneFormatSpecifier_ThenDependsOnKindProperty()
Console.SetOut(sw);
var datetimeLocal = new DateTime(2017, 8, 4, 22, 35, 15, DateTimeKind.Local);
- Console.WriteLine(datetimeLocal.ToString("%K", CultureInfo.CreateSpecificCulture("en-US"))); // +00:00
+ Console.WriteLine(datetimeLocal.ToString("%K", CultureInfo.CreateSpecificCulture("en-US"))); // the machine's UTC offset, e.g. +02:00
var datetimeUtc = new DateTime(2017, 8, 4, 22, 35, 15, DateTimeKind.Utc);
Console.WriteLine(datetimeUtc.ToString("%K", CultureInfo.CreateSpecificCulture("en-US"))); // Z
- Assert.AreEqual($"+00:00{Environment.NewLine}" +
- $"Z{Environment.NewLine}", sw.ToString());
+ // K on a Local value prints the machine's offset, so the expectation is computed
+ // rather than hard-coded -- a literal "+00:00" only passes where the clock is UTC.
+ var localOffset = TimeZoneInfo.Local.GetUtcOffset(datetimeLocal);
+ var expectedLocalOffset = (localOffset < TimeSpan.Zero ? "-" : "+") + localOffset.ToString(@"hh\:mm");
+
+ Assert.AreEqual($"{expectedLocalOffset}{Environment.NewLine}" +
+ $"Z{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -255,7 +260,7 @@ public void WhenUsingTimeZoneFormatSpecifier_ThenDependsOnInternalOffsetProperty
Console.WriteLine(datetimeUtc.ToString("%K", CultureInfo.CreateSpecificCulture("en-US"))); // +00:00
Assert.AreEqual($"+02:00{Environment.NewLine}" +
- $"+00:00{Environment.NewLine}", sw.ToString());
+ $"+00:00{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -271,7 +276,7 @@ public void WhenUsingTimeZoneFormatSpecifier_ThenSignedTimeZoneIsShown()
Assert.AreEqual($"+2{Environment.NewLine}" +
$"+02{Environment.NewLine}" +
- $"+02:00{Environment.NewLine}", sw.ToString());
+ $"+02:00{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -287,7 +292,7 @@ public void WhenUsingEraFormatSpecifier_ThenEraIsShown()
Assert.AreEqual($"AD{Environment.NewLine}" +
$"AD{Environment.NewLine}" +
- $"d. C.{Environment.NewLine}", sw.ToString());
+ $"d. C.{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -302,7 +307,7 @@ public void WhenUsingCustomTimeSeparator_ThenCustomSeparatorIsUsed()
Console.WriteLine(datetime.ToString("HH:mm:ss", formatInfo)); // 04;22;35
- Assert.AreEqual($"04;22;35{Environment.NewLine}", sw.ToString());
+ Assert.AreEqual($"04;22;35{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -316,7 +321,7 @@ public void WhenUsingCustomDateSeparator_ThenCustomSeparatorIsUsed()
formatInfo.DateSeparator = "-";
Console.WriteLine(datetime.ToString("dd/MM/yyyy", formatInfo)); // 24-08-2017
- Assert.AreEqual($"24-08-2017{Environment.NewLine}", sw.ToString());
+ Assert.AreEqual($"24-08-2017{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -328,7 +333,7 @@ public void WhenUsingLiteralCharacters_ThenCharactersAppearUnchanged()
var datetime = new DateTime(2017, 8, 24, 4, 22, 35, 15);
Console.WriteLine(datetime.ToString("dd/MM/yyyy hh:mm:ss EST", CultureInfo.CreateSpecificCulture("en-US"))); // 24/08/2017 04:22:35 EST
- Assert.AreEqual($"24/08/2017 04:22:35 EST{Environment.NewLine}", sw.ToString());
+ Assert.AreEqual($"24/08/2017 04:22:35 EST{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -342,7 +347,7 @@ public void WhenUsingFormatSpecifiersAsLiteralCharacters_ThenCharactersAppearInT
Console.WriteLine(datetime.ToString("dd/MM/yyyy hh:mm:ss 'gmt'", CultureInfo.CreateSpecificCulture("en-US"))); // 24/08/2017 04:22:35 gmt
Assert.AreEqual($"24/08/2017 04:22:35 gmt{Environment.NewLine}" +
- $"24/08/2017 04:22:35 gmt{Environment.NewLine}", sw.ToString());
+ $"24/08/2017 04:22:35 gmt{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
}
}
diff --git a/dotnet-datetime/DateTimeFormatInCSharp/Test/StandardDateFormatTests.cs b/dotnet-datetime/DateTimeFormatInCSharp/Test/StandardDateFormatTests.cs
index b1440eab17..5e611d6627 100644
--- a/dotnet-datetime/DateTimeFormatInCSharp/Test/StandardDateFormatTests.cs
+++ b/dotnet-datetime/DateTimeFormatInCSharp/Test/StandardDateFormatTests.cs
@@ -18,7 +18,7 @@ public void WhenUsingStandardFormatSpecifiers_ThenCurrentCultureFormatIsApplied(
var datetime = new DateTime(2017, 8, 24);
Console.WriteLine(datetime.ToString("d")); // 8/24/2017
- Assert.AreEqual($"8/24/2017{Environment.NewLine}", sw.ToString());
+ Assert.AreEqual($"8/24/2017{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -34,7 +34,7 @@ public void WhenUsingStandardFormatSpecifiers_ThenOutputChangesAccordingToCultur
Assert.AreEqual($"8/24/2017{Environment.NewLine}" +
$"24/8/2017{Environment.NewLine}" +
- $"2017/08/24{Environment.NewLine}", sw.ToString());
+ $"2017/08/24{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -49,7 +49,7 @@ public void WhenUsingDateTimeFormatInfo_ThenOutputChangesAccordingToCustomFormat
Console.WriteLine(datetime.ToString("d", formatInfo)); // 8-24-2017
- Assert.AreEqual($"8-24-2017{Environment.NewLine}", sw.ToString());
+ Assert.AreEqual($"8-24-2017{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -62,11 +62,12 @@ public void WhenUsingFormatSpecifierAndCulture_ThenCanParseCorrectString()
}
[TestMethod]
- [ExpectedException(typeof(FormatException))]
public void WhenUsingFormatSpecifierAndWrongCulture_ThenThrowsException()
{
var dateLiteral = "8/24/2017";
- DateTime.ParseExact(dateLiteral, "d", CultureInfo.CreateSpecificCulture("ja-JP"));
+
+ Assert.ThrowsExactly(() =>
+ DateTime.ParseExact(dateLiteral, "d", CultureInfo.CreateSpecificCulture("ja-JP")));
}
[TestMethod]
@@ -82,7 +83,7 @@ public void WhenUsingLongDateStandardFormat_ThenOutputChangesAccordingToCulture(
Assert.AreEqual($"Thursday, August 24, 2017{Environment.NewLine}" +
$"jueves, 24 de agosto de 2017{Environment.NewLine}" +
- $"Donnerstag, 24. August 2017{Environment.NewLine}", sw.ToString());
+ $"Donnerstag, 24. August 2017{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
}
}
diff --git a/dotnet-datetime/DateTimeFormatInCSharp/Test/StandardDateTimeFormatTests.cs b/dotnet-datetime/DateTimeFormatInCSharp/Test/StandardDateTimeFormatTests.cs
index 4eced06826..61e747eae2 100644
--- a/dotnet-datetime/DateTimeFormatInCSharp/Test/StandardDateTimeFormatTests.cs
+++ b/dotnet-datetime/DateTimeFormatInCSharp/Test/StandardDateTimeFormatTests.cs
@@ -21,7 +21,7 @@ public void WhenUsingFullDateShortTimeStandardFormat_ThenOutputChangesAccordingT
Assert.AreEqual($"Thursday, August 24, 2017 2:35 PM{Environment.NewLine}" +
$"jueves, 24 de agosto de 2017 14:35{Environment.NewLine}" +
- $"Donnerstag, 24. August 2017 14:35{Environment.NewLine}", sw.ToString());
+ $"Donnerstag, 24. August 2017 14:35{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -37,7 +37,7 @@ public void WhenUsingFullDateLongTimeStandardFormat_ThenOutputChangesAccordingTo
Assert.AreEqual($"Thursday, August 24, 2017 2:35:00 PM{Environment.NewLine}" +
$"jueves, 24 de agosto de 2017 14:35:00{Environment.NewLine}" +
- $"Donnerstag, 24. August 2017 14:35:00{Environment.NewLine}", sw.ToString());
+ $"Donnerstag, 24. August 2017 14:35:00{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -53,7 +53,7 @@ public void WhenUsingGeneralDateShortTimeStandardFormat_ThenOutputChangesAccordi
Assert.AreEqual($"8/24/2017 2:35 PM{Environment.NewLine}" +
$"24/8/2017 14:35{Environment.NewLine}" +
- $"24.08.2017 14:35{Environment.NewLine}", sw.ToString());
+ $"24.08.2017 14:35{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -69,7 +69,7 @@ public void WhenUsingGeneralDateLongTimeStandardFormat_ThenOutputChangesAccordin
Assert.AreEqual($"8/24/2017 2:35:00 PM{Environment.NewLine}" +
$"24/8/2017 14:35:00{Environment.NewLine}" +
- $"24.08.2017 14:35:00{Environment.NewLine}", sw.ToString());
+ $"24.08.2017 14:35:00{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -85,7 +85,7 @@ public void WhenRoundTripStandardFormat_ThenTimeZoneIsPreserved()
Console.WriteLine(dateTimeOffset.ToString("O")); // 2017-08-24T14:35:00.0000000+02:00
Assert.AreEqual($"2017-08-24T14:35:00.0000000Z{Environment.NewLine}" +
- $"2017-08-24T14:35:00.0000000+02:00{Environment.NewLine}", sw.ToString());
+ $"2017-08-24T14:35:00.0000000+02:00{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -94,14 +94,16 @@ public void WhenUsingRfc1123StandardFormat_ThenUtcDateTimeMustBeUsed()
var sw = new StringWriter();
Console.SetOut(sw);
- var datetime = new DateTime(2017, 8, 24, 14, 35, 0, DateTimeKind.Unspecified);
+ // The value is created as Utc so ToUniversalTime() is a no-op. An Unspecified value
+ // would be read as local time here, and the result would depend on the machine's zone.
+ var datetime = new DateTime(2017, 8, 24, 14, 35, 0, DateTimeKind.Utc);
Console.WriteLine(datetime.ToUniversalTime().ToString("R")); // Thu, 24 Aug 2017 14:35:00 GMT
var datetimeOffset = new DateTimeOffset(2017, 8, 24, 14, 35, 0, TimeSpan.FromHours(2));
Console.WriteLine(datetimeOffset.ToString("R")); // Thu, 24 Aug 2017 12:35:00 GMT
Assert.AreEqual($"Thu, 24 Aug 2017 14:35:00 GMT{Environment.NewLine}" +
- $"Thu, 24 Aug 2017 12:35:00 GMT{Environment.NewLine}", sw.ToString());
+ $"Thu, 24 Aug 2017 12:35:00 GMT{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -113,7 +115,7 @@ public void WhenUsingSortableStandardFormat_ThenTimeZoneIsntPreserved()
var datetime = new DateTime(2017, 8, 24, 14, 35, 0);
Console.WriteLine(datetime.ToString("s")); // 2017-08-24T14:35:00
- Assert.AreEqual($"2017-08-24T14:35:00{Environment.NewLine}", sw.ToString());
+ Assert.AreEqual($"2017-08-24T14:35:00{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -122,10 +124,12 @@ public void WhenUsingUniversalSortableStandardFormat_ThenUtcTimeIsRepresented()
var sw = new StringWriter();
Console.SetOut(sw);
- var datetime = new DateTime(2017, 8, 24, 14, 35, 0);
+ // Utc, for the same reason as the RFC 1123 test above: ToUniversalTime() on an
+ // Unspecified value converts from the machine's local zone.
+ var datetime = new DateTime(2017, 8, 24, 14, 35, 0, DateTimeKind.Utc);
Console.WriteLine(datetime.ToUniversalTime().ToString("u")); // 2017-08-24 14:35:00Z
- Assert.AreEqual($"2017-08-24 14:35:00Z{Environment.NewLine}", sw.ToString());
+ Assert.AreEqual($"2017-08-24 14:35:00Z{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -139,7 +143,7 @@ public void WhenUsingUniversalFullFormatStandardFormat_ThenUtcTimeIsRepresented(
Console.WriteLine(datetime.ToUniversalTime().ToString("U", CultureInfo.CreateSpecificCulture("es-ES"))); // jueves, 24 de agosto de 2017 14:35:00
Assert.AreEqual($"Thursday, August 24, 2017 2:35:00 PM{Environment.NewLine}" +
- $"jueves, 24 de agosto de 2017 14:35:00{Environment.NewLine}", sw.ToString());
+ $"jueves, 24 de agosto de 2017 14:35:00{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
}
}
diff --git a/dotnet-datetime/DateTimeFormatInCSharp/Test/StandardTimeFormatTests.cs b/dotnet-datetime/DateTimeFormatInCSharp/Test/StandardTimeFormatTests.cs
index 787ee04e08..a5e343d05a 100644
--- a/dotnet-datetime/DateTimeFormatInCSharp/Test/StandardTimeFormatTests.cs
+++ b/dotnet-datetime/DateTimeFormatInCSharp/Test/StandardTimeFormatTests.cs
@@ -19,7 +19,7 @@ public void WhenUsingShortTimeStandardFormat_ThenTimeIsRepresented()
Console.WriteLine(datetime.ToString("t", CultureInfo.CreateSpecificCulture("es-ES"))); // 14:35
Assert.AreEqual($"2:35 PM{Environment.NewLine}" +
- $"14:35{Environment.NewLine}", sw.ToString());
+ $"14:35{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
[TestMethod]
@@ -33,7 +33,7 @@ public void WhenUsingLongTimeStandardFormat_ThenTimeIsRepresented()
Console.WriteLine(datetime.ToString("T", CultureInfo.CreateSpecificCulture("es-ES"))); // 14:35:00
Assert.AreEqual($"2:35:00 PM{Environment.NewLine}" +
- $"14:35:00{Environment.NewLine}", sw.ToString());
+ $"14:35:00{Environment.NewLine}", TextExpectation.NormalizeSpaces(sw.ToString()));
}
}
}
diff --git a/dotnet-datetime/DateTimeFormatInCSharp/Test/Test.csproj b/dotnet-datetime/DateTimeFormatInCSharp/Test/Test.csproj
index f72bee824b..7af97066cb 100644
--- a/dotnet-datetime/DateTimeFormatInCSharp/Test/Test.csproj
+++ b/dotnet-datetime/DateTimeFormatInCSharp/Test/Test.csproj
@@ -1,17 +1,17 @@
- net6.0
+ net10.0
enable
false
-
-
-
-
+
+
+
+
diff --git a/dotnet-datetime/DateTimeFormatInCSharp/Test/TextExpectation.cs b/dotnet-datetime/DateTimeFormatInCSharp/Test/TextExpectation.cs
new file mode 100644
index 0000000000..22e0980a2d
--- /dev/null
+++ b/dotnet-datetime/DateTimeFormatInCSharp/Test/TextExpectation.cs
@@ -0,0 +1,22 @@
+using System.Globalization;
+using System.Linq;
+
+namespace Test
+{
+ // The character a culture puts between the time and its AM/PM designator comes from the
+ // host's ICU data, not from the .NET version: en-US emits an ordinary space (U+0020) on
+ // some hosts and a narrow no-break space (U+202F) on others, so the same assertion can
+ // pass on a Windows desktop and fail in a Linux container. See dotnet/runtime#96022,
+ // closed "working as designed" ("culture formats are provided by the OS and change from
+ // time to time").
+ //
+ // Every expectation in this project is therefore compared after normalising Unicode space
+ // separators to a plain space. The alternative -- pasting an invisible character into a
+ // string literal -- makes the expected value unreadable and still only works on one host.
+ internal static class TextExpectation
+ {
+ public static string NormalizeSpaces(string value) =>
+ string.Concat(value.Select(character =>
+ char.GetUnicodeCategory(character) == UnicodeCategory.SpaceSeparator ? ' ' : character));
+ }
+}