Skip to content

Commit 68dde19

Browse files
authored
[iOS][non-icu] Implement missing Locale and Casing functions (dotnet#94038)
Implement missing Locale and Casing function
1 parent f1d73da commit 68dde19

File tree

23 files changed

+289
-133
lines changed

23 files changed

+289
-133
lines changed

src/libraries/Common/src/Interop/Interop.Locale.iOS.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ internal static partial class Interop
77
{
88
internal static partial class Globalization
99
{
10-
[LibraryImport(Libraries.GlobalizationNative, EntryPoint = "GlobalizationNative_GetLocaleNameNative", StringMarshalling = StringMarshalling.Utf8)]
11-
internal static partial string GetLocaleNameNative(string localeName);
10+
[LibraryImport(Libraries.GlobalizationNative, EntryPoint = "GlobalizationNative_GetDefaultLocaleNameNative", StringMarshalling = StringMarshalling.Utf8)]
11+
internal static partial string GetDefaultLocaleNameNative();
1212

1313
[LibraryImport(Libraries.GlobalizationNative, EntryPoint = "GlobalizationNative_GetLocaleInfoStringNative", StringMarshalling = StringMarshalling.Utf8)]
1414
internal static partial string GetLocaleInfoStringNative(string localeName, uint localeStringData);
@@ -22,10 +22,17 @@ internal static partial class Globalization
2222
[LibraryImport(Libraries.GlobalizationNative, EntryPoint = "GlobalizationNative_GetLocaleInfoSecondaryGroupingSizeNative", StringMarshalling = StringMarshalling.Utf8)]
2323
internal static partial int GetLocaleInfoSecondaryGroupingSizeNative(string localeName, uint localeGroupingData);
2424

25-
[LibraryImport(Libraries.GlobalizationNative, EntryPoint = "GlobalizationNative_GetLocaleTimeFormatNative", StringMarshalling = StringMarshalling.Utf8)]
26-
internal static partial string GetLocaleTimeFormatNative(string localeName, [MarshalAs(UnmanagedType.Bool)] bool shortFormat);
25+
[LibraryImport(Libraries.GlobalizationNative, EntryPoint = "GlobalizationNative_GetLocaleNameNative", StringMarshalling = StringMarshalling.Utf8)]
26+
internal static partial string GetLocaleNameNative(string localeName);
2727

2828
[LibraryImport(Libraries.GlobalizationNative, EntryPoint = "GlobalizationNative_GetLocalesNative", StringMarshalling = StringMarshalling.Utf16)]
2929
internal static partial int GetLocalesNative([Out] char[]? value, int valueLength);
30+
31+
[LibraryImport(Libraries.GlobalizationNative, EntryPoint = "GlobalizationNative_GetLocaleTimeFormatNative", StringMarshalling = StringMarshalling.Utf8)]
32+
internal static partial string GetLocaleTimeFormatNative(string localeName, [MarshalAs(UnmanagedType.Bool)] bool shortFormat);
33+
34+
[LibraryImport(Libraries.GlobalizationNative, EntryPoint = "GlobalizationNative_IsPredefinedLocaleNative", StringMarshalling = StringMarshalling.Utf8)]
35+
[return: MarshalAs(UnmanagedType.Bool)]
36+
internal static partial bool IsPredefinedLocaleNative(string localeName);
3037
}
3138
}

src/libraries/Common/tests/TestUtilities/System/PlatformDetection.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,12 +366,16 @@ public static string GetDistroVersionString()
366366
public static Version ICUVersion => m_icuVersion.Value;
367367

368368
public static bool IsInvariantGlobalization => m_isInvariant.Value;
369+
public static bool IsHybridGlobalization => m_isHybrid.Value;
369370
public static bool IsHybridGlobalizationOnBrowser => m_isHybrid.Value && IsBrowser;
370371
public static bool IsHybridGlobalizationOnOSX => m_isHybrid.Value && (IsOSX || IsMacCatalyst || IsiOS || IstvOS);
371372
public static bool IsNotHybridGlobalizationOnBrowser => !IsHybridGlobalizationOnBrowser;
372373
public static bool IsNotInvariantGlobalization => !IsInvariantGlobalization;
374+
public static bool IsNotHybridGlobalization => !IsHybridGlobalization;
375+
public static bool IsNotHybridGlobalizationOnOSX => !IsHybridGlobalizationOnOSX;
373376
public static bool IsIcuGlobalization => ICUVersion > new Version(0, 0, 0, 0);
374377
public static bool IsIcuGlobalizationAndNotHybridOnBrowser => IsIcuGlobalization && IsNotHybridGlobalizationOnBrowser;
378+
public static bool IsIcuGlobalizationAndNotHybrid => IsIcuGlobalization && IsNotHybridGlobalization;
375379
public static bool IsNlsGlobalization => IsNotInvariantGlobalization && !IsIcuGlobalization;
376380

377381
public static bool IsSubstAvailable

src/libraries/System.Globalization/tests/CompareInfo/CompareInfoTests.IsSuffix.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ public void IsSuffix(CompareInfo compareInfo, string source, string value, Compa
162162
[Fact]
163163
public void IsSuffix_UnassignedUnicode()
164164
{
165-
bool result = PlatformDetection.IsIcuGlobalization ? false : true;
165+
bool result = PlatformDetection.IsIcuGlobalization || PlatformDetection.IsHybridGlobalizationOnOSX ? false : true;
166166
int expectedMatchLength = (result) ? 6 : 0;
167167

168168
IsSuffix(s_invariantCompare, "FooBar", "Foo\uFFFFBar", CompareOptions.None, result, expectedMatchLength);

src/libraries/System.Globalization/tests/CompareInfo/CompareInfoTests.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public void EqualsTest(CompareInfo compare1, object value, bool expected)
6060
new object[] { "", CompareOptions.None, "\u200c", CompareOptions.None, true }, // see comment at bottom of SortKey_TestData
6161
};
6262

63-
[ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsNotHybridGlobalizationOnBrowser))]
63+
[ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsNotHybridGlobalization))]
6464
[MemberData(nameof(GetHashCodeTestData))]
6565
public void GetHashCodeTest(string source1, CompareOptions options1, string source2, CompareOptions options2, bool expected)
6666
{
@@ -345,14 +345,14 @@ public static void LcidTest(string cultureName, int lcid)
345345
Assert.Equal(lcid, ci.LCID);
346346
}
347347

