/*******************************************************************************
 * Copyright (c) 2020 Pivotal Inc. and others.
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *  Martin Lippert (Pivotal Inc.) - initial implementation
 *******************************************************************************/
package org.eclipse.lsp4e.test.declaration;

import static org.junit.Assert.assertEquals;

import org.eclipse.lsp4e.operations.declaration.LSBasedHyperlink;
import org.eclipse.lsp4j.Location;
import org.eclipse.lsp4j.LocationLink;
import org.junit.Test;

public class LSBasedHyperlinkTest {

	@Test
	public void testHyperlinkLabelNoLocation() {
		Location location = new Location();
		LSBasedHyperlink hyperlink = new LSBasedHyperlink(location, null);
		
		assertEquals("Open Declaration", hyperlink.getHyperlinkText());
	}

	@Test
	public void testHyperlinkLabelForFileLocation() {
		Location location = new Location();
		location.setUri("file:///Users/someuser/testfile");
		LSBasedHyperlink hyperlink = new LSBasedHyperlink(location, null);
		
		assertEquals("Open Declaration - /Users/someuser/testfile", hyperlink.getHyperlinkText());
	}

	@Test
	public void testHyperlinkLabelForFileLocationLink() {
		LocationLink location = new LocationLink();
		location.setTargetUri("file:///Users/someuser/testfile");
		LSBasedHyperlink hyperlink = new LSBasedHyperlink(location, null);
		
		assertEquals("Open Declaration - /Users/someuser/testfile", hyperlink.getHyperlinkText());
	}

	@Test
	public void testHyperlinkLabelForIntroBasedLocationWithoutLabel() {
		Location location = new Location();
		location.setUri("http://org.eclipse.ui.intro/execute?command=mycommand%28bindingKey%3DLorg%2Ftest%2Fmvctest%2FMyComponent%3B%2CprojectName%3Dmvctest%29");
		LSBasedHyperlink hyperlink = new LSBasedHyperlink(location, null);
		
		assertEquals("Open Declaration", hyperlink.getHyperlinkText());
	}

	@Test
	public void testHyperlinkLabelForIntroBasedLocationLinkWithLabel() {
		LocationLink location = new LocationLink();
		location.setTargetUri("http://org.eclipse.ui.intro/execute?command=org.springframework.tooling.ls.eclipse.commons.commands.OpenJavaElementInEditor%28bindingKey%3DLorg%2Ftest%2Fmvctest%2FMyComponent%3B%2CprojectName%3Dmvctest%29&label=MyComponent+-+org.test.mvctest");
		LSBasedHyperlink hyperlink = new LSBasedHyperlink(location, null);
		
		assertEquals("Open Declaration - MyComponent - org.test.mvctest", hyperlink.getHyperlinkText());
	}

	@Test
	public void testHyperlinkLabelForRandomURLLocation() {
		Location location = new Location();
		location.setUri("http://eclipse.org");
		LSBasedHyperlink hyperlink = new LSBasedHyperlink(location, null);
		
		assertEquals("Open Declaration - http://eclipse.org", hyperlink.getHyperlinkText());
	}

	@Test
	public void testHyperlinkLabelForRandomURLLocationLink() {
		LocationLink location = new LocationLink();
		location.setTargetUri("http://eclipse.org");
		LSBasedHyperlink hyperlink = new LSBasedHyperlink(location, null);
		
		assertEquals("Open Declaration - http://eclipse.org", hyperlink.getHyperlinkText());
	}

}
