/******************************************************************************
 * 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.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

import org.eclipse.lsp4j.InitializeParams;
import org.eclipse.lsp4j.InitializeResult;
import org.eclipse.lsp4j.jsonrpc.Endpoint;
import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
import org.eclipse.lsp4j.jsonrpc.RemoteEndpoint;
import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
import org.eclipse.lsp4j.jsonrpc.messages.Message;
import org.eclipse.lsp4j.jsonrpc.messages.RequestMessage;
import org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint;
import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
import org.eclipse.lsp4j.services.LanguageServer;
import org.eclipse.lsp4j.services.TextDocumentService;
import org.eclipse.lsp4j.services.WorkspaceService;
import org.eclipse.lsp4j.test.LogMessageAccumulator;
import org.junit.Assert;
import org.junit.Test;

public class NullResponseTest implements LanguageServer {
	
	private Object shutdownReturn;

	@Test
	public void testNullResponse() throws InterruptedException, ExecutionException {
		LogMessageAccumulator logMessages = new LogMessageAccumulator();
		try {
			logMessages.registerTo(GenericEndpoint.class);
			
			Endpoint endpoint = ServiceEndpoints.toEndpoint(this);
			Map<String, JsonRpcMethod> methods = ServiceEndpoints.getSupportedMethods(LanguageServer.class);
			MessageJsonHandler handler = new MessageJsonHandler(methods);
			List<Message> msgs = new ArrayList<>();
			MessageConsumer consumer = (message) -> {
				msgs.add(message);
			};
			RemoteEndpoint re = new RemoteEndpoint(consumer, endpoint);
			
			RequestMessage request = new RequestMessage();
			request.setId("1");
			request.setMethod("shutdown");
			re.consume(request);
			Assert.assertEquals("{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"result\":null}", handler.serialize(msgs.get(0)));
			msgs.clear();
			shutdownReturn = new Object();
			re.consume(request);
			Assert.assertEquals("{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"result\":{}}", handler.serialize(msgs.get(0)));
		} finally {
			logMessages.unregister();
		}
	}

	@Override
	public CompletableFuture<InitializeResult> initialize(InitializeParams params) {
		throw new UnsupportedOperationException();
	}

	@Override
	public CompletableFuture<Object> shutdown() {
		return CompletableFuture.completedFuture(shutdownReturn);
	}

	@Override
	public void exit() {
		throw new UnsupportedOperationException();
	}

	@Override
	public TextDocumentService getTextDocumentService() {
		return null;
	}

	@Override
	public WorkspaceService getWorkspaceService() {
		return null;
	}

}