348-
[ConditionalTheory(typeof(CompareInfoTests), nameof(IsNotWindowsKanaRegressedVersionAndNotHybridGlobalizationOnWasm))]
348+
[ConditionalTheory(typeof(CompareInfoTests), nameof(IsNotWindowsKanaRegressedVersionAndNotHybridGlobalization))]
349349
[MemberData(nameof(SortKey_Kana_TestData))]
350350
public void SortKeyKanaTest(CompareInfo compareInfo, string string1, string string2, CompareOptions options, int expected)
351351
{
352352
SortKeyTest(compareInfo, string1, string2, options, expected);
353353
}
354354

355-
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsHybridGlobalizationOnBrowser))]
355+
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsHybridGlobalization))]
356356
public void SortKeyTestNotSupported()
357357
{
358358
try
@@ -395,7 +395,7 @@ public void SortKeyTestNotSupported()
395395
private static bool WindowsVersionHasTheCompareStringRegression =>
396396
PlatformDetection.IsNlsGlobalization && CompareStringEx("", NORM_LINGUISTIC_CASING, "", 0, "\u200C", 1, IntPtr.Zero, IntPtr.Zero, 0) != 2;
397397

398-
[ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsNotHybridGlobalizationOnBrowser))]
398+
[ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsNotHybridGlobalization))]
399399
[MemberData(nameof(SortKey_TestData))]
400400
public void SortKeyTest(CompareInfo compareInfo, string string1, string string2, CompareOptions options, int expectedSign)
401401
{
@@ -444,7 +444,7 @@ unsafe static void RunSpanSortKeyTest(CompareInfo compareInfo, ReadOnlySpan<char
444444
}
445445
}
446446

447-
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsNotHybridGlobalizationOnBrowser))]
447+
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsNotHybridGlobalization))]
448448
public void SortKeyMiscTest()
449449
{
450450
CompareInfo ci = new CultureInfo("en-US").CompareInfo;
@@ -518,7 +518,7 @@ public void IsSortableTest(object sourceObj, bool expected)
518518
Assert.Equal(expected && !char.IsSurrogate(c), CompareInfo.IsSortable(c));
519519
}
520520

521-
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsNotHybridGlobalizationOnBrowser))]
521+
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsNotHybridGlobalization))]
522522
public void VersionTest()
523523
{
524524
SortVersion sv1 = CultureInfo.GetCultureInfo("en-US").CompareInfo.Version;
@@ -529,7 +529,7 @@ public void VersionTest()
529529
Assert.NotEqual(sv1.SortId, sv2.SortId);
530530
}
531531

532-
[ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsNotHybridGlobalizationOnBrowser))]
532+
[ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsNotHybridGlobalization))]
533533
[MemberData(nameof(GetHashCodeTestData))]
534534
public void GetHashCode_Span(string source1, CompareOptions options1, string source2, CompareOptions options2, bool expectSameHashCode)
535535
{
@@ -546,7 +546,7 @@ public void GetHashCode_Span(string source1, CompareOptions options1, string sou
546546
Assert.Equal(expectSameHashCode, hashOfSource1AsSpan == hashOfSource2AsSpan);
547547
}
548548

549-
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsNotHybridGlobalizationOnBrowser))]
549+
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsNotHybridGlobalization))]
550550
public void GetHashCode_NullAndEmptySpan()
551551
{
552552
// Ensure that null spans and non-null empty spans produce the same hash code.

src/libraries/System.Globalization/tests/CompareInfo/CompareInfoTestsBase.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,6 @@ protected static bool IsNotWindowsKanaRegressedVersion() => !PlatformDetection.I
4545
s_invariantCompare.Compare("\u3060", "\uFF80\uFF9E", CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth | CompareOptions.IgnoreCase) == 0;
4646

4747
protected static bool IsNotWindowsKanaRegressedVersionAndNotHybridGlobalizationOnWasm() => !PlatformDetection.IsHybridGlobalizationOnBrowser && IsNotWindowsKanaRegressedVersion();
48+
protected static bool IsNotWindowsKanaRegressedVersionAndNotHybridGlobalization() => IsNotWindowsKanaRegressedVersion() && PlatformDetection.IsNotHybridGlobalization;
4849
}
4950
}

src/libraries/System.Globalization/tests/CultureInfo/CultureInfoAll.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -635,13 +635,11 @@ public static IEnumerable<object[]> CultureInfo_TestData()
635635
yield return new object[] { 0x2009, new [] { "en-jm" }, "en-JM", "eng", "ENJ", "en-JM", "en-JM" };
636636
yield return new object[] { 0x241a, new [] { "sr-latn-rs" }, "sr-Latn-RS", "srp", "SRM", "sr-Latn-RS", "sr-Latn-RS" };
637637
yield return new object[] { 0x2809, new [] { "en-bz" }, "en-BZ", "eng", "ENL", "en-BZ", "en-BZ" };
638-
yield return new object[] { 0x281a, new [] { "sr-cyrl-rs" }, "sr-Cyrl-RS", "srp", "SRO", "sr-Cyrl-RS", "sr-Cyrl-RS" };
639638
yield return new object[] { 0x2c09, new [] { "en-tt" }, "en-TT", "eng", "ENT", "en-TT", "en-TT" };
640639
yield return new object[] { 0x3009, new [] { "en-zw" }, "en-ZW", "eng", "ENW", "en-ZW", "en-ZW" };
641640
yield return new object[] { 0x3409, new [] { "en-ph" }, "en-PH", "eng", "ENP", "en-PH", "en-PH" };
642641
yield return new object[] { 0x4009, new [] { "en-in" }, "en-IN", "eng", "ENN", "en-IN", "en-IN" };
643642
yield return new object[] { 0x4809, new [] { "en-sg" }, "en-SG", "eng", "ENE", "en-SG", "en-SG" };
644-
yield return new object[] { 0x6c1a, new [] { "sr-cyrl" }, "sr-Cyrl-RS", "srp", "SRO", "sr-Cyrl", "sr-Cyrl-RS" };
645643
yield return new object[] { 0x701a, new [] { "sr-latn" }, "sr-Latn-RS", "srp", "SRM", "sr-Latn", "sr-Latn-RS" };
646644
yield return new object[] { 0x7804, new [] { "zh" }, "zh-CN", "zho", "CHS", "zh", "zh-CN" };
647645
yield return new object[] { 0x7c04, new [] { "zh-cht", "zh-hant" }, "zh-HK", "zho", "CHT", "zh-Hant", "zh-HK" };
@@ -654,6 +652,11 @@ public static IEnumerable<object[]> CultureInfo_TestData()
654652
yield return new object[] { 0x40404, new [] { "zh-tw_radstr", "zh-tw" }, "zh-TW", "zho", "CHT", "zh-Hant-TW", "zh-TW" };
655653
yield return new object[] { 0x40411, new [] { "ja-jp_radstr", "ja-jp" }, "ja-JP", "jpn", "JPN", "ja-JP", "ja-JP" };
656654
yield return new object[] { 0x40c04, new [] { "zh-hk_radstr", "zh-hk" }, "zh-HK", "zho", "ZHH", "zh-Hant-HK", "zh-HK" };
655+
if (!PlatformDetection.IsHybridGlobalizationOnOSX)
656+
{
657+
yield return new object[] { 0x281a, new [] { "sr-cyrl-rs" }, "sr-Cyrl-RS", "srp", "SRO", "sr-Cyrl-RS", "sr-Cyrl-RS" };
658+
yield return new object[] { 0x6c1a, new [] { "sr-cyrl" }, "sr-Cyrl-RS", "srp", "SRO", "sr-Cyrl", "sr-Cyrl-RS" };
659+
}
657660
}
658661

659662
[Theory]

0 commit comments

Comments
 (0)