/******************************************************************************* * Copyright (c) 2012 Tasktop Technologies and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Tasktop Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.tasks.tests.ui; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import junit.framework.TestCase; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.mylyn.internal.tasks.ui.editors.MultipleTaskHyperlinkDetector; import org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector; import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnectorUi; import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; import org.eclipse.mylyn.tasks.ui.AbstractTaskHyperlinkDetector; import org.eclipse.mylyn.tasks.ui.TaskHyperlink; import org.eclipse.mylyn.tasks.ui.TasksUi; /** * @author Sam Davis * @author Steffen Pingel */ public class MultipleTaskHyperlinkDetectorTest extends TestCase { protected MockRepositoryConnectorUi connectorUi1; protected MockRepositoryConnectorUi connectorUi2; protected TaskRepository repository1a; protected TaskRepository repository1b; protected TaskRepository repository2; @Override protected void setUp() throws Exception { // define 2 repositories using "test xxx" as task id repository1a = new TaskRepository(MockRepositoryConnector.CONNECTOR_KIND, MockRepositoryConnector.REPOSITORY_URL + "1a"); repository1b = new TaskRepository(MockRepositoryConnector.CONNECTOR_KIND, MockRepositoryConnector.REPOSITORY_URL + "1b"); connectorUi1 = new MockRepositoryConnectorUi() { private final Pattern HYPERLINK_PATTERN = Pattern.compile("(test \\d+)"); @Override public IHyperlink[] findHyperlinks(TaskRepository repository, String text, int index, int textOffset) { List<IHyperlink> links = new ArrayList<IHyperlink>(); Matcher m = HYPERLINK_PATTERN.matcher(text); while (m.find()) { links.add(new TaskHyperlink(new Region(textOffset + m.start(), m.end() - m.start()), repository, m.group())); } return links.toArray(new IHyperlink[0]); }; }; // define 1 repository using "xxx" as task id repository2 = new TaskRepository(MockRepositoryConnector.CONNECTOR_KIND, MockRepositoryConnector.REPOSITORY_URL + "2"); connectorUi2 = new MockRepositoryConnectorUi(); TasksUi.getRepositoryManager().addRepository(repository1a); TasksUi.getRepositoryManager().addRepository(repository1b); TasksUi.getRepositoryManager().addRepository(repository2); } protected IHyperlink[] detect(final String text, int start, int length, TaskRepository textViewerRepository) { AbstractTaskHyperlinkDetector detector = createHyperlinkDetector(textViewerRepository); return detector.detectHyperlinks(new MockTextViewer(text), new Region(start, length), true); } protected AbstractTaskHyperlinkDetector createHyperlinkDetector(final TaskRepository textViewerRepository) { TaskHyperlinkDetector detector = new MultipleTaskHyperlinkDetector() { @Override protected AbstractRepositoryConnectorUi getConnectorUi(TaskRepository repository) { if (repository.equals(repository1a) || repository.equals(repository1b)) { return connectorUi1; } else if (repository.equals(repository2)) { return connectorUi2; } return super.getConnectorUi(repository); } @Override protected TaskRepository getTaskRepository(ITextViewer textViewer) { return textViewerRepository; } }; return detector; } public void testSingleRepositoryMatches() { IHyperlink[] links = detect("test 123 test 456 test 789", 9, 15, repository2); assertNotNull(links); assertEquals(2, links.length); assertEquals(new Region(14, 3), links[0].getHyperlinkRegion()); assertEquals(new Region(23, 1), links[1].getHyperlinkRegion()); assertEquals(repository2, ((TaskHyperlink) links[0]).getRepository()); } public void testMultipleRepositoriesMatch() { IHyperlink[] links = detect("test 123 test 456 test 789", 9, 15, repository1a); assertNotNull(links); assertEquals(4, links.length); assertEquals(new Region(9, 8), links[0].getHyperlinkRegion()); assertEquals(new Region(9, 8), links[2].getHyperlinkRegion()); assertEquals(Arrays.asList(repository1a, repository1b), Arrays.asList(((TaskHyperlink) links[0]).getRepository(), ((TaskHyperlink) links[2]).getRepository())); assertEquals(new Region(18, 6), links[1].getHyperlinkRegion()); assertEquals(new Region(18, 6), links[3].getHyperlinkRegion()); assertEquals(Arrays.asList(repository1a, repository1b), Arrays.asList(((TaskHyperlink) links[1]).getRepository(), ((TaskHyperlink) links[3]).getRepository())); } }