44using System . Threading . Tasks ;
55using FluentAssertions ;
66using NSubstitute ;
7+ using NSubstitute . Callbacks ;
78using OmniSharp . Extensions . JsonRpc . Testing ;
89using OmniSharp . Extensions . LanguageProtocol . Testing ;
910using OmniSharp . Extensions . LanguageServer . Client ;
1011using OmniSharp . Extensions . LanguageServer . Protocol ;
12+ using OmniSharp . Extensions . LanguageServer . Protocol . Client . Capabilities ;
1113using OmniSharp . Extensions . LanguageServer . Protocol . Document ;
1214using OmniSharp . Extensions . LanguageServer . Protocol . Models ;
1315using OmniSharp . Extensions . LanguageServer . Server ;
@@ -20,19 +22,19 @@ namespace Lsp.Tests.Integration
2022{
2123 public class RenameTests : LanguageProtocolTestBase
2224 {
23- private readonly Func < PrepareRenameParams , CancellationToken , Task < RangeOrPlaceholderRange ? > > _prepareRename ;
24- private readonly Func < RenameParams , CancellationToken , Task < WorkspaceEdit ? > > _rename ;
25+ private readonly Func < PrepareRenameParams , RenameCapability , CancellationToken , Task < RangeOrPlaceholderRange ? > > _prepareRename ;
26+ private readonly Func < RenameParams , RenameCapability , CancellationToken , Task < WorkspaceEdit ? > > _rename ;
2527
2628 public RenameTests ( ITestOutputHelper outputHelper ) : base ( new JsonRpcTestOptions ( ) . ConfigureForXUnit ( outputHelper , LogEventLevel . Verbose ) )
2729 {
28- _prepareRename = Substitute . For < Func < PrepareRenameParams , CancellationToken , Task < RangeOrPlaceholderRange ? > > > ( ) ;
29- _rename = Substitute . For < Func < RenameParams , CancellationToken , Task < WorkspaceEdit ? > > > ( ) ;
30+ _prepareRename = Substitute . For < Func < PrepareRenameParams , RenameCapability , CancellationToken , Task < RangeOrPlaceholderRange ? > > > ( ) ;
31+ _rename = Substitute . For < Func < RenameParams , RenameCapability , CancellationToken , Task < WorkspaceEdit ? > > > ( ) ;
3032 }
3133
3234 [ Fact ]
3335 public async Task Should_Handle_Rename_With_No_Value ( )
3436 {
35- _prepareRename . Invoke ( Arg . Any < PrepareRenameParams > ( ) , Arg . Any < CancellationToken > ( ) )
37+ _prepareRename . Invoke ( Arg . Any < PrepareRenameParams > ( ) , Arg . Any < RenameCapability > ( ) , Arg . Any < CancellationToken > ( ) )
3638 . Returns (
3739 call => {
3840 var pos = call . Arg < PrepareRenameParams > ( ) . Position ;
@@ -45,7 +47,7 @@ public async Task Should_Handle_Rename_With_No_Value()
4547 }
4648 ) ;
4749
48- _rename . Invoke ( Arg . Any < RenameParams > ( ) , Arg . Any < CancellationToken > ( ) )
50+ _rename . Invoke ( Arg . Any < RenameParams > ( ) , Arg . Any < RenameCapability > ( ) , Arg . Any < CancellationToken > ( ) )
4951 . Returns (
5052 new WorkspaceEdit ( ) {
5153 DocumentChanges = new Container < WorkspaceEditDocumentChange > ( new WorkspaceEditDocumentChange ( new CreateFile ( ) {
@@ -76,12 +78,19 @@ public async Task Should_Handle_Rename_With_No_Value()
7678
7779 renameResponse ! . DocumentChanges . Should ( ) . HaveCount ( 1 ) ;
7880 renameResponse . DocumentChanges . Should ( ) . Match ( z => z . Any ( x => x . IsCreateFile ) ) ;
81+
82+ // Ensure capability was provided to both sides as needed
83+ _prepareRename . Received ( 1 ) . Invoke ( Arg . Any < PrepareRenameParams > ( ) , Arg . Is < RenameCapability > ( z => z . PrepareSupport ) , Arg . Any < CancellationToken > ( ) ) ;
84+ _rename . Received ( 1 ) . Invoke ( Arg . Any < RenameParams > ( ) , Arg . Is < RenameCapability > ( z => z . PrepareSupport ) , Arg . Any < CancellationToken > ( ) ) ;
85+ var capability1 = _prepareRename . ReceivedCalls ( ) . Select ( z => z . GetArguments ( ) [ 1 ] as RenameCapability ) . FirstOrDefault ( ) ;
86+ var capability2 = _rename . ReceivedCalls ( ) . Select ( z => z . GetArguments ( ) [ 1 ] as RenameCapability ) . FirstOrDefault ( ) ;
87+ capability1 . Should ( ) . BeSameAs ( capability2 ) ;
7988 }
8089
8190 [ Fact ]
8291 public async Task Should_Handle_Prepare_Rename_With_No_Value ( )
8392 {
84- _prepareRename . Invoke ( Arg . Any < PrepareRenameParams > ( ) , Arg . Any < CancellationToken > ( ) )
93+ _prepareRename . Invoke ( Arg . Any < PrepareRenameParams > ( ) , Arg . Any < RenameCapability > ( ) , Arg . Any < CancellationToken > ( ) )
8594 . Returns ( Task . FromResult < RangeOrPlaceholderRange ? > ( null ) ! ) ;
8695 var ( client , _) = await Initialize ( ClientOptionsAction , ServerOptionsAction ) ;
8796
@@ -99,7 +108,7 @@ public async Task Should_Handle_Prepare_Rename_With_No_Value()
99108 [ Fact ]
100109 public async Task Should_Handle_Prepare_Rename_With_Range ( )
101110 {
102- _prepareRename . Invoke ( Arg . Any < PrepareRenameParams > ( ) , Arg . Any < CancellationToken > ( ) )
111+ _prepareRename . Invoke ( Arg . Any < PrepareRenameParams > ( ) , Arg . Any < RenameCapability > ( ) , Arg . Any < CancellationToken > ( ) )
103112 . Returns (
104113 call => {
105114 var pos = call . Arg < PrepareRenameParams > ( ) . Position ;
@@ -128,7 +137,7 @@ public async Task Should_Handle_Prepare_Rename_With_Range()
128137 [ Fact ]
129138 public async Task Should_Handle_Prepare_Rename_With_PlaceholderRange ( )
130139 {
131- _prepareRename . Invoke ( Arg . Any < PrepareRenameParams > ( ) , Arg . Any < CancellationToken > ( ) )
140+ _prepareRename . Invoke ( Arg . Any < PrepareRenameParams > ( ) , Arg . Any < RenameCapability > ( ) , Arg . Any < CancellationToken > ( ) )
132141 . Returns (
133142 call => {
134143 var pos = call . Arg < PrepareRenameParams > ( ) . Position ;
@@ -161,7 +170,7 @@ public async Task Should_Handle_Prepare_Rename_With_PlaceholderRange()
161170 [ Fact ]
162171 public async Task Should_Handle_Prepare_Rename_With_DefaultBehavior ( )
163172 {
164- _prepareRename . Invoke ( Arg . Any < PrepareRenameParams > ( ) , Arg . Any < CancellationToken > ( ) )
173+ _prepareRename . Invoke ( Arg . Any < PrepareRenameParams > ( ) , Arg . Any < RenameCapability > ( ) , Arg . Any < CancellationToken > ( ) )
165174 . Returns (
166175 call => new RangeOrPlaceholderRange (
167176 new RenameDefaultBehavior ( ) {
@@ -193,13 +202,19 @@ private void ServerOptionsAction(LanguageServerOptions obj)
193202 obj . OnRename (
194203 _rename , new RenameRegistrationOptions ( ) {
195204 DocumentSelector = DocumentSelector . ForLanguage ( "csharp" ) ,
196- PrepareProvider = true
205+ PrepareProvider = true ,
197206 }
198207 ) ;
199208 }
200209
201210 private void ClientOptionsAction ( LanguageClientOptions obj )
202211 {
212+ obj . WithCapability (
213+ new RenameCapability ( ) {
214+ PrepareSupport = true ,
215+ PrepareSupportDefaultBehavior = true
216+ }
217+ ) ;
203218 }
204219 }
205220}
0 commit comments