blob: 207e6080ee64a2499aaf47df0f5f9063b80028a4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2012 Tasktop Technologies 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
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Tasktop Technologies - initial API and implementation
* David Green - fix for bug 266693
* Abner Ballardo - fix for bug 288427
*******************************************************************************/
package org.eclipse.mylyn.tasks.tests.ui.editor;
import junit.framework.TestCase;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.mylyn.commons.workbench.browser.UrlHyperlink;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskUrlHyperlinkDetector;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
import org.eclipse.mylyn.tasks.ui.TasksUi;
/**
* @author Steffen Pingel
* @author David Green
*/
public class TaskUrlHyperlinkDetectorTest extends TestCase {
private TaskRepository repository;
@Override
protected void setUp() throws Exception {
repository = TaskTestUtil.createMockRepository();
}
protected IHyperlink[] detect(final String text, int start, int length) {
AbstractHyperlinkDetector detector = new TaskUrlHyperlinkDetector();
detector.setContext(new IAdaptable() {
@SuppressWarnings("rawtypes")
public Object getAdapter(Class adapter) {
return repository;
}
});
return detector.detectHyperlinks(new TextViewer() {
@Override
public IDocument getDocument() {
return new Document(text);
}
}, new Region(start, length), true);
}
public void testUrl() {
IHyperlink[] links = detect("http://foo", 0, 0);
assertNotNull(links);
assertEquals(1, links.length);
assertEquals("http://foo", ((UrlHyperlink) links[0]).getURLString());
}
public void testInvalidUrl() {
IHyperlink[] links = detect("abc", 0, 0);
assertNull(links);
links = detect("", 0, 0);
assertNull(links);
links = detect(").", 0, 0);
assertNull(links);
}
public void testParenthesis() {
IHyperlink[] links = detect("(http://foo)", 2, 0);
assertNotNull(links);
assertEquals(1, links.length);
assertEquals("http://foo", ((UrlHyperlink) links[0]).getURLString());
links = detect("( http://foo)", 2, 0);
assertNotNull(links);
assertEquals(1, links.length);
assertEquals("http://foo", ((UrlHyperlink) links[0]).getURLString());
links = detect("( http://foo).", 2, 0);
assertNotNull(links);
assertEquals(1, links.length);
assertEquals("http://foo", ((UrlHyperlink) links[0]).getURLString());
}
public void testClosingParenthesis() {
IHyperlink[] links = detect("http://foo?(bar)", 0, 0);
assertNotNull(links);
assertEquals(1, links.length);
assertEquals("http://foo?(bar)", ((UrlHyperlink) links[0]).getURLString());
links = detect("(http://foo?(bar))", 0, 18);
assertNotNull(links);
assertEquals(1, links.length);
assertEquals("http://foo?(bar)", ((UrlHyperlink) links[0]).getURLString());
links = detect("http://foo?((((bar).", 0, 0);
assertNotNull(links);
assertEquals(1, links.length);
assertEquals("http://foo?((((bar)", ((UrlHyperlink) links[0]).getURLString());
links = detect("http://foo?(bar))))))))", 0, 0);
assertNotNull(links);
assertEquals(1, links.length);
assertEquals("http://foo?(bar)", ((UrlHyperlink) links[0]).getURLString());
}
public void testDetectionUsingExtent() {
IHyperlink[] hyperlinks = detect("aa http://www.eclipse.org test", 0, 30);
assertNotNull(hyperlinks);
assertEquals(1, hyperlinks.length);
}
public void testDetectionMultipleLinks() {
String text = "aa http://www.eclipse.org test http://www.foo.bar/baz?one=two&three=four+five#six";
IHyperlink[] hyperlinks = detect(text, 0, text.length());
assertNotNull(hyperlinks);
assertEquals(2, hyperlinks.length);
assertEquals(new Region(3, 22), hyperlinks[0].getHyperlinkRegion());
assertEquals(new Region(31, 50), hyperlinks[1].getHyperlinkRegion());
}
public void testDetectionNegativeMatchOnTrailingPunctuation() {
String text = "aa http://www.eclipse.org) http://www.eclipse.org. http://www.eclipse.org,";
IHyperlink[] hyperlinks = detect(text, 0, text.length());
assertNotNull(hyperlinks);
assertEquals(3, hyperlinks.length);
assertEquals(new Region(3, 22), hyperlinks[0].getHyperlinkRegion());
assertEquals(new Region(27, 22), hyperlinks[1].getHyperlinkRegion());
assertEquals(new Region(51, 22), hyperlinks[2].getHyperlinkRegion());
}
public void testDetectionMultiplelinesClosingParenthesis() {
String text = "aa http://www.eclipse.org?foo((bar)\n\n)(http://www.eclipse.org)\nhttp://www.eclipse.org()";
IHyperlink[] hyperlinks = detect(text, 0, text.length());
assertNotNull(hyperlinks);
assertEquals(3, hyperlinks.length);
assertEquals(new Region(3, 32), hyperlinks[0].getHyperlinkRegion());
assertEquals(new Region(39, 22), hyperlinks[1].getHyperlinkRegion());
assertEquals(new Region(63, 24), hyperlinks[2].getHyperlinkRegion());
}
public void testDetectionMultiplelines() {
String text = "aa http://www.eclipse.org\n\nhttp://www.eclipse.org.\nhttp://www.eclipse.org,";
IHyperlink[] hyperlinks = detect(text, 0, text.length());
assertNotNull(hyperlinks);
assertEquals(3, hyperlinks.length);
assertEquals(new Region(3, 22), hyperlinks[0].getHyperlinkRegion());
assertEquals(new Region(27, 22), hyperlinks[1].getHyperlinkRegion());
assertEquals(new Region(51, 22), hyperlinks[2].getHyperlinkRegion());
}
public void testDetection() {
IHyperlink[] hyperlinks = detect("aa http://www.eclipse.org test", 20, 0);
assertNotNull(hyperlinks);
assertEquals(1, hyperlinks.length);
}
public void testDetection2() {
String text = "http://www.eclipse.org";
IHyperlink[] hyperlinks = detect(text, 0, text.length());
assertNotNull(hyperlinks);
assertEquals(1, hyperlinks.length);
assertEquals(new Region(0, 22), hyperlinks[0].getHyperlinkRegion());
}
public void testDetectionNoRepositoryRegularUrl() {
repository = null;
IHyperlink[] hyperlinks = detect("aa http://www.eclipse.org test", 4, 0);
assertNull(hyperlinks);
}
/**
* Tests hyperlink detector in mode outside of task editor.
*/
public void testDetectionNoRepositoryRepositoryUrl() {
repository = null;
TaskRepository repository1 = new TaskRepository(MockRepositoryConnector.CONNECTOR_KIND, "http://repo1.test/foo");
try {
TasksUi.getRepositoryManager().addRepository(repository1);
String text = "aa http://repo1.test/foo http://www.eclipse.org test";
IHyperlink[] hyperlinks = detect(text, 0, text.length());
assertNotNull(hyperlinks);
assertEquals(1, hyperlinks.length);
assertEquals(new Region(3, 21), hyperlinks[0].getHyperlinkRegion());
} finally {
TasksUiPlugin.getRepositoryManager().removeRepository(repository1);
}
}
/**
* Tests hyperlink detector in mode outside of task editor with multiple task URLs.
*/
public void testDetectionNoRepositoryMultipleRepositoryUrls() {
repository = null;
TaskRepository repository1 = new TaskRepository(MockRepositoryConnector.CONNECTOR_KIND, "http://repo1.test/foo");
TaskRepository repository2 = new TaskRepository(MockRepositoryConnector.CONNECTOR_KIND, "http://repo2.test");
try {
TasksUi.getRepositoryManager().addRepository(repository1);
TasksUi.getRepositoryManager().addRepository(repository2);
String text = "aa http://repo2.test http://repo1.test/foo http://repo1.test/bar http://www.eclipse.org test";
IHyperlink[] hyperlinks = detect(text, 0, text.length());
assertNotNull(hyperlinks);
assertEquals(2, hyperlinks.length);
} finally {
TasksUiPlugin.getRepositoryManager().removeRepository(repository1);
TasksUiPlugin.getRepositoryManager().removeRepository(repository2);
}
}
}