3
3
using System . Linq ;
4
4
using System . Reactive . Linq ;
5
5
using System . Reactive . Threading . Tasks ;
6
+ using System . Threading ;
6
7
using System . Threading . Tasks ;
7
8
using FluentAssertions ;
8
9
using NSubstitute ;
11
12
using OmniSharp . Extensions . LanguageServer . Client ;
12
13
using OmniSharp . Extensions . LanguageServer . Protocol ;
13
14
using OmniSharp . Extensions . LanguageServer . Protocol . Client . Capabilities ;
15
+ using OmniSharp . Extensions . LanguageServer . Protocol . Models ;
16
+ using OmniSharp . Extensions . LanguageServer . Protocol . Server ;
17
+ using OmniSharp . Extensions . LanguageServer . Protocol . Workspace ;
14
18
using OmniSharp . Extensions . LanguageServer . Server ;
15
19
using Serilog . Events ;
16
20
using Xunit ;
@@ -21,10 +25,7 @@ namespace Lsp.Tests.Integration
21
25
public class WorkspaceFolderTests : LanguageProtocolTestBase
22
26
{
23
27
public WorkspaceFolderTests ( ITestOutputHelper outputHelper ) : base (
24
- new JsonRpcTestOptions ( )
25
- . ConfigureForXUnit ( outputHelper , LogEventLevel . Verbose )
26
- . WithWaitTime ( TimeSpan . FromSeconds ( 1 ) )
27
- . WithTimeout ( TimeSpan . FromSeconds ( 2 ) )
28
+ new JsonRpcTestOptions ( ) . ConfigureForXUnit ( outputHelper , LogEventLevel . Verbose )
28
29
)
29
30
{
30
31
}
@@ -60,7 +61,7 @@ public async Task Should_Add_A_Workspace_Folder()
60
61
61
62
client . WorkspaceFoldersManager . Add ( "/abcd/" , nameof ( Should_Add_A_Workspace_Folder ) ) ;
62
63
63
- SettleNext ( ) ;
64
+ await SettleNext ( ) ;
64
65
65
66
folders . Should ( ) . HaveCount ( 1 ) ;
66
67
folders [ 0 ] . Event . Should ( ) . Be ( WorkspaceFolderEvent . Add ) ;
@@ -89,7 +90,7 @@ public async Task Should_Remove_Workspace_Folder_by_name()
89
90
90
91
client . WorkspaceFoldersManager . Remove ( nameof ( Should_Remove_Workspace_Folder_by_name ) ) ;
91
92
92
- SettleNext ( ) ;
93
+ await SettleNext ( ) ;
93
94
94
95
folders . Should ( ) . HaveCount ( 1 ) ;
95
96
folders [ 0 ] . Event . Should ( ) . Be ( WorkspaceFolderEvent . Remove ) ;
@@ -109,13 +110,58 @@ public async Task Should_Remove_Workspace_Folder_by_uri()
109
110
110
111
client . WorkspaceFoldersManager . Remove ( DocumentUri . From ( "/abcd/" ) ) ;
111
112
112
- SettleNext ( ) ;
113
+ await SettleNext ( ) ;
113
114
114
115
folders . Should ( ) . HaveCount ( 1 ) ;
115
116
folders [ 0 ] . Event . Should ( ) . Be ( WorkspaceFolderEvent . Remove ) ;
116
117
folders [ 0 ] . Folder . Name . Should ( ) . Be ( nameof ( Should_Remove_Workspace_Folder_by_uri ) ) ;
117
118
}
118
119
120
+ [ Fact ]
121
+ public async Task Should_Handle_Null_Workspace_Folders ( )
122
+ {
123
+ var workspaceLanguageServer = Substitute . For < IWorkspaceLanguageServer > ( ) ;
124
+ var languageServer = Substitute . For < ILanguageServer > ( ) ;
125
+ languageServer . ClientSettings . Returns (
126
+ new InitializeParams ( ) {
127
+ Capabilities = new ClientCapabilities ( ) {
128
+ Workspace = new WorkspaceClientCapabilities ( ) {
129
+ WorkspaceFolders = true
130
+ }
131
+ } ,
132
+ WorkspaceFolders = null
133
+ }
134
+ ) ;
135
+ var workspaceFolders = new LanguageServerWorkspaceFolderManager ( workspaceLanguageServer ) ;
136
+ var started = ( IOnLanguageServerStarted ) workspaceFolders ;
137
+ await started . OnStarted ( languageServer , CancellationToken ) ;
138
+ }
139
+
140
+ [ Fact ]
141
+ public async Task Should_Handle_Null_Workspace_Folders_On_Refresh ( )
142
+ {
143
+ var workspaceLanguageServer = Substitute . For < IWorkspaceLanguageServer > ( ) ;
144
+ var languageServer = Substitute . For < ILanguageServer > ( ) ;
145
+ languageServer . ClientSettings . Returns (
146
+ new InitializeParams ( ) {
147
+ Capabilities = new ClientCapabilities ( ) {
148
+ Workspace = new WorkspaceClientCapabilities ( ) {
149
+ WorkspaceFolders = true
150
+ }
151
+ } ,
152
+ WorkspaceFolders = null
153
+ }
154
+ ) ;
155
+ languageServer . SendRequest ( Arg . Any < WorkspaceFolderParams > ( ) , Arg . Any < CancellationToken > ( ) ) . Returns ( ( Container < WorkspaceFolder > ) null ) ;
156
+ var workspaceFolders = new LanguageServerWorkspaceFolderManager ( workspaceLanguageServer ) ;
157
+ var started = ( IOnLanguageServerStarted ) workspaceFolders ;
158
+ await started . OnStarted ( languageServer , CancellationToken ) ;
159
+
160
+ var result = await workspaceFolders . Refresh ( ) . ToArray ( ) ;
161
+
162
+ result . Should ( ) . BeEmpty ( ) ;
163
+ }
164
+
119
165
private void ConfigureClient ( LanguageClientOptions options ) =>
120
166
options . WithClientCapabilities (
121
167
new ClientCapabilities {
0 commit comments