blob: a9bfee705ce101d643788e03f28ffc68908bc16e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 SAP SE 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:
* SAP SE - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.debug.tests.console;
import static org.junit.Assert.assertArrayEquals;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.internal.debug.ui.console.JavaStackTraceConsole;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.BadPositionCategoryException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.Position;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.internal.console.ConsoleHyperlinkPosition;
/**
* Tests {@link JavaStackTraceConsole}
*/
public class JavaStackTraceConsoleTest extends AbstractDebugTest {
private JavaStackTraceConsole fConsole;
public JavaStackTraceConsoleTest(String name) {
super(name);
}
@Override
public void setUp() throws Exception {
super.setUp();
IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager();
fConsole = new JavaStackTraceConsole();
consoleManager.addConsoles(new IConsole[] { fConsole });
}
@Override
protected void tearDown() throws Exception {
IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager();
consoleManager.removeConsoles(new IConsole[] { fConsole });
super.tearDown();
}
public void testHyperlinkMatchSignatureSimple() throws Exception {
consoleDocumentWithText("at foo.bar.Type.method1(Type.java:1)");
String[] matchTexts = linkTextsAtPositions(24);
assertArrayEquals(allLinks(), new String[] { "Type.java:1" }, matchTexts);
}
public void testHyperlinkMatchSignatureExtended() throws Exception {
consoleDocumentWithText("at foo.bar.Type.method1(IILjava/lang/String;)V(Type.java:1)");
String[] matchTexts = linkTextsAtPositions(47);
assertArrayEquals(allLinks(), new String[] { "Type.java:1" }, matchTexts);
}
public void testHyperlinkMatchMultiple() throws Exception {
consoleDocumentWithText("at foo.bar.Type.method2(Type.java:2)\n" //
+ "at foo.bar.Type.method1(Type.java:1)");
String[] matchTexts = linkTextsAtPositions(24, 61);
assertArrayEquals(allLinks(), new String[] { "Type.java:2", "Type.java:1" }, matchTexts);
}
public void testHyperlinkMatchInvalidLine() throws Exception {
consoleDocumentWithText("at foo.bar.Type.method1(Type.java:fff)");
String[] matchTexts = linkTextsAtPositions(24);
assertArrayEquals(allLinks(), new String[] { "Type.java:fff" }, matchTexts);
}
public void testHyperlinkNoMatch() throws Exception {
consoleDocumentWithText("at foo.bar.Type.method1(foo.bar.Type.java:42)");
Position[] positions = allLinkPositions();
assertArrayEquals("Expected no hyperlinks for invalid type name", new Position[0], positions);
}
private IDocument consoleDocumentWithText(String text) throws InterruptedException {
IDocument document = fConsole.getDocument();
document.set(text);
// wait for document being parsed and hyperlinks created
Job.getJobManager().join(fConsole, null);
return document;
}
private String[] linkTextsAtPositions(int... offsets) throws BadLocationException {
IDocument document = fConsole.getDocument();
List<String> texts = new ArrayList<String>(offsets.length);
List<Position> positions = linkPositions(offsets);
for (Position pos : positions) {
String matchText = document.get(pos.getOffset(), pos.getLength());
texts.add(matchText);
}
return texts.toArray(new String[texts.size()]);
}
private List<Position> linkPositions(int... offsets) {
List<Position> filteredPositions = new ArrayList<Position>(offsets.length);
for (Position position : allLinkPositions()) {
for (int offset : offsets) {
if (offset >= position.getOffset() && offset <= (position.getOffset() + position.getLength())) {
filteredPositions.add(position);
break;
}
}
}
return filteredPositions;
}
private Position[] allLinkPositions() {
try {
return fConsole.getDocument().getPositions(ConsoleHyperlinkPosition.HYPER_LINK_CATEGORY);
}
catch (BadPositionCategoryException ex) {
// no hyperlinks
}
return new Position[0];
}
private String allLinks() {
return Arrays.toString(allLinkPositions());
}
}