@@ -581,3 +581,62 @@ fn test_parse_error_on_malformed_input() {
581
581
582
582
assert ! ( failure. error. code == jsonrpc_core:: ErrorCode :: ParseError ) ;
583
583
}
584
+
585
+ #[ test]
586
+ fn test_find_impls ( ) {
587
+ let ( mut cache, _tc) = init_env ( "find_impls" ) ;
588
+
589
+ let source_file_path = Path :: new ( "src" ) . join ( "main.rs" ) ;
590
+
591
+ let root_path = cache. abs_path ( Path :: new ( "." ) ) ;
592
+ let url = Url :: from_file_path ( cache. abs_path ( & source_file_path) )
593
+ . expect ( "couldn't convert file path to URL" ) ;
594
+
595
+ let messages = vec ! [
596
+ ServerMessage :: initialize( 0 , root_path. as_os_str( ) . to_str( ) . map( |x| x. to_owned( ) ) ) ,
597
+ ServerMessage :: request( 1 , Method :: FindImpls ( TextDocumentPositionParams {
598
+ text_document: TextDocumentIdentifier :: new( url. clone( ) ) ,
599
+ position: cache. mk_ls_position( src( & source_file_path, 13 , "Bar" ) )
600
+ } ) ) ,
601
+ ServerMessage :: request( 2 , Method :: FindImpls ( TextDocumentPositionParams {
602
+ text_document: TextDocumentIdentifier :: new( url. clone( ) ) ,
603
+ position: cache. mk_ls_position( src( & source_file_path, 16 , "Super" ) )
604
+ } ) ) ,
605
+ ServerMessage :: request( 3 , Method :: FindImpls ( TextDocumentPositionParams {
606
+ text_document: TextDocumentIdentifier :: new( url) ,
607
+ position: cache. mk_ls_position( src( & source_file_path, 20 , "Eq" ) )
608
+ } ) ) ,
609
+ ] ;
610
+
611
+ let ( mut server, results) = mock_server ( messages) ;
612
+ // Initialise and build.
613
+ assert_eq ! ( ls_server:: LsService :: handle_message( & mut server) ,
614
+ ls_server:: ServerStateChange :: Continue ) ;
615
+ expect_messages ( results. clone ( ) ,
616
+ & [ ExpectedMessage :: new ( Some ( 0 ) ) . expect_contains ( "capabilities" ) ,
617
+ ExpectedMessage :: new ( None ) . expect_contains ( "diagnosticsBegin" ) ,
618
+ ExpectedMessage :: new ( None ) . expect_contains ( "diagnosticsEnd" ) ] ) ;
619
+
620
+ assert_eq ! ( ls_server:: LsService :: handle_message( & mut server) ,
621
+ ls_server:: ServerStateChange :: Continue ) ;
622
+ // TODO structural checking of result, rather than looking for a string - src(&source_file_path, 12, "world")
623
+ expect_messages ( results. clone ( ) , & [
624
+ ExpectedMessage :: new ( Some ( 1 ) )
625
+ . expect_contains ( r#""range":{"start":{"line":18,"character":15},"end":{"line":18,"character":18}}"# )
626
+ . expect_contains ( r#""range":{"start":{"line":19,"character":12},"end":{"line":19,"character":15}}"# )
627
+ ] ) ;
628
+ assert_eq ! ( ls_server:: LsService :: handle_message( & mut server) ,
629
+ ls_server:: ServerStateChange :: Continue ) ;
630
+ expect_messages ( results. clone ( ) , & [
631
+ ExpectedMessage :: new ( Some ( 2 ) )
632
+ . expect_contains ( r#""range":{"start":{"line":18,"character":15},"end":{"line":18,"character":18}}"# )
633
+ . expect_contains ( r#""range":{"start":{"line":22,"character":15},"end":{"line":22,"character":18}}"# )
634
+ ] ) ;
635
+ assert_eq ! ( ls_server:: LsService :: handle_message( & mut server) ,
636
+ ls_server:: ServerStateChange :: Continue ) ;
637
+ expect_messages ( results. clone ( ) , & [
638
+ // TODO assert that only one position is returned
639
+ ExpectedMessage :: new ( Some ( 3 ) )
640
+ . expect_contains ( r#""range":{"start":{"line":19,"character":12},"end":{"line":19,"character":15}}"# )
641
+ ] ) ;
642
+ }
0 commit comments