@@ -274,9 +274,9 @@ public static IEnumerable<object[]> ToLower_TestData()
274274 // we also don't preform.
275275 // Greek Capital Letter Sigma (does not case to U+03C2 with "final sigma" rule).
276276 yield return new object [ ] { cultureName , "\u03A3 " , "\u03C3 " } ;
277- if ( PlatformDetection . IsHybridGlobalizationOnBrowser )
277+ if ( PlatformDetection . IsHybridGlobalizationOnBrowser || PlatformDetection . IsHybridGlobalizationOnOSX )
278278 {
279- // JS is using "final sigma" rule correctly - it's costly to unify it with ICU's behavior
279+ // JS and Apple platforms are using "final sigma" rule correctly - it's costly to unify it with ICU's behavior
280280 yield return new object [ ] { cultureName , "O\u03A3 " , "o\u03C2 " } ;
281281 }
282282 else
@@ -396,23 +396,29 @@ public static IEnumerable<object[]> ToUpper_TestData()
396396 // RAINBOW (outside the BMP and does not case)
397397 yield return new object [ ] { cultureName , "\U0001F308 " , "\U0001F308 " } ;
398398
399- // Unicode defines some codepoints which expand into multiple codepoints
400- // when cased (see SpecialCasing.txt from UNIDATA for some examples). We have never done
401- // these sorts of expansions, since it would cause string lengths to change when cased,
402- // which is non-intuitive. In addition, there are some context sensitive mappings which
403- // we also don't preform.
404- // es-zed does not case to SS when uppercased.
405- yield return new object [ ] { cultureName , "\u00DF " , "\u00DF " } ;
406- yield return new object [ ] { cultureName , "stra\u00DF e" , "STRA\u00DF E" } ;
407- if ( ! PlatformDetection . IsNlsGlobalization )
408- yield return new object [ ] { cultureName , "st\uD801 \uDC37 ra\u00DF e" , "ST\uD801 \uDC0F RA\u00DF E" } ;
409-
410- // Ligatures do not expand when cased.
411- yield return new object [ ] { cultureName , "\uFB00 " , "\uFB00 " } ;
412-
413- // Precomposed character with no uppercase variant, we don't want to "decompose" this
414- // as part of casing.
415- yield return new object [ ] { cultureName , "\u0149 " , "\u0149 " } ;
399+ if ( ! PlatformDetection . IsHybridGlobalizationOnOSX )
400+ {
401+ // Unicode defines some codepoints which expand into multiple codepoints
402+ // when cased (see SpecialCasing.txt from UNIDATA for some examples). We have never done
403+ // these sorts of expansions, since it would cause string lengths to change when cased,
404+ // which is non-intuitive. In addition, there are some context sensitive mappings which
405+ // we also don't preform.
406+ // es-zed does not case to SS when uppercased.
407+ // on OSX, capitalizing the German letter ß (sharp S) gives SS
408+ yield return new object [ ] { cultureName , "\u00DF " , "\u00DF " } ;
409+ yield return new object [ ] { cultureName , "stra\u00DF e" , "STRA\u00DF E" } ;
410+ if ( ! PlatformDetection . IsNlsGlobalization )
411+ yield return new object [ ] { cultureName , "st\uD801 \uDC37 ra\u00DF e" , "ST\uD801 \uDC0F RA\u00DF E" } ;
412+
413+ // Ligatures do not expand when cased.
414+ // on OSX, this is uppercase to "FF"
415+ yield return new object [ ] { cultureName , "\uFB00 " , "\uFB00 " } ;
416+
417+ // Precomposed character with no uppercase variant, we don't want to "decompose" this
418+ // as part of casing.
419+ // on OSX, this is uppercased to "ʼN"
420+ yield return new object [ ] { cultureName , "\u0149 " , "\u0149 " } ;
421+ }
416422 }
417423
418424 // Turkish i
0 commit comments