2222package com .github ._1c_syntax .bsl .languageserver ;
2323
2424import com .github ._1c_syntax .bsl .languageserver .context .ServerContext ;
25+ import com .github ._1c_syntax .bsl .languageserver .events .LanguageServerInitializeRequestReceivedEvent ;
2526import com .github ._1c_syntax .bsl .languageserver .jsonrpc .DiagnosticParams ;
27+ import com .github ._1c_syntax .bsl .languageserver .providers .DiagnosticProvider ;
2628import com .github ._1c_syntax .bsl .languageserver .util .CleanupContextBeforeClassAndAfterClass ;
2729import com .github ._1c_syntax .bsl .languageserver .utils .Ranges ;
2830import com .github ._1c_syntax .utils .Absolute ;
2931import org .apache .commons .io .FileUtils ;
32+ import org .eclipse .lsp4j .ClientCapabilities ;
33+ import org .eclipse .lsp4j .DiagnosticCapabilities ;
3034import org .eclipse .lsp4j .DidChangeTextDocumentParams ;
3135import org .eclipse .lsp4j .DidCloseTextDocumentParams ;
3236import org .eclipse .lsp4j .DidOpenTextDocumentParams ;
3337import org .eclipse .lsp4j .DidSaveTextDocumentParams ;
3438import org .eclipse .lsp4j .DocumentDiagnosticParams ;
3539import org .eclipse .lsp4j .ImplementationParams ;
40+ import org .eclipse .lsp4j .InitializeParams ;
3641import org .eclipse .lsp4j .Position ;
3742import org .eclipse .lsp4j .PrepareRenameParams ;
3843import org .eclipse .lsp4j .RenameParams ;
44+ import org .eclipse .lsp4j .TextDocumentClientCapabilities ;
3945import org .eclipse .lsp4j .TextDocumentContentChangeEvent ;
4046import org .eclipse .lsp4j .TextDocumentIdentifier ;
4147import org .eclipse .lsp4j .TextDocumentItem ;
4248import org .eclipse .lsp4j .VersionedTextDocumentIdentifier ;
49+ import org .eclipse .lsp4j .services .LanguageServer ;
4350import org .junit .jupiter .api .Test ;
4451import org .springframework .beans .factory .annotation .Autowired ;
4552import org .springframework .boot .test .context .SpringBootTest ;
53+ import org .springframework .context .ApplicationEventPublisher ;
4654import org .springframework .test .context .bean .override .mockito .MockitoSpyBean ;
4755
4856import java .io .File ;
5563
5664import static org .assertj .core .api .Assertions .assertThat ;
5765import static org .awaitility .Awaitility .await ;
66+ import static org .mockito .ArgumentMatchers .any ;
67+ import static org .mockito .Mockito .clearInvocations ;
68+ import static org .mockito .Mockito .mock ;
69+ import static org .mockito .Mockito .never ;
70+ import static org .mockito .Mockito .verify ;
5871
5972@ SpringBootTest
6073@ CleanupContextBeforeClassAndAfterClass
@@ -64,6 +77,13 @@ class BSLTextDocumentServiceTest {
6477 private BSLTextDocumentService textDocumentService ;
6578 @ MockitoSpyBean
6679 private ServerContext serverContext ;
80+ @ MockitoSpyBean
81+ private DiagnosticProvider diagnosticProvider ;
82+ @ Autowired
83+ private ApplicationEventPublisher eventPublisher ;
84+ @ Autowired
85+ private ClientCapabilitiesHolder clientCapabilitiesHolder ;
86+
6787
6888 @ Test
6989 void didOpen () throws IOException {
@@ -186,6 +206,68 @@ void didClose() {
186206 textDocumentService .didClose (params );
187207 }
188208
209+ @ Test
210+ void didClosePublishesEmptyDiagnosticsWhenClientDoesNotSupportPullDiagnostics () throws IOException {
211+ // given - open a document
212+ var textDocumentItem = getTextDocumentItem ();
213+ var didOpenParams = new DidOpenTextDocumentParams (textDocumentItem );
214+ textDocumentService .didOpen (didOpenParams );
215+
216+ // Simulate client without pull diagnostics support
217+ var capabilities = new ClientCapabilities ();
218+ // No TextDocumentClientCapabilities.diagnostic set
219+ clientCapabilitiesHolder .setCapabilities (capabilities );
220+
221+ var languageServer = mock (LanguageServer .class );
222+ var params = new InitializeParams ();
223+ params .setCapabilities (capabilities );
224+ var event = new LanguageServerInitializeRequestReceivedEvent (languageServer , params );
225+ eventPublisher .publishEvent (event );
226+
227+ // Clear any invocations from didOpen
228+ clearInvocations (diagnosticProvider );
229+
230+ // when
231+ var closeParams = new DidCloseTextDocumentParams ();
232+ closeParams .setTextDocument (new TextDocumentIdentifier (textDocumentItem .getUri ()));
233+ textDocumentService .didClose (closeParams );
234+
235+ // then - publishEmptyDiagnosticList should be called
236+ verify (diagnosticProvider ).publishEmptyDiagnosticList (any ());
237+ }
238+
239+ @ Test
240+ void didCloseDoesNotPublishEmptyDiagnosticsWhenClientSupportsPullDiagnostics () throws IOException {
241+ // given - open a document
242+ var textDocumentItem = getTextDocumentItem ();
243+ var didOpenParams = new DidOpenTextDocumentParams (textDocumentItem );
244+ textDocumentService .didOpen (didOpenParams );
245+
246+ // Simulate client with pull diagnostics support
247+ var capabilities = new ClientCapabilities ();
248+ var textDocumentCapabilities = new TextDocumentClientCapabilities ();
249+ textDocumentCapabilities .setDiagnostic (new DiagnosticCapabilities ());
250+ capabilities .setTextDocument (textDocumentCapabilities );
251+ clientCapabilitiesHolder .setCapabilities (capabilities );
252+
253+ var languageServer = mock (LanguageServer .class );
254+ var params = new InitializeParams ();
255+ params .setCapabilities (capabilities );
256+ var event = new LanguageServerInitializeRequestReceivedEvent (languageServer , params );
257+ eventPublisher .publishEvent (event );
258+
259+ // Clear any invocations from didOpen
260+ clearInvocations (diagnosticProvider );
261+
262+ // when
263+ var closeParams = new DidCloseTextDocumentParams ();
264+ closeParams .setTextDocument (new TextDocumentIdentifier (textDocumentItem .getUri ()));
265+ textDocumentService .didClose (closeParams );
266+
267+ // then - publishEmptyDiagnosticList should NOT be called
268+ verify (diagnosticProvider , never ()).publishEmptyDiagnosticList (any ());
269+ }
270+
189271 @ Test
190272 void didSave () {
191273 DidSaveTextDocumentParams params = new DidSaveTextDocumentParams ();
0 commit comments