diff --git a/src/Workspaces/CSharpTest/OrganizeImports/OrganizeUsingsTests.cs b/src/Workspaces/CSharpTest/OrganizeImports/OrganizeUsingsTests.cs index 102471bfc5043..da23856c4d420 100644 --- a/src/Workspaces/CSharpTest/OrganizeImports/OrganizeUsingsTests.cs +++ b/src/Workspaces/CSharpTest/OrganizeImports/OrganizeUsingsTests.cs @@ -10,6 +10,7 @@ using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Test.Utilities; +using Microsoft.CodeAnalysis.UnitTests; using Roslyn.Test.Utilities; using Xunit; @@ -118,7 +119,7 @@ namespace N2 { using H; using G; - } + } } namespace N3 @@ -136,7 +137,7 @@ namespace N5 { using N; using M; - } + } }"; var final = @@ -158,7 +159,7 @@ namespace N2 { using G; using H; - } + } } namespace N3 @@ -176,7 +177,7 @@ namespace N5 { using M; using N; - } + } }"; await CheckAsync(initial, final); } @@ -1036,13 +1037,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; @@ -1069,21 +1101,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); } @@ -1104,7 +1123,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 あ; @@ -1117,9 +1155,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 a8e7643c8043e..bbc7330c0a8d3 100644 --- a/src/Workspaces/VisualBasicTest/OrganizeImports/OrganizeImportsTests.vb +++ b/src/Workspaces/VisualBasicTest/OrganizeImports/OrganizeImportsTests.vb @@ -11,6 +11,8 @@ Imports Microsoft.CodeAnalysis.Options 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]> @@ -663,11 +665,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 @@ -707,9 +751,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 @@ -729,7 +773,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 あ @@ -743,6 +804,7 @@ Imports あア Imports あア Imports ああ + End If Await CheckAsync(initial, final) End Function