@@ -581,3 +581,62 @@ fn test_parse_error_on_malformed_input() {
581581
582582 assert ! ( failure. error. code == jsonrpc_core:: ErrorCode :: ParseError ) ;
583583}
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