blob: 802640626a8261efd7a36162c2316f166130f3bf [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017, 2018 Red Hat Inc. 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:
* - Lucas Bullen (Red Hat Inc.)
*******************************************************************************/
package org.eclipse.ui.genericeditor.tests;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import org.eclipse.swt.widgets.Display;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.jface.text.tests.util.DisplayHelper;
import org.eclipse.ui.texteditor.IDocumentProvider;
public class HighlightTest extends AbstratGenericEditorTest {
private static final String ANNOTATION_TYPE= "org.eclipse.ui.genericeditor.text"; //$NON-NLS-1$
private static final String EDITOR_TEXT= "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" +
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" +
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
@Override
protected void createAndOpenFile() throws Exception {
//leave editor creation to individual tests
}
@Test
public void testCustomHighlightReconciler() throws Exception {
createAndOpenFile("bar.txt", "bar 'bar'");
checkHighlightForCaretOffset(0, "'bar'", 1);
}
@Test
public void testHighlightWordAtDocumentStart() throws Exception {
createAndOpenFile("foo.txt", EDITOR_TEXT);
checkHighlightForCaretOffset(0, "Lorem", 3);
}
@Test
public void testHighlightWordWithNonLetterParts() throws Exception {
String complexWord= "dolor_sit123amet45";
String editorText= EDITOR_TEXT.replaceFirst("dolor sit amet", complexWord).replaceFirst("dolor sit amet", complexWord);
createAndOpenFile("foo.txt", editorText);
checkHighlightForCaretOffset(editorText.indexOf("dolor") + 3, complexWord, 2);
checkHighlightForCaretOffset(editorText.indexOf("_sit") + 3, complexWord, 2);
checkHighlightForCaretOffset(editorText.indexOf("123") + 1, complexWord, 2);
checkHighlightForCaretOffset(editorText.indexOf("amet") + 1, complexWord, 2);
}
@Test
public void testHighlightSimpleWordNotMatchingWordPart() throws Exception {
String complexWord= "dolor_sit123amet45";
String editorText= EDITOR_TEXT.replaceFirst("dolor sit amet", complexWord);
createAndOpenFile("foo.txt", editorText);
checkHighlightForCaretOffset(editorText.indexOf("dolor ") + 1, "dolor", 2);
checkHighlightForCaretOffset(editorText.indexOf(" sit") + 1, "sit", 2);
checkHighlightForCaretOffset(editorText.indexOf(" amet") + 1, "amet", 2);
}
@Test
public void testHighlightNonAsciiCharacters() throws Exception {
String complexWord= "sit\u00f6\u00f6amet";
String editorText= EDITOR_TEXT.replaceFirst("sit amet", complexWord).replaceFirst("sit amet", complexWord);
createAndOpenFile("foo.txt", editorText);
checkHighlightForCaretOffset(editorText.indexOf("sit") + 1, complexWord, 2);
checkHighlightForCaretOffset(editorText.indexOf("\u00f6") + 1, complexWord, 2);
checkHighlightForCaretOffset(editorText.indexOf("amet") + 1, complexWord, 2);
}
private void checkHighlightForCaretOffset(int pos, String expectedHighlight, int expectedHighlightCount) throws Exception {
clearAnnotations();
editor.selectAndReveal(pos, 0);
waitForAnnotations(expectedHighlightCount);
List<Annotation> annotations= getAnnotationsFromAnnotationModel();
IAnnotationModel annotationModel= getAnnotationModel();
IDocument document= editor.getDocumentProvider().getDocument(editor.getEditorInput());
for (int i= 0; i < annotations.size(); i++) {
Annotation annotation= annotations.get(i);
Position position= annotationModel.getPosition(annotation);
String highlight= document.get(position.offset, position.length);
assertEquals("Wrong highlight " + i + " at position " + position.offset, expectedHighlight, highlight);
}
Assert.assertEquals("Wrong number of highlights", expectedHighlightCount, annotations.size());
}
private void clearAnnotations() {
editor.selectAndReveal(0, 0);
IAnnotationModel annotationModel= getAnnotationModel();
List<Annotation> annotations= getAnnotationsFromAnnotationModel();
for (Annotation annotation : annotations) {
annotationModel.removeAnnotation(annotation);
}
}
private IAnnotationModel getAnnotationModel() {
IDocumentProvider dp= editor.getDocumentProvider();
IAnnotationModel am= dp.getAnnotationModel(editor.getEditorInput());
return am;
}
private void waitForAnnotations(int count) {
new DisplayHelper() {
@Override
protected boolean condition() {
return getAnnotationsFromAnnotationModel().size() == count;
}
}.waitForCondition(Display.getDefault(), 2000);
}
private List<Annotation> getAnnotationsFromAnnotationModel() {
List<Annotation> annotationList= new ArrayList<>();
Iterator<Annotation> annotationIterator= getAnnotationModel().getAnnotationIterator();
while (annotationIterator.hasNext()) {
Annotation ann= annotationIterator.next();
if (ann.getType().indexOf(ANNOTATION_TYPE) > -1) {
annotationList.add(ann);
}
}
return annotationList;
}
}