@@ -126,6 +126,9 @@ impl Connection {
126
126
self . sender . send ( resp. into ( ) ) . unwrap ( ) ;
127
127
continue ;
128
128
}
129
+ Ok ( Message :: Notification ( n) ) if !n. is_exit ( ) => {
130
+ continue ;
131
+ }
129
132
Ok ( msg) => Err ( ProtocolError ( format ! ( "expected initialize request, got {msg:?}" ) ) ) ,
130
133
Err ( e) => {
131
134
Err ( ProtocolError ( format ! ( "expected initialize request, got error: {e}" ) ) )
@@ -212,3 +215,70 @@ impl Connection {
212
215
Ok ( true )
213
216
}
214
217
}
218
+
219
+ #[ cfg( test) ]
220
+ mod tests {
221
+ use crossbeam_channel:: unbounded;
222
+ use lsp_types:: notification:: { Exit , Initialized , Notification } ;
223
+ use lsp_types:: request:: { Initialize , Request } ;
224
+ use lsp_types:: { InitializeParams , InitializedParams } ;
225
+ use serde_json:: to_value;
226
+
227
+ use crate :: { Connection , Message , ProtocolError , RequestId } ;
228
+
229
+ struct TestCase {
230
+ test_messages : Vec < Message > ,
231
+ expected_resp : Result < ( RequestId , serde_json:: Value ) , ProtocolError > ,
232
+ }
233
+
234
+ fn initialize_start_test ( test_case : TestCase ) {
235
+ let ( reader_sender, reader_receiver) = unbounded :: < Message > ( ) ;
236
+ let ( writer_sender, writer_receiver) = unbounded :: < Message > ( ) ;
237
+ let conn = Connection { sender : writer_sender, receiver : reader_receiver } ;
238
+
239
+ for msg in test_case. test_messages {
240
+ assert ! ( reader_sender. send( msg) . is_ok( ) ) ;
241
+ }
242
+
243
+ let resp = conn. initialize_start ( ) ;
244
+ assert_eq ! ( test_case. expected_resp, resp) ;
245
+
246
+ assert ! ( writer_receiver. recv_timeout( std:: time:: Duration :: from_secs( 1 ) ) . is_err( ) ) ;
247
+ }
248
+
249
+ #[ test]
250
+ fn not_exit_notification ( ) {
251
+ let notification = crate :: Notification {
252
+ method : Initialized :: METHOD . to_string ( ) ,
253
+ params : to_value ( InitializedParams { } ) . unwrap ( ) ,
254
+ } ;
255
+
256
+ let params_as_value = to_value ( InitializeParams :: default ( ) ) . unwrap ( ) ;
257
+ let req_id = RequestId :: from ( 234 ) ;
258
+ let request = crate :: Request {
259
+ id : req_id. clone ( ) ,
260
+ method : Initialize :: METHOD . to_string ( ) ,
261
+ params : params_as_value. clone ( ) ,
262
+ } ;
263
+
264
+ initialize_start_test ( TestCase {
265
+ test_messages : vec ! [ notification. into( ) , request. into( ) ] ,
266
+ expected_resp : Ok ( ( req_id, params_as_value) ) ,
267
+ } ) ;
268
+ }
269
+
270
+ #[ test]
271
+ fn exit_notification ( ) {
272
+ let notification =
273
+ crate :: Notification { method : Exit :: METHOD . to_string ( ) , params : to_value ( ( ) ) . unwrap ( ) } ;
274
+ let notification_msg = Message :: from ( notification) ;
275
+
276
+ initialize_start_test ( TestCase {
277
+ test_messages : vec ! [ notification_msg. clone( ) ] ,
278
+ expected_resp : Err ( ProtocolError ( format ! (
279
+ "expected initialize request, got {:?}" ,
280
+ notification_msg
281
+ ) ) ) ,
282
+ } ) ;
283
+ }
284
+ }
0 commit comments