diff --git a/src/Workspaces/CSharpTest/OrganizeImports/OrganizeUsingsTests.cs b/src/Workspaces/CSharpTest/OrganizeImports/OrganizeUsingsTests.cs index 28a4e731b17e7..4c288d8ada9e7 100644 --- a/src/Workspaces/CSharpTest/OrganizeImports/OrganizeUsingsTests.cs +++ b/src/Workspaces/CSharpTest/OrganizeImports/OrganizeUsingsTests.cs @@ -11,6 +11,7 @@ using Microsoft.CodeAnalysis.OrganizeImports; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Test.Utilities; +using Microsoft.CodeAnalysis.UnitTests; using Roslyn.Test.Utilities; using Xunit; @@ -120,7 +121,7 @@ namespace N2 { using H; using G; - } + } } namespace N3 @@ -138,7 +139,7 @@ namespace N5 { using N; using M; - } + } }"; var final = @@ -160,7 +161,7 @@ namespace N2 { using G; using H; - } + } } namespace N3 @@ -178,7 +179,7 @@ namespace N5 { using M; using N; - } + } }"; await CheckAsync(initial, final); } @@ -1038,13 +1039,44 @@ public async Task CaseSensitivity1() using Bbb; using cc; using cC; -using CC; +using CC;"; -// If Kana is sensitive あ != ア, if Kana is insensitive あ == ア. -// If Width is sensitiveア != ア, if Width is insensitive ア == ア."; + string sortedKana; + if (GlobalizationUtilities.ICUMode()) + { + sortedKana = +@"using あ; +using ア; +using ああ; +using あア; +using アあ; +using アア; +using あア; +using アア; +using ア; +using アあ; +using アア; +using アア;"; + } + else + { + sortedKana = +@"using ア; +using ア; +using あ; +using アア; +using アア; +using アア; +using アア; +using アあ; +using アあ; +using あア; +using あア; +using ああ;"; + } var final = -@"using a; +@$"using a; using A; using aa; using aA; @@ -1071,21 +1103,8 @@ public async Task CaseSensitivity1() using cC; using Cc; using CC; -using ア; -using ア; -using あ; -using アア; -using アア; -using アア; -using アア; -using アあ; -using アあ; -using あア; -using あア; -using ああ; - -// If Kana is sensitive あ != ア, if Kana is insensitive あ == ア. -// If Width is sensitiveア != ア, if Width is insensitive ア == ア."; +{sortedKana} +"; await CheckAsync(initial, final); } @@ -1106,7 +1125,26 @@ public async Task CaseSensitivity2() using アア; using アア;"; - var final = + if (GlobalizationUtilities.ICUMode()) + { + await CheckAsync(initial, +@"using あ; +using ア; +using ああ; +using あア; +using アあ; +using アア; +using あア; +using アア; +using ア; +using アあ; +using アア; +using アア; +"); + } + else + { + await CheckAsync(initial, @"using ア; using ア; using あ; @@ -1119,9 +1157,8 @@ public async Task CaseSensitivity2() using あア; using あア; using ああ; -"; - - await CheckAsync(initial, final); +"); + } } [WorkItem(20988, "https://github.com/dotnet/roslyn/issues/20988")] diff --git a/src/Workspaces/CoreTestUtilities/GlobalizationUtilities.cs b/src/Workspaces/CoreTestUtilities/GlobalizationUtilities.cs new file mode 100644 index 0000000000000..edc03bc324111 --- /dev/null +++ b/src/Workspaces/CoreTestUtilities/GlobalizationUtilities.cs @@ -0,0 +1,26 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Globalization; + +namespace Microsoft.CodeAnalysis.UnitTests; +internal class GlobalizationUtilities +{ + /// + /// The final ordering of kana depends on what globalization mode is being used. + /// On .net framework it is NLS, but on .net core + newer versions of windows, it defers to ICU + /// See https://docs.microsoft.com/en-us/dotnet/core/extensions/globalization-icu + /// and https://github.com/dotnet/runtime/blob/78065413b2d1b4f0ed26343567379e992a3e26ee/src/libraries/System.Globalization/tests/CompareInfo/CompareInfoTests.cs#L100 + /// + /// This helper allows us to figure out at runtime which mode is being used so tests can behave accordingly. + /// + public static bool ICUMode() + { + // Copied from https://docs.microsoft.com/en-us/dotnet/core/extensions/globalization-icu#determine-if-your-app-is-using-icu + var sortVersion = CultureInfo.InvariantCulture.CompareInfo.Version; + var bytes = sortVersion.SortId.ToByteArray(); + var version = bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0]; + return version != 0 && version == sortVersion.FullVersion; + } +} diff --git a/src/Workspaces/VisualBasicTest/OrganizeImports/OrganizeImportsTests.vb b/src/Workspaces/VisualBasicTest/OrganizeImports/OrganizeImportsTests.vb index be7f54db55752..3fbd56dddfff3 100644 --- a/src/Workspaces/VisualBasicTest/OrganizeImports/OrganizeImportsTests.vb +++ b/src/Workspaces/VisualBasicTest/OrganizeImports/OrganizeImportsTests.vb @@ -13,6 +13,7 @@ Imports Roslyn.Test.Utilities Imports Xunit Imports Microsoft.CodeAnalysis.[Shared].Extensions Imports Microsoft.CodeAnalysis.OrganizeImports +Imports Microsoft.CodeAnalysis.UnitTests Namespace Microsoft.CodeAnalysis.VisualBasic.Workspaces.UnitTests.OrganizeImports <[UseExportProvider]> @@ -673,11 +674,53 @@ Imports Bbb Imports cc Imports cC Imports CC + -// If Kana is sensitive あ != ア, if Kana is insensitive あ == ア. -// If Width is sensitiveア != ア, if Width is insensitive ア == ア. - - Dim final = + Dim final As XElement + If GlobalizationUtilities.ICUMode() Then + final = +Imports a +Imports A +Imports aa +Imports aA +Imports Aa +Imports AA +Imports b +Imports B +Imports bb +Imports bB +Imports Bb +Imports BB +Imports bbb +Imports bbB +Imports bBb +Imports bBB +Imports Bbb +Imports BbB +Imports BBb +Imports BBB +Imports c +Imports C +Imports cc +Imports cC +Imports cC +Imports Cc +Imports CC +Imports あ +Imports ア +Imports ああ +Imports あア +Imports アあ +Imports アア +Imports あア +Imports アア +Imports ア +Imports アあ +Imports アア +Imports アア + + Else + final = Imports a Imports A Imports aa @@ -717,9 +760,9 @@ Imports アあ Imports あア Imports あア Imports ああ + + End If -// If Kana is sensitive あ != ア, if Kana is insensitive あ == ア. -// If Width is sensitiveア != ア, if Width is insensitive ア == ア. Await CheckAsync(initial, final) End Function @@ -739,7 +782,24 @@ Imports アあ Imports アア Imports アア - Dim final = + Dim final As XElement + If GlobalizationUtilities.ICUMode() Then + final = +Imports あ +Imports ア +Imports ああ +Imports あア +Imports アあ +Imports アア +Imports あア +Imports アア +Imports ア +Imports アあ +Imports アア +Imports アア + + Else + final = Imports ア Imports ア Imports あ @@ -753,6 +813,7 @@ Imports あア Imports あア Imports ああ + End If Await CheckAsync(initial, final) End Function