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