From 7239720e8c8a05dad7d1b0f11d569b7438218012 Mon Sep 17 00:00:00 2001 From: Sebastian Thomschke Date: Fri, 1 Jul 2022 15:42:36 +0200 Subject: [PATCH] Refactor LanguageServiceAccessTest to improve comprehensibility and stability --- .../test/LanguageServiceAccessorTest.java | 405 ++++++++---------- 1 file changed, 185 insertions(+), 220 deletions(-) diff --git a/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/LanguageServiceAccessorTest.java b/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/LanguageServiceAccessorTest.java index 9654f9eab..5cfc31abe 100644 --- a/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/LanguageServiceAccessorTest.java +++ b/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/LanguageServiceAccessorTest.java @@ -13,19 +13,19 @@ *******************************************************************************/ package org.eclipse.lsp4e.test; +import static org.eclipse.lsp4e.LSPEclipseUtils.*; +import static org.eclipse.lsp4e.LanguageServiceAccessor.*; +import static org.eclipse.lsp4e.test.TestUtils.*; import static org.junit.Assert.*; -import java.io.File; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; import org.eclipse.core.filesystem.EFS; -import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; @@ -34,203 +34,171 @@ import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.internal.core.IInternalDebugCoreConstants; import org.eclipse.debug.internal.core.Preferences; -import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jface.text.Document; -import org.eclipse.jface.text.ITextViewer; -import org.eclipse.lsp4e.LSPEclipseUtils; import org.eclipse.lsp4e.LanguageServerPlugin; -import org.eclipse.lsp4e.LanguageServerWrapper; import org.eclipse.lsp4e.LanguageServersRegistry; -import org.eclipse.lsp4e.LanguageServersRegistry.LanguageServerDefinition; -import org.eclipse.lsp4e.LanguageServiceAccessor; -import org.eclipse.lsp4e.LanguageServiceAccessor.LSPDocumentInfo; import org.eclipse.lsp4e.tests.mock.MockLanguageServer; import org.eclipse.lsp4e.tests.mock.MockLanguageServerMultiRootFolders; -import org.eclipse.lsp4j.HoverOptions; import org.eclipse.lsp4j.ServerCapabilities; -import org.eclipse.lsp4j.jsonrpc.messages.Either; -import org.eclipse.lsp4j.services.LanguageServer; -import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.IEditorPart; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.texteditor.AbstractTextEditor; import org.eclipse.ui.texteditor.ITextEditor; -import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; public class LanguageServiceAccessorTest { - @Rule public AllCleanRule clear = new AllCleanRule(); + private static final Predicate MATCH_ALL = capabilities -> true; + + @Rule + public AllCleanRule clear = new AllCleanRule(); private IProject project; @Before public void setUp() throws CoreException { - project = TestUtils.createProject("LanguageServiceAccessorTest" + System.currentTimeMillis()); + project = createProject("LanguageServiceAccessorTest" + System.currentTimeMillis()); } @Test public void testGetLSWrapper() throws IOException { - LanguageServerDefinition serverDefinition = LanguageServersRegistry.getInstance().getDefinition("org.eclipse.lsp4e.test.server"); + var serverDefinition = LanguageServersRegistry.getInstance().getDefinition("org.eclipse.lsp4e.test.server"); assertNotNull(serverDefinition); - LanguageServerWrapper lsWrapper = LanguageServiceAccessor.getLSWrapper(project, serverDefinition); + + var lsWrapper = getLSWrapper(project, serverDefinition); assertNotNull(lsWrapper); } @Test public void testGetLSPDocumentInfoForInvalidDocument() { - Collection infos = LanguageServiceAccessor.getLSPDocumentInfosFor(new Document(), null); + var infos = getLSPDocumentInfosFor(new Document(), MATCH_ALL); assertTrue(infos.isEmpty()); } @Test public void testGetLSPDocumentInfoForInvalidTextEditor() throws CoreException { - IFile testFile = TestUtils.createFile(project, "not_associated_with_ls.abc", ""); - ITextViewer textViewer = TestUtils.openTextViewer(testFile); - Collection infos = LanguageServiceAccessor.getLSPDocumentInfosFor(textViewer.getDocument(), capabilities -> Boolean.TRUE); + var testFile = createFile(project, "not_associated_with_ls.abc", ""); + var textViewer = openTextViewer(testFile); + var infos = getLSPDocumentInfosFor(textViewer.getDocument(), MATCH_ALL); assertTrue(infos.isEmpty()); } @Test public void testGetLanguageServerInvalidFile() throws Exception { - IFile testFile = TestUtils.createFile(project, "not_associated_with_ls.abc", ""); - Collection servers = new ArrayList<>(); - for (CompletableFuture future :LanguageServiceAccessor.getInitializedLanguageServers(testFile, capabilites -> Boolean.TRUE)){ - servers.add(future.get(1, TimeUnit.SECONDS)); - } - assertTrue(servers.isEmpty()); + var testFile = createFile(project, "not_associated_with_ls.abc", ""); + assertEmpty(getInitializedLanguageServers(testFile, MATCH_ALL)); } @Test public void testLSAsExtension() throws Exception { - IFile testFile = TestUtils.createFile(project, "shouldUseExtension.lspt", ""); - LanguageServer info = LanguageServiceAccessor - .getInitializedLanguageServers(testFile, capabilites -> Boolean.TRUE).iterator().next() - .get(1, TimeUnit.SECONDS); - assertNotNull(info); + var testFile = createFile(project, "shouldUseExtension.lspt", ""); + var ls = getInitializedLanguageServers(testFile, MATCH_ALL).get(0).get(2, TimeUnit.SECONDS); + assertNotNull(ls); } @Test public void testLSAsRunConfiguration() throws Exception { - IFile testFile = TestUtils.createFile(project, "shouldUseRunConfiguration.lspt2", ""); - LanguageServer info = LanguageServiceAccessor - .getInitializedLanguageServers(testFile, capabilites -> Boolean.TRUE).iterator().next() - .get(1, TimeUnit.SECONDS); - assertNotNull(info); + var testFile = createFile(project, "shouldUseRunConfiguration.lspt2", ""); + var ls = getInitializedLanguageServers(testFile, MATCH_ALL).get(0).get(2, TimeUnit.SECONDS); + assertNotNull(ls); } @Test public void testLSAsExtensionForDifferentLanguageId() throws Exception { - IFile testFile = TestUtils.createFile(project, "shouldUseExtension.lspt-different", ""); @NonNull - Collection lsWrappers = LanguageServiceAccessor.getLSWrappers(testFile, - capabilites -> Boolean.TRUE); - + var testFile = createFile(project, "shouldUseExtension.lspt-different", ""); + var lsWrappers = getLSWrappers(testFile, MATCH_ALL); assertEquals(1, lsWrappers.size()); - LanguageServerWrapper wrapper = lsWrappers.iterator().next(); + + var wrapper = lsWrappers.iterator().next(); assertNotNull(wrapper); - IContentType contentType = Platform.getContentTypeManager().getContentType("org.eclipse.lsp4e.test.content-type-different"); - assertEquals("differentLanguageId", wrapper.getLanguageId(new IContentType[] {contentType})); + var contentType = Platform.getContentTypeManager() + .getContentType("org.eclipse.lsp4e.test.content-type-different"); + assertEquals("differentLanguageId", wrapper.getLanguageId(new IContentType[] { contentType })); } @Test public void testGetLSWrappersInitializationFailed() throws Exception { - IFile testFile = TestUtils.createFile(project, "fileWithFailedServer.lsptWithException", ""); - Collection wrappers = LanguageServiceAccessor.getLSWrappers(testFile, - capabilites -> Boolean.TRUE); + var testFile = createFile(project, "fileWithFailedServer.lsptWithException", ""); + var wrappers = getLSWrappers(testFile, MATCH_ALL); assertEquals(1, wrappers.size()); } @Test public void testReuseSameLSforMultiContentType() throws Exception { - IFile testFile1 = TestUtils.createUniqueTestFile(project, ""); - IFile testFile2 = TestUtils.createUniqueTestFileMultiLS(project, ""); - // wrap in HashSet as a workaround of https://github.com/eclipse/lsp4j/issues/106 - Collection file1LanguageServers = new ArrayList<>(); - for (CompletableFuture future : LanguageServiceAccessor.getInitializedLanguageServers(testFile1, - capabilites -> Boolean.TRUE)) { - file1LanguageServers.add(future.get(1, TimeUnit.SECONDS)); - } + var testFile1 = createUniqueTestFile(project, ""); + var testFile2 = createUniqueTestFileMultiLS(project, ""); + + var file1LanguageServers = getInitializedLanguageServers(testFile1, MATCH_ALL); assertEquals(1, file1LanguageServers.size()); - LanguageServer file1LS = file1LanguageServers.iterator().next(); - Collection file2LanguageServers = new ArrayList<>(); - for (CompletableFuture future : LanguageServiceAccessor.getInitializedLanguageServers(testFile2, - capabilites -> Boolean.TRUE)) { - file2LanguageServers.add(future.get(1, TimeUnit.SECONDS)); + + var file2LanguageServers = new ArrayList<>(); + for (var future : getInitializedLanguageServers(testFile2, MATCH_ALL)) { + file2LanguageServers.add(future.get(2, TimeUnit.SECONDS)); } assertEquals(2, file2LanguageServers.size()); + + var file1LS = file1LanguageServers.get(0).get(2, TimeUnit.SECONDS); assertTrue(file2LanguageServers.contains(file1LS)); // LS from file1 is reused - assertEquals("Not right amount of language servers bound to project", 2, LanguageServiceAccessor.getLanguageServers(project, c -> Boolean.TRUE).size()); + + assertEquals("Not right amount of language servers bound to project", 2, + getLanguageServers(project, MATCH_ALL).size()); } @Test public void testGetOnlyRunningLanguageServers() throws Exception { - Display display = Display.getCurrent(); + var testFile1 = createUniqueTestFile(project, ""); + var testFile2 = createUniqueTestFile(project, "lspt-different", ""); - IFile testFile1 = TestUtils.createUniqueTestFile(project, ""); - IFile testFile2 = TestUtils.createUniqueTestFile(project, "lspt-different", ""); + var editor1 = openEditor(testFile1); + var editor2 = openEditor(testFile2); - IEditorPart editor1 = TestUtils.openEditor(testFile1); - IEditorPart editor2 = TestUtils.openEditor(testFile2); + assertNotEmpty(getInitializedLanguageServers(testFile1, MATCH_ALL)); + assertNotEmpty(getInitializedLanguageServers(testFile2, MATCH_ALL)); - LanguageServiceAccessor.getInitializedLanguageServers(testFile1, capabilities -> Boolean.TRUE).iterator() - .next(); - LanguageServiceAccessor.getInitializedLanguageServers(testFile2, capabilities -> Boolean.TRUE).iterator() - .next(); - - List runningServers = LanguageServiceAccessor.getActiveLanguageServers(capabilities -> Boolean.TRUE); + var runningServers = getActiveLanguageServers(MATCH_ALL); assertEquals(2, runningServers.size()); ((AbstractTextEditor) editor1).close(false); ((AbstractTextEditor) editor2).close(false); - new LSDisplayHelper(() -> LanguageServiceAccessor.getActiveLanguageServers(capabilities -> Boolean.TRUE).size() == 0) - .waitForCondition(display, 5000); - assertEquals(0, LanguageServiceAccessor.getActiveLanguageServers(capabilities -> Boolean.TRUE).size()); + waitForCondition(5_000, () -> getActiveLanguageServers(MATCH_ALL).isEmpty()); + assertEquals(0, getActiveLanguageServers(MATCH_ALL).size()); - editor1 = TestUtils.openEditor(testFile1); - LanguageServiceAccessor.getInitializedLanguageServers(testFile1, capabilities -> Boolean.TRUE).iterator() - .next(); + editor1 = openEditor(testFile1); + assertNotEmpty(getInitializedLanguageServers(testFile1, MATCH_ALL)); - new LSDisplayHelper(() -> LanguageServiceAccessor.getActiveLanguageServers(capabilities -> Boolean.TRUE).size() == 1) - .waitForCondition(display, 5000); - assertEquals(1, LanguageServiceAccessor.getActiveLanguageServers(capabilities -> Boolean.TRUE).size()); + waitForCondition(5_000, () -> getActiveLanguageServers(MATCH_ALL).size() == 1); + assertEquals(1, getActiveLanguageServers(MATCH_ALL).size()); } @Test public void testCreateNewLSAfterInitialProjectGotDeleted() throws Exception { - IFile testFile1 = TestUtils.createUniqueTestFile(project, ""); + var testFile1 = createUniqueTestFile(project, ""); - TestUtils.openEditor(testFile1); - LanguageServiceAccessor.getInitializedLanguageServers(testFile1, capabilities -> Boolean.TRUE).iterator() - .next(); - new LSDisplayHelper(() -> MockLanguageServer.INSTANCE.isRunning()).waitForCondition(Display.getCurrent(), 5000, - 300); + openEditor(testFile1); + assertNotEmpty(getInitializedLanguageServers(testFile1, MATCH_ALL)); + waitForCondition(5_000, () -> MockLanguageServer.INSTANCE.isRunning()); - Collection wrappers = LanguageServiceAccessor.getLSWrappers(testFile1, - c -> Boolean.TRUE); - LanguageServerWrapper wrapper1 = wrappers.iterator().next(); + var wrappers = getLSWrappers(testFile1, MATCH_ALL); + var wrapper1 = wrappers.iterator().next(); assertTrue(wrapper1.isActive()); PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().closeAllEditors(false); - new LSDisplayHelper(() -> !MockLanguageServer.INSTANCE.isRunning()).waitForCondition(Display.getCurrent(), 5000, - 300); + waitForCondition(5_000, () -> !MockLanguageServer.INSTANCE.isRunning()); project.delete(true, true, new NullProgressMonitor()); - project = TestUtils.createProject("LanguageServiceAccessorTest2" + System.currentTimeMillis()); - IFile testFile2 = TestUtils.createUniqueTestFile(project, ""); + project = createProject("LanguageServiceAccessorTest2" + System.currentTimeMillis()); + var testFile2 = createUniqueTestFile(project, ""); - TestUtils.openEditor(testFile2); - LanguageServiceAccessor.getInitializedLanguageServers(testFile2, capabilities -> Boolean.TRUE).iterator() - .next(); - new LSDisplayHelper(() -> MockLanguageServer.INSTANCE.isRunning()).waitForCondition(Display.getCurrent(), 5000, - 300); + openEditor(testFile2); + assertNotEmpty(getInitializedLanguageServers(testFile2, MATCH_ALL)); + waitForCondition(5_000, () -> MockLanguageServer.INSTANCE.isRunning()); - wrappers = LanguageServiceAccessor.getLSWrappers(testFile2, c -> Boolean.TRUE); - LanguageServerWrapper wrapper2 = wrappers.iterator().next(); + wrappers = getLSWrappers(testFile2, MATCH_ALL); + var wrapper2 = wrappers.iterator().next(); assertTrue(wrapper2.isActive()); assertTrue(wrapper1 != wrapper2); @@ -238,36 +206,30 @@ public void testCreateNewLSAfterInitialProjectGotDeleted() throws Exception { @Test public void testReuseMultirootFolderLSAfterInitialProjectGotDeleted() throws Exception { - IFile testFile1 = TestUtils.createUniqueTestFile(project, "lsptWithMultiRoot", ""); + var testFile1 = createUniqueTestFile(project, "lsptWithMultiRoot", ""); - TestUtils.openEditor(testFile1); - LanguageServiceAccessor.getInitializedLanguageServers(testFile1, capabilities -> Boolean.TRUE).iterator() - .next(); - new LSDisplayHelper(() -> MockLanguageServerMultiRootFolders.INSTANCE.isRunning()) - .waitForCondition(Display.getCurrent(), 5000, 300); + openEditor(testFile1); + assertNotEmpty(getInitializedLanguageServers(testFile1, MATCH_ALL)); + waitForCondition(5_000, () -> MockLanguageServerMultiRootFolders.INSTANCE.isRunning()); - Collection wrappers = LanguageServiceAccessor.getLSWrappers(testFile1, - c -> Boolean.TRUE); - LanguageServerWrapper wrapper1 = wrappers.iterator().next(); + var wrappers = getLSWrappers(testFile1, MATCH_ALL); + var wrapper1 = wrappers.iterator().next(); assertTrue(wrapper1.isActive()); PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().closeAllEditors(false); - new LSDisplayHelper(() -> !MockLanguageServerMultiRootFolders.INSTANCE.isRunning()) - .waitForCondition(Display.getCurrent(), 5000, 300); + waitForCondition(5_000, () -> !MockLanguageServerMultiRootFolders.INSTANCE.isRunning()); project.delete(true, true, new NullProgressMonitor()); - project = TestUtils.createProject("LanguageServiceAccessorTest2" + System.currentTimeMillis()); - IFile testFile2 = TestUtils.createUniqueTestFile(project, "lsptWithMultiRoot", ""); + project = createProject("LanguageServiceAccessorTest2" + System.currentTimeMillis()); + var testFile2 = createUniqueTestFile(project, "lsptWithMultiRoot", ""); - TestUtils.openEditor(testFile2); - LanguageServiceAccessor.getInitializedLanguageServers(testFile2, capabilities -> Boolean.TRUE).iterator() - .next(); - new LSDisplayHelper(() -> MockLanguageServerMultiRootFolders.INSTANCE.isRunning()) - .waitForCondition(Display.getCurrent(), 5000, 300); + openEditor(testFile2); + assertNotEmpty(getInitializedLanguageServers(testFile2, MATCH_ALL)); + waitForCondition(5_000, () -> MockLanguageServerMultiRootFolders.INSTANCE.isRunning()); - wrappers = LanguageServiceAccessor.getLSWrappers(testFile2, c -> Boolean.TRUE); - LanguageServerWrapper wrapper2 = wrappers.iterator().next(); + wrappers = getLSWrappers(testFile2, MATCH_ALL); + var wrapper2 = wrappers.iterator().next(); assertTrue(wrapper2.isActive()); assertTrue(wrapper1 == wrapper2); @@ -275,22 +237,22 @@ public void testReuseMultirootFolderLSAfterInitialProjectGotDeleted() throws Exc @Test public void testDontRestartUnrelatedLSForFileFromSameProject() throws Exception { - IFile testFile1 = TestUtils.createUniqueTestFile(project, ""); - IFile testFile2 = TestUtils.createUniqueTestFile(project, "lspt-different", ""); + var testFile1 = createUniqueTestFile(project, ""); + var testFile2 = createUniqueTestFile(project, "lspt-different", ""); - Collection wrappers1 = LanguageServiceAccessor.getLSWrappers(testFile1, - c -> Boolean.TRUE); + var wrappers1 = getLSWrappers(testFile1, MATCH_ALL); assertEquals(1, wrappers1.size()); - LanguageServerWrapper wrapper1 = wrappers1.iterator().next(); + + var wrapper1 = wrappers1.iterator().next(); assertTrue(wrapper1.isActive()); wrapper1.disconnect(testFile1.getLocationURI()); assertFalse(wrapper1.isActive()); - Collection wrappers2 = LanguageServiceAccessor.getLSWrappers(testFile2, - c -> Boolean.TRUE); + var wrappers2 = getLSWrappers(testFile2, MATCH_ALL); assertEquals(1, wrappers2.size()); - LanguageServerWrapper wrapper2 = wrappers2.iterator().next(); + + var wrapper2 = wrappers2.iterator().next(); assertTrue(wrapper2.isActive()); // make sure the language server for testFile1 (which is unrelated to testFile2 is not started again) @@ -301,41 +263,46 @@ public void testDontRestartUnrelatedLSForFileFromSameProject() throws Exception @Test public void testLastDocumentDisconnectedTimeoutManualStop() throws Exception { - IFile testFile = TestUtils.createUniqueTestFile(project, "lsptWithLastDocumentDisconnectedTimeout", ""); + var testFile = createUniqueTestFile(project, "lsptWithLastDocumentDisconnectedTimeout", ""); - Collection wrappers = LanguageServiceAccessor.getLSWrappers(testFile, c -> Boolean.TRUE); + var wrappers = getLSWrappers(testFile, MATCH_ALL); assertEquals(1, wrappers.size()); - LanguageServerWrapper wrapper = wrappers.iterator().next(); + + var wrapper = wrappers.iterator().next(); assertTrue(wrapper.isActive()); wrapper.disconnect(testFile.getLocationURI()); assertTrue(wrapper.isActive()); + wrapper.stop(); assertFalse(wrapper.isActive()); } @Test public void testLastDocumentDisconnectedTimeoutTimerStop() throws Exception { - IFile testFile = TestUtils.createUniqueTestFile(project, "lsptWithLastDocumentDisconnectedTimeout", ""); + var testFile = createUniqueTestFile(project, "lsptWithLastDocumentDisconnectedTimeout", ""); - Collection wrappers = LanguageServiceAccessor.getLSWrappers(testFile, c -> Boolean.TRUE); + var wrappers = getLSWrappers(testFile, MATCH_ALL); assertEquals(1, wrappers.size()); - LanguageServerWrapper wrapper = wrappers.iterator().next(); + + var wrapper = wrappers.iterator().next(); assertTrue(wrapper.isActive()); wrapper.disconnect(testFile.getLocationURI()); assertTrue(wrapper.isActive()); + Thread.sleep(TimeUnit.SECONDS.toMillis(5)); assertFalse(wrapper.isActive()); } @Test public void testLastDocumentDisconnectedTimeoutZero() throws Exception { - IFile testFile = TestUtils.createUniqueTestFile(project, ""); + var testFile = createUniqueTestFile(project, ""); - Collection wrappers = LanguageServiceAccessor.getLSWrappers(testFile, c -> Boolean.TRUE); + var wrappers = getLSWrappers(testFile, MATCH_ALL); assertEquals(1, wrappers.size()); - LanguageServerWrapper wrapper = wrappers.iterator().next(); + + var wrapper = wrappers.iterator().next(); assertTrue(wrapper.isActive()); wrapper.disconnect(testFile.getLocationURI()); @@ -345,10 +312,9 @@ public void testLastDocumentDisconnectedTimeoutZero() throws Exception { @Test public void testLanguageServerHierarchy_moreSpecializedFirst() throws Exception { // file with a content-type and a parent, each associated to one LS - IFile testFile = TestUtils.createUniqueTestFile(project, "lsptchild", ""); - @NonNull Collection servers = LanguageServiceAccessor.getLSWrappers(testFile, - c -> Boolean.TRUE); - Iterator iterator = servers.iterator(); + var testFile = createUniqueTestFile(project, "lsptchild", ""); + var servers = getLSWrappers(testFile, MATCH_ALL); + var iterator = servers.iterator(); assertEquals("org.eclipse.lsp4e.test.server2", iterator.next().serverDefinition.id); assertEquals("org.eclipse.lsp4e.test.server", iterator.next().serverDefinition.id); } @@ -356,111 +322,102 @@ public void testLanguageServerHierarchy_moreSpecializedFirst() throws Exception @Test public void testLanguageServerHierarchy_parentContentTypeUsed() throws Exception { // file with a content-type whose parent (only) is associated to one LS - IFile testFile = TestUtils.createUniqueTestFile(project, "lsptchildNoLS", ""); - @NonNull Collection servers = LanguageServiceAccessor.getLSWrappers(testFile, - c -> Boolean.TRUE); - Iterator iterator = servers.iterator(); + var testFile = createUniqueTestFile(project, "lsptchildNoLS", ""); + var servers = getLSWrappers(testFile, MATCH_ALL); + var iterator = servers.iterator(); assertEquals("org.eclipse.lsp4e.test.server", iterator.next().serverDefinition.id); assertFalse("Should only be a single LS", iterator.hasNext()); } @Test public void testLanguageServerEnablement() throws Exception { - LanguageServerPlugin.getDefault().getPreferenceStore().setValue( - "org.eclipse.lsp4e.test.server.disable" + "/" + "org.eclipse.lsp4e.test.content-type-disabled", - "false"); - IFile disabledFile = TestUtils.createUniqueTestFile(project, "lspt-disabled", ""); - IFile enabledFile = TestUtils.createUniqueTestFile(project, "lspt-enabled", ""); - - LanguageServiceAccessor.getLSWrappers(disabledFile, capabilities -> true).stream().forEach( - wrapper -> assertFalse(wrapper.serverDefinition.id.equals("org.eclipse.lsp4e.test.server.disable"))); - assertTrue(LanguageServiceAccessor.getLSWrappers(enabledFile, capabilities -> true).stream() - .filter(wrapper -> wrapper.serverDefinition.id.equals("org.eclipse.lsp4e.test.server.disable")) - .findFirst().isPresent()); - - LanguageServerPlugin.getDefault().getPreferenceStore().setValue( - "org.eclipse.lsp4e.test.server.disable" + "/" + "org.eclipse.lsp4e.test.content-type-disabled", - "true"); - assertTrue(LanguageServiceAccessor.getLSWrappers(disabledFile, capabilities -> true).stream() - .filter(wrapper -> wrapper.serverDefinition.id.equals("org.eclipse.lsp4e.test.server.disable")) - .findFirst().isPresent()); - assertTrue(LanguageServiceAccessor.getLSWrappers(enabledFile, capabilities -> true).stream() - .filter(wrapper -> wrapper.serverDefinition.id.equals("org.eclipse.lsp4e.test.server.disable")) - .findFirst().isPresent()); + final var serverId = ContentTypeToLanguageServerDefinitionTest.SERVER_TO_DISABLE; + final var prefKey = serverId + "/" + "org.eclipse.lsp4e.test.content-type-disabled"; + LanguageServerPlugin.getDefault().getPreferenceStore().setValue(prefKey, Boolean.FALSE.toString()); + + var disabledFile = createUniqueTestFile(project, "lspt-disabled", ""); + assertFalse(getLSWrappers(disabledFile, MATCH_ALL).stream().filter(w -> w.serverDefinition.id.equals(serverId)) + .findAny().isPresent()); + + var enabledFile = createUniqueTestFile(project, "lspt-enabled", ""); + assertTrue(getLSWrappers(enabledFile, MATCH_ALL).stream().filter(w -> w.serverDefinition.id.equals(serverId)) + .findAny().isPresent()); + + LanguageServerPlugin.getDefault().getPreferenceStore().setValue(prefKey, Boolean.TRUE.toString()); + + assertTrue(getLSWrappers(disabledFile, MATCH_ALL).stream().filter(w -> w.serverDefinition.id.equals(serverId)) + .findAny().isPresent()); + assertTrue(getLSWrappers(enabledFile, MATCH_ALL).stream().filter(w -> w.serverDefinition.id.equals(serverId)) + .findAny().isPresent()); } @Test public void testLanguageServerEnablementTester() throws Exception { - IFile file = TestUtils.createUniqueTestFile(project, "lspt-tester", ""); - assertTrue(LanguageServiceAccessor.getLSWrappers(file, capabilities -> true).isEmpty()); + final var serverId = ContentTypeToLanguageServerDefinitionTest.SERVER_TO_DISABLE; + + var file = createUniqueTestFile(project, "lspt-tester", ""); + assertTrue(getLSWrappers(file, MATCH_ALL).isEmpty()); MappingEnablementTester.enabled = true; - Collection wrappers = LanguageServiceAccessor.getLSWrappers(file, capabilities -> true); + var wrappers = getLSWrappers(file, MATCH_ALL); assertEquals(1, wrappers.size()); - assertEquals("org.eclipse.lsp4e.test.server.disable", wrappers.iterator().next().serverDefinition.id); + assertEquals(serverId, wrappers.iterator().next().serverDefinition.id); } @Test public void testStatusHandlerLSAsRunConfiguration() throws Exception { - // test which checks that status handler preferences is kept after the launch is - // done. - IFile testFile = TestUtils.createFile(project, "shouldUseRunConfiguration.lspt2", ""); + // test which checks that status handler preferences is kept after the launch is done. + var testFile = createFile(project, "shouldUseRunConfiguration.lspt2", ""); // Test with default status handler (see DebugPlugin#getStatusHandler) - boolean oldStatusHandler = getStatusHandler(); - LanguageServiceAccessor.getLanguageServers(LSPEclipseUtils.getDocument(testFile), null).get(1, TimeUnit.SECONDS); - assertEquals(getStatusHandler(), oldStatusHandler); + var oldStatusHandler = isStatusHandlersEnabled(); + getLanguageServers(getDocument(testFile), null).get(2, TimeUnit.SECONDS); + assertEquals(isStatusHandlersEnabled(), oldStatusHandler); // Test with status handler set to false - setStatusHandler(false); - oldStatusHandler = getStatusHandler(); - LanguageServiceAccessor.getLanguageServers(LSPEclipseUtils.getDocument(testFile), null).get(1, TimeUnit.SECONDS); - assertEquals(getStatusHandler(), false); + setStatusHandlersEnabled(false); + oldStatusHandler = isStatusHandlersEnabled(); + getLanguageServers(getDocument(testFile), null).get(2, TimeUnit.SECONDS); + assertEquals(isStatusHandlersEnabled(), false); // Test with status handler set to true - setStatusHandler(true); - oldStatusHandler = getStatusHandler(); - LanguageServiceAccessor.getLanguageServers(LSPEclipseUtils.getDocument(testFile), null).get(1, TimeUnit.SECONDS); - assertEquals(getStatusHandler(), true); + setStatusHandlersEnabled(true); + oldStatusHandler = isStatusHandlersEnabled(); + getLanguageServers(getDocument(testFile), null).get(2, TimeUnit.SECONDS); + assertEquals(isStatusHandlersEnabled(), true); } @Test public void testLSforExternalThenLocalFile() throws Exception { - File local = TestUtils.createTempFile("testLSforExternalThenLocalFile", ".lspt"); - ITextEditor editor = (ITextEditor) IDE.openEditorOnFileStore( - PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), EFS.getStore(local.toURI())); - Assert.assertEquals(1, LanguageServiceAccessor.getLanguageServers( - LSPEclipseUtils.getTextViewer(editor).getDocument(), this::hasHoverCapabilities).get().size()); - PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().closeAllEditors(false); - // opening another file should either reuse the LS or spawn another one, but not - // both - Assert.assertEquals(1, - LanguageServiceAccessor.getLanguageServers( - TestUtils.openTextViewer(TestUtils.createUniqueTestFile(project, "")).getDocument(), - this::hasHoverCapabilities).get().size()); - } - - private boolean hasHoverCapabilities(ServerCapabilities capabilities) { - Either hoverProvider = capabilities.getHoverProvider(); - if(hoverProvider.isLeft()) { - return hoverProvider.getLeft(); - } else { - return hoverProvider.getRight() != null; - } + var wb = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + var local = createTempFile("testLSforExternalThenLocalFile", ".lspt"); + var editor = (ITextEditor) IDE.openEditorOnFileStore(wb.getActivePage(), EFS.getStore(local.toURI())); + + Predicate hasHoverCapabilities = capabilities -> { + var hoverProvider = capabilities.getHoverProvider(); + return hoverProvider.isLeft() ? hoverProvider.getLeft() : hoverProvider.getRight() != null; + }; + + assertEquals(1, getLanguageServers(getTextViewer(editor).getDocument(), hasHoverCapabilities).get().size()); + wb.getActivePage().closeAllEditors(false); + // opening another file should either reuse the LS or spawn another one, but not both + assertEquals(1, getLanguageServers( // + openTextViewer(createUniqueTestFile(project, "")).getDocument(), hasHoverCapabilities).get().size()); } @Test public void testSingletonLS() throws Exception { - IFile testFile1 = TestUtils.createFile(project, "shouldUseSingletonLS.lsp-singletonLS", ""); - IProject project2 = TestUtils.createProject("project2"); - IFile testFile2 = TestUtils.createFile(project2, "shouldUseSingletonLS2.lsp-singletonLS", ""); - @NonNull CompletableFuture> languageServers = LanguageServiceAccessor.getLanguageServers(LSPEclipseUtils.getDocument(testFile1), cap -> true); - @NonNull CompletableFuture> languageServers2 = LanguageServiceAccessor.getLanguageServers(LSPEclipseUtils.getDocument(testFile2), cap -> true); - Assert.assertEquals(1, languageServers.get().size()); - Assert.assertEquals(languageServers.get(), languageServers2.get()); + var testFile1 = createFile(project, "shouldUseSingletonLS.lsp-singletonLS", ""); + var languageServers = getLanguageServers(getDocument(testFile1), MATCH_ALL); + + var project2 = createProject("project2"); + var testFile2 = createFile(project2, "shouldUseSingletonLS2.lsp-singletonLS", ""); + var languageServers2 = getLanguageServers(getDocument(testFile2), MATCH_ALL); + assertEquals(1, languageServers.get().size()); + assertEquals(languageServers.get(), languageServers2.get()); } - private static boolean getStatusHandler() { + private static boolean isStatusHandlersEnabled() { return Platform.getPreferencesService().getBoolean(DebugPlugin.getUniqueIdentifier(), IInternalDebugCoreConstants.PREF_ENABLE_STATUS_HANDLERS, true, null); } @@ -471,8 +428,16 @@ private static boolean getStatusHandler() { * @param enabled * the status handler preferences */ - private static void setStatusHandler(boolean enabled) { + private static void setStatusHandlersEnabled(boolean enabled) { Preferences.setBoolean(DebugPlugin.getUniqueIdentifier(), IInternalDebugCoreConstants.PREF_ENABLE_STATUS_HANDLERS, enabled, null); } + + private static void assertEmpty(Collection coll) { + assertTrue("Given collection is expected to be empty! " + coll, coll.isEmpty()); + } + + private static void assertNotEmpty(Collection coll) { + assertFalse("Given collection must not be empty!", coll.isEmpty()); + } }