@@ -14,14 +14,21 @@ open FSharp.Data.GraphQL.Server.Middleware
1414
1515[<Fact>]
1616let ``comparerToStringComparison maps well - known StringComparer instances`` () =
17+ let currentCultureIsInvariant =
18+ obj.ReferenceEquals ( StringComparer.CurrentCulture, StringComparer.InvariantCulture)
19+
1720 let testCases =
1821 [
1922 ( StringComparer.OrdinalIgnoreCase :> IComparer, StringComparison.OrdinalIgnoreCase)
2023 ( StringComparer.InvariantCultureIgnoreCase :> IComparer, StringComparison.InvariantCultureIgnoreCase)
21- ( StringComparer.CurrentCultureIgnoreCase :> IComparer, StringComparison.CurrentCultureIgnoreCase)
2224 ( StringComparer.Ordinal :> IComparer, StringComparison.Ordinal)
2325 ( StringComparer.InvariantCulture :> IComparer, StringComparison.InvariantCulture)
24- ( StringComparer.CurrentCulture :> IComparer, StringComparison.CurrentCulture)
26+ // On environments where CurrentCulture == InvariantCulture (e.g. Ubuntu CI with no locale),
27+ // StringComparer.Current* singletons ARE the same objects as StringComparer.Invariant*,
28+ // so they can only map to Invariant* values. Skip those cases in such environments.
29+ if not currentCultureIsInvariant then
30+ yield ( StringComparer.CurrentCultureIgnoreCase :> IComparer, StringComparison.CurrentCultureIgnoreCase)
31+ yield ( StringComparer.CurrentCulture :> IComparer, StringComparison.CurrentCulture)
2532 ]
2633
2734 for comparer, expected in testCases do
@@ -34,14 +41,21 @@ let ``comparerToStringComparison maps well-known StringComparer instances`` () =
3441
3542[<Fact>]
3643let ``comparerToStringComparison singleton mappings are all distinct`` () =
44+ let currentCultureIsInvariant =
45+ obj.ReferenceEquals ( StringComparer.CurrentCulture, StringComparer.InvariantCulture)
46+
47+ // On environments where CurrentCulture == InvariantCulture, Current* singletons are
48+ // the same objects as Invariant* ones, so distinctness can only be checked for the
49+ // remaining four singletons.
3750 let singletons : IComparer list =
3851 [
3952 StringComparer.OrdinalIgnoreCase
4053 StringComparer.InvariantCultureIgnoreCase
41- StringComparer.CurrentCultureIgnoreCase
4254 StringComparer.Ordinal
4355 StringComparer.InvariantCulture
44- StringComparer.CurrentCulture
56+ if not currentCultureIsInvariant then
57+ yield StringComparer.CurrentCultureIgnoreCase
58+ yield StringComparer.CurrentCulture
4559 ]
4660
4761 let results =
@@ -75,17 +89,30 @@ let ``comparerToStringComparison maps non-singleton InvariantCultureIgnoreCase c
7589
7690[<Fact>]
7791let ``comparerToStringComparison maps non - singleton CurrentCulture comparer`` () =
92+ // When CurrentCulture == InvariantCulture (e.g. Ubuntu CI), a non-singleton comparer
93+ // created from CurrentCulture is indistinguishable from InvariantCulture and will
94+ // legitimately map to InvariantCulture.
7895 let comparer = StringComparer.Create ( CultureInfo.CurrentCulture, false ) :> IComparer
7996 Assert.False ( obj.ReferenceEquals ( comparer, StringComparer.CurrentCulture :> obj))
8097 let result = ObjectListFilter.comparerToStringComparison comparer |> wantValueSome
81- result |> equals StringComparison.CurrentCulture
98+ let currentCultureIsInvariant =
99+ CultureInfo.CurrentCulture.CompareInfo.Equals CultureInfo.InvariantCulture.CompareInfo
100+ let expected =
101+ if currentCultureIsInvariant then StringComparison.InvariantCulture
102+ else StringComparison.CurrentCulture
103+ result |> equals expected
82104
83105[<Fact>]
84106let ``comparerToStringComparison maps non - singleton CurrentCultureIgnoreCase comparer`` () =
85107 let comparer = StringComparer.Create ( CultureInfo.CurrentCulture, true ) :> IComparer
86108 Assert.False ( obj.ReferenceEquals ( comparer, StringComparer.CurrentCultureIgnoreCase :> obj))
87109 let result = ObjectListFilter.comparerToStringComparison comparer |> wantValueSome
88- result |> equals StringComparison.CurrentCultureIgnoreCase
110+ let currentCultureIsInvariant =
111+ CultureInfo.CurrentCulture.CompareInfo.Equals CultureInfo.InvariantCulture.CompareInfo
112+ let expected =
113+ if currentCultureIsInvariant then StringComparison.InvariantCultureIgnoreCase
114+ else StringComparison.CurrentCultureIgnoreCase
115+ result |> equals expected
89116
90117// ─────────────────────────────────────────────────────────────────────────────
91118// Unknown / unsupported cases → ValueNone
@@ -122,14 +149,18 @@ let ``comparerToStringComparison returns ValueNone for non-standard culture comp
122149
123150[<Fact>]
124151let ``comparerToStringComparison is deterministic for singletons`` () =
152+ let currentCultureIsInvariant =
153+ obj.ReferenceEquals ( StringComparer.CurrentCulture, StringComparer.InvariantCulture)
154+
125155 let singletons : IComparer list =
126156 [
127157 StringComparer.OrdinalIgnoreCase
128158 StringComparer.InvariantCultureIgnoreCase
129- StringComparer.CurrentCultureIgnoreCase
130159 StringComparer.Ordinal
131160 StringComparer.InvariantCulture
132- StringComparer.CurrentCulture
161+ if not currentCultureIsInvariant then
162+ yield StringComparer.CurrentCultureIgnoreCase
163+ yield StringComparer.CurrentCulture
133164 ]
134165
135166 for comparer in singletons do
0 commit comments