| /****************************************************************************** |
| * Copyright (c) 2016 TypeFox and others. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0, |
| * or the Eclipse Distribution License v. 1.0 which is available at |
| * http://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause |
| ******************************************************************************/ |
| package org.eclipse.lsp4j.test.services; |
| |
| import java.io.IOException; |
| import java.io.PipedInputStream; |
| import java.io.PipedOutputStream; |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.concurrent.CompletableFuture; |
| import java.util.concurrent.ExecutionException; |
| import java.util.concurrent.TimeUnit; |
| |
| import org.eclipse.lsp4j.DocumentLink; |
| import org.eclipse.lsp4j.DocumentLinkParams; |
| import org.eclipse.lsp4j.Position; |
| import org.eclipse.lsp4j.Range; |
| import org.eclipse.lsp4j.TextDocumentIdentifier; |
| import org.eclipse.lsp4j.jsonrpc.CompletableFutures; |
| import org.eclipse.lsp4j.jsonrpc.Launcher; |
| import org.eclipse.lsp4j.services.LanguageServer; |
| import org.junit.Assert; |
| import org.junit.Test; |
| |
| public class ProtocolTest { |
| |
| private static final long TIMEOUT = 2000; |
| |
| @Test public void testDocumentLink_01() throws Exception, ExecutionException { |
| LanguageServer languageServer = wrap(LanguageServer.class, new MockLanguageServer() { |
| @Override |
| public CompletableFuture<List<DocumentLink>> documentLink(DocumentLinkParams params) { |
| return CompletableFutures.computeAsync(canceler -> { |
| return new ArrayList<>(); |
| }); |
| } |
| }); |
| |
| CompletableFuture<List<DocumentLink>> future = languageServer.getTextDocumentService().documentLink(new DocumentLinkParams(new TextDocumentIdentifier("test"))); |
| List<DocumentLink> list = future.get(TIMEOUT, TimeUnit.MILLISECONDS); |
| |
| Assert.assertTrue(list.isEmpty()); |
| } |
| |
| @Test public void testDocumentLink_02() throws Exception, ExecutionException { |
| LanguageServer languageServer = wrap(LanguageServer.class, new MockLanguageServer() { |
| @Override |
| public CompletableFuture<List<DocumentLink>> documentLink(DocumentLinkParams params) { |
| return CompletableFutures.computeAsync(canceler -> { |
| return null; |
| }); |
| } |
| }); |
| |
| CompletableFuture<List<DocumentLink>> future = languageServer.getTextDocumentService().documentLink(new DocumentLinkParams(new TextDocumentIdentifier("test"))); |
| List<DocumentLink> list = future.get(TIMEOUT, TimeUnit.MILLISECONDS); |
| |
| Assert.assertNull(list); |
| } |
| |
| @Test public void testDocumentResolve() throws Exception, ExecutionException { |
| LanguageServer languageServer = wrap(LanguageServer.class, new MockLanguageServer() { |
| @Override |
| public CompletableFuture<DocumentLink> documentLinkResolve(DocumentLink params) { |
| return CompletableFutures.computeAsync(canceler -> { |
| params.setTarget("resolved"); |
| return params; |
| }); |
| } |
| }); |
| |
| CompletableFuture<DocumentLink> future = languageServer.getTextDocumentService().documentLinkResolve( |
| new DocumentLink(new Range(new Position(0, 0), new Position(0, 0)), "unresolved") |
| ); |
| DocumentLink resolved = future.get(TIMEOUT, TimeUnit.MILLISECONDS); |
| |
| Assert.assertEquals("resolved", resolved.getTarget()); |
| } |
| |
| /** |
| * creates a proxy, delegating to a remote endpoint, forwarding to another remote endpoint, that delegates to an actual implementation. |
| * @param intf |
| * @param impl |
| * @return |
| * @throws IOException |
| */ |
| public <T> T wrap(Class<T> intf, T impl) { |
| PipedInputStream in1 = new PipedInputStream(); |
| PipedOutputStream out1 = new PipedOutputStream(); |
| Launcher<T> launcher1 = Launcher.createLauncher(impl, intf, in1, out1); |
| |
| PipedInputStream in2 = new PipedInputStream(); |
| PipedOutputStream out2 = new PipedOutputStream(); |
| Launcher<T> launcher2 = Launcher.createLauncher(new Object(), intf, in2, out2); |
| try { |
| in1.connect(out2); |
| in2.connect(out1); |
| } catch (IOException e) { |
| throw new IllegalStateException(e); |
| } |
| launcher1.startListening(); |
| launcher2.startListening(); |
| return launcher2.getRemoteProxy(); |
| } |
| } |