@@ -92,39 +92,34 @@ mod tests {
9292 use super :: * ;
9393
9494 #[ test]
95- fn test_encoding_str_conversion ( ) {
96- // Test FromStr trait
97- assert_eq ! ( "utf-8" . parse( ) , Ok ( PositionEncoding :: Utf8 ) ) ;
98- assert_eq ! ( "utf-16" . parse( ) , Ok ( PositionEncoding :: Utf16 ) ) ;
99- assert_eq ! ( "utf-32" . parse( ) , Ok ( PositionEncoding :: Utf32 ) ) ;
100- assert ! ( "invalid" . parse:: <PositionEncoding >( ) . is_err( ) ) ;
101-
102- // Test ToString trait
103- assert_eq ! ( PositionEncoding :: Utf8 . to_string( ) , "utf-8" ) ;
104- assert_eq ! ( PositionEncoding :: Utf16 . to_string( ) , "utf-16" ) ;
105- assert_eq ! ( PositionEncoding :: Utf32 . to_string( ) , "utf-32" ) ;
106- }
107-
108- #[ test]
109- fn test_from_lsp_kind ( ) {
95+ fn test_string_parsing_and_display ( ) {
96+ // Valid encodings parse correctly
11097 assert_eq ! (
111- PositionEncoding :: try_from ( PositionEncodingKind :: new ( "utf-8" ) ) ,
98+ "utf-8" . parse :: < PositionEncoding > ( ) ,
11299 Ok ( PositionEncoding :: Utf8 )
113100 ) ;
114101 assert_eq ! (
115- PositionEncoding :: try_from ( PositionEncodingKind :: new ( "utf-16" ) ) ,
102+ "utf-16" . parse :: < PositionEncoding > ( ) ,
116103 Ok ( PositionEncoding :: Utf16 )
117104 ) ;
118105 assert_eq ! (
119- PositionEncoding :: try_from ( PositionEncodingKind :: new ( "utf-32" ) ) ,
106+ "utf-32" . parse :: < PositionEncoding > ( ) ,
120107 Ok ( PositionEncoding :: Utf32 )
121108 ) ;
122- assert ! ( PositionEncoding :: try_from( PositionEncodingKind :: new( "unknown" ) ) . is_err( ) ) ;
109+
110+ // Invalid encoding returns error
111+ assert ! ( "invalid" . parse:: <PositionEncoding >( ) . is_err( ) ) ;
112+ assert ! ( "UTF-8" . parse:: <PositionEncoding >( ) . is_err( ) ) ; // case sensitive
113+
114+ // Display produces correct strings
115+ assert_eq ! ( PositionEncoding :: Utf8 . to_string( ) , "utf-8" ) ;
116+ assert_eq ! ( PositionEncoding :: Utf16 . to_string( ) , "utf-16" ) ;
117+ assert_eq ! ( PositionEncoding :: Utf32 . to_string( ) , "utf-32" ) ;
123118 }
124119
125120 #[ test]
126- fn test_trait_conversions ( ) {
127- // Test TryFrom<PositionEncodingKind> for PositionEncoding
121+ fn test_lsp_type_conversions ( ) {
122+ // TryFrom<PositionEncodingKind> for valid encodings
128123 assert_eq ! (
129124 PositionEncoding :: try_from( PositionEncodingKind :: new( "utf-8" ) ) ,
130125 Ok ( PositionEncoding :: Utf8 )
@@ -137,9 +132,11 @@ mod tests {
137132 PositionEncoding :: try_from( PositionEncodingKind :: new( "utf-32" ) ) ,
138133 Ok ( PositionEncoding :: Utf32 )
139134 ) ;
135+
136+ // Invalid encoding returns error
140137 assert ! ( PositionEncoding :: try_from( PositionEncodingKind :: new( "unknown" ) ) . is_err( ) ) ;
141138
142- // Test From<PositionEncoding> for PositionEncodingKind
139+ // From<PositionEncoding> produces correct LSP types
143140 assert_eq ! (
144141 PositionEncodingKind :: from( PositionEncoding :: Utf8 ) . as_str( ) ,
145142 "utf-8"
@@ -155,7 +152,7 @@ mod tests {
155152 }
156153
157154 #[ test]
158- fn test_negotiate_prefers_utf8 ( ) {
155+ fn test_negotiate_prefers_utf8_when_all_available ( ) {
159156 let params = InitializeParams {
160157 capabilities : ClientCapabilities {
161158 general : Some ( GeneralClientCapabilities {
@@ -175,7 +172,67 @@ mod tests {
175172 }
176173
177174 #[ test]
178- fn test_negotiate_fallback_utf16 ( ) {
175+ fn test_negotiate_prefers_utf32_over_utf16 ( ) {
176+ let params = InitializeParams {
177+ capabilities : ClientCapabilities {
178+ general : Some ( GeneralClientCapabilities {
179+ position_encodings : Some ( vec ! [
180+ PositionEncodingKind :: new( "utf-16" ) ,
181+ PositionEncodingKind :: new( "utf-32" ) ,
182+ ] ) ,
183+ ..Default :: default ( )
184+ } ) ,
185+ ..Default :: default ( )
186+ } ,
187+ ..Default :: default ( )
188+ } ;
189+
190+ assert_eq ! (
191+ PositionEncoding :: negotiate( & params) ,
192+ PositionEncoding :: Utf32
193+ ) ;
194+ }
195+
196+ #[ test]
197+ fn test_negotiate_accepts_utf16_when_only_option ( ) {
198+ let params = InitializeParams {
199+ capabilities : ClientCapabilities {
200+ general : Some ( GeneralClientCapabilities {
201+ position_encodings : Some ( vec ! [ PositionEncodingKind :: new( "utf-16" ) ] ) ,
202+ ..Default :: default ( )
203+ } ) ,
204+ ..Default :: default ( )
205+ } ,
206+ ..Default :: default ( )
207+ } ;
208+
209+ assert_eq ! (
210+ PositionEncoding :: negotiate( & params) ,
211+ PositionEncoding :: Utf16
212+ ) ;
213+ }
214+
215+ #[ test]
216+ fn test_negotiate_fallback_with_empty_encodings ( ) {
217+ let params = InitializeParams {
218+ capabilities : ClientCapabilities {
219+ general : Some ( GeneralClientCapabilities {
220+ position_encodings : Some ( vec ! [ ] ) ,
221+ ..Default :: default ( )
222+ } ) ,
223+ ..Default :: default ( )
224+ } ,
225+ ..Default :: default ( )
226+ } ;
227+
228+ assert_eq ! (
229+ PositionEncoding :: negotiate( & params) ,
230+ PositionEncoding :: Utf16
231+ ) ;
232+ }
233+
234+ #[ test]
235+ fn test_negotiate_fallback_with_no_capabilities ( ) {
179236 let params = InitializeParams :: default ( ) ;
180237 assert_eq ! (
181238 PositionEncoding :: negotiate( & params) ,
@@ -184,13 +241,13 @@ mod tests {
184241 }
185242
186243 #[ test]
187- fn test_negotiate_prefers_utf32_over_utf16 ( ) {
244+ fn test_negotiate_fallback_with_unknown_encodings ( ) {
188245 let params = InitializeParams {
189246 capabilities : ClientCapabilities {
190247 general : Some ( GeneralClientCapabilities {
191248 position_encodings : Some ( vec ! [
192- PositionEncodingKind :: new( "utf-16 " ) ,
193- PositionEncodingKind :: new( "utf-32 " ) ,
249+ PositionEncodingKind :: new( "utf-7 " ) ,
250+ PositionEncodingKind :: new( "ascii " ) ,
194251 ] ) ,
195252 ..Default :: default ( )
196253 } ) ,
@@ -201,7 +258,12 @@ mod tests {
201258
202259 assert_eq ! (
203260 PositionEncoding :: negotiate( & params) ,
204- PositionEncoding :: Utf32
261+ PositionEncoding :: Utf16
205262 ) ;
206263 }
264+
265+ #[ test]
266+ fn test_default_is_utf16 ( ) {
267+ assert_eq ! ( PositionEncoding :: default ( ) , PositionEncoding :: Utf16 ) ;
268+ }
207269}
0 commit comments