2323
2424import com .github ._1c_syntax .bsl .languageserver .context .ServerContext ;
2525import com .github ._1c_syntax .bsl .languageserver .jsonrpc .DiagnosticParams ;
26+ import com .github ._1c_syntax .bsl .languageserver .providers .DiagnosticProvider ;
2627import com .github ._1c_syntax .bsl .languageserver .util .CleanupContextBeforeClassAndAfterClass ;
2728import com .github ._1c_syntax .bsl .languageserver .utils .Ranges ;
2829import com .github ._1c_syntax .utils .Absolute ;
2930import org .apache .commons .io .FileUtils ;
31+ import org .eclipse .lsp4j .ClientCapabilities ;
32+ import org .eclipse .lsp4j .DiagnosticCapabilities ;
3033import org .eclipse .lsp4j .DidChangeTextDocumentParams ;
3134import org .eclipse .lsp4j .DidCloseTextDocumentParams ;
3235import org .eclipse .lsp4j .DidOpenTextDocumentParams ;
3639import org .eclipse .lsp4j .Position ;
3740import org .eclipse .lsp4j .PrepareRenameParams ;
3841import org .eclipse .lsp4j .RenameParams ;
42+ import org .eclipse .lsp4j .TextDocumentClientCapabilities ;
3943import org .eclipse .lsp4j .TextDocumentContentChangeEvent ;
4044import org .eclipse .lsp4j .TextDocumentIdentifier ;
4145import org .eclipse .lsp4j .TextDocumentItem ;
5155import java .nio .charset .StandardCharsets ;
5256import java .util .ArrayList ;
5357import java .util .List ;
58+ import java .util .Optional ;
5459import java .util .concurrent .ExecutionException ;
5560
5661import static org .assertj .core .api .Assertions .assertThat ;
5762import static org .awaitility .Awaitility .await ;
63+ import static org .mockito .ArgumentMatchers .any ;
64+ import static org .mockito .Mockito .clearInvocations ;
65+ import static org .mockito .Mockito .never ;
66+ import static org .mockito .Mockito .verify ;
67+ import static org .mockito .Mockito .when ;
5868
5969@ SpringBootTest
6070@ CleanupContextBeforeClassAndAfterClass
@@ -64,6 +74,11 @@ class BSLTextDocumentServiceTest {
6474 private BSLTextDocumentService textDocumentService ;
6575 @ MockitoSpyBean
6676 private ServerContext serverContext ;
77+ @ MockitoSpyBean
78+ private DiagnosticProvider diagnosticProvider ;
79+ @ MockitoSpyBean
80+ private ClientCapabilitiesHolder clientCapabilitiesHolder ;
81+
6782
6883 @ Test
6984 void didOpen () throws IOException {
@@ -186,6 +201,58 @@ void didClose() {
186201 textDocumentService .didClose (params );
187202 }
188203
204+ @ Test
205+ void didClosePublishesEmptyDiagnosticsWhenClientDoesNotSupportPullDiagnostics () throws IOException {
206+ // given - open a document
207+ var textDocumentItem = getTextDocumentItem ();
208+ var didOpenParams = new DidOpenTextDocumentParams (textDocumentItem );
209+ textDocumentService .didOpen (didOpenParams );
210+
211+ // Simulate client without pull diagnostics support
212+ var capabilities = new ClientCapabilities ();
213+ // No TextDocumentClientCapabilities.diagnostic set
214+ when (clientCapabilitiesHolder .getCapabilities ()).thenReturn (Optional .of (capabilities ));
215+ textDocumentService .handleInitializeEvent (null );
216+
217+ // Clear any invocations from didOpen
218+ clearInvocations (diagnosticProvider );
219+
220+ // when
221+ var closeParams = new DidCloseTextDocumentParams ();
222+ closeParams .setTextDocument (new TextDocumentIdentifier (textDocumentItem .getUri ()));
223+ textDocumentService .didClose (closeParams );
224+
225+ // then - publishEmptyDiagnosticList should be called
226+ verify (diagnosticProvider ).publishEmptyDiagnosticList (any ());
227+ }
228+
229+ @ Test
230+ void didCloseDoesNotPublishEmptyDiagnosticsWhenClientSupportsPullDiagnostics () throws IOException {
231+ // given - open a document
232+ var textDocumentItem = getTextDocumentItem ();
233+ var didOpenParams = new DidOpenTextDocumentParams (textDocumentItem );
234+ textDocumentService .didOpen (didOpenParams );
235+
236+ // Simulate client with pull diagnostics support
237+ var capabilities = new ClientCapabilities ();
238+ var textDocumentCapabilities = new TextDocumentClientCapabilities ();
239+ textDocumentCapabilities .setDiagnostic (new DiagnosticCapabilities ());
240+ capabilities .setTextDocument (textDocumentCapabilities );
241+ when (clientCapabilitiesHolder .getCapabilities ()).thenReturn (Optional .of (capabilities ));
242+ textDocumentService .handleInitializeEvent (null );
243+
244+ // Clear any invocations from didOpen
245+ clearInvocations (diagnosticProvider );
246+
247+ // when
248+ var closeParams = new DidCloseTextDocumentParams ();
249+ closeParams .setTextDocument (new TextDocumentIdentifier (textDocumentItem .getUri ()));
250+ textDocumentService .didClose (closeParams );
251+
252+ // then - publishEmptyDiagnosticList should NOT be called
253+ verify (diagnosticProvider , never ()).publishEmptyDiagnosticList (any ());
254+ }
255+
189256 @ Test
190257 void didSave () {
191258 DidSaveTextDocumentParams params = new DidSaveTextDocumentParams ();
0 commit comments