blob: 499e76b365dc12bd67af4c6f8d45a341251f302c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 Patrick Hofer
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Patrick Hofer - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.ui.tests;
import java.io.File;
import java.util.Iterator;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.ui.testplugin.EditorTestHelper;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ISynchronizable;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.ui.PartInitException;
/**
* Base class for tests. If you want to use outside of this plugin, you need
* to override {@link #getPlugin()} method and maybe {@link #getSourcePrefix()}
* method to get source directory for the tests,
* default is "src". To make it read comment from java class, you need to
* include this source directory (with test java files) into the build bundle.
*/
public class AnnotationTestCase extends UITestCaseWithProject {
private IAnnotationModel fAnnotationModel;
private Object fAnnotationModelLockObject;
protected Annotation[] annotations;
private CEditor fEditor;
protected String testedAnnotationId = Annotation.TYPE_UNKNOWN;
@Override
protected void setUp() throws Exception {
super.setUp();
}
public boolean checkAnnotationType(Annotation a) {
return true;
}
public Annotation checkAnnotationLine(int i) {
return checkAnnotationLine(currentFile, i);
}
public void checkAnnotationLines(Object... args) {
for (Object i : args) {
checkAnnotationLine((Integer) i);
}
}
public Annotation checkAnnotationLine(int i, String annotationId) {
return checkAnnotationLine(currentFile, i, annotationId);
}
public Annotation checkAnnotationLine(File file, int expectedLine) {
return checkAnnotationLine(file, expectedLine, null);
}
public Annotation checkAnnotationLine(File file, int expectedLine, String annotationId) {
assertTrue(annotations != null);
assertTrue("No annotations found but should", annotations.length > 0); //$NON-NLS-1$
int line = 0;
Annotation a = null;
for (Annotation annotation : annotations) {
line = getLine(annotation);
if (line == expectedLine && (annotationId == null || annotationId.equals(annotation.getType()))) {
a = annotation;
break;
}
}
assertNotNull(a);
if (a != null) {
assertEquals(expectedLine, line);
assertTrue(checkAnnotationType(a));
}
return a;
}
private int getLine(Annotation annotation) {
int line = 0;
IDocument document = fEditor.getDocumentProvider().getDocument(fEditor.getEditorInput());
Position position = fAnnotationModel.getPosition(annotation);
try {
line = document.getLineOfOffset(position.getOffset()) + 1;
} catch (BadLocationException e) {
fail(e.getMessage());
}
return line;
}
public void checkNoAnnotations() {
if (annotations == null || annotations.length == 0) {
// all good
} else {
Annotation m = annotations[0];
fail("Found " + annotations.length + " annotation but should not.");
}
}
public void runOnProject() {
try {
indexFiles();
} catch (CoreException | InterruptedException e) {
fail(e.getMessage());
}
runInEditor();
}
public void loadCodeAndRun(String code) {
loadCode(code);
runInEditor();
}
public void loadCodeAndRunCpp(String code) {
loadCode(code, true);
runInEditor();
}
protected void runInEditor() {
try {
annotations = null;
fEditor = openCEditor(currentIFile);
assertNotNull(fEditor);
EditorTestHelper.joinReconciler(EditorTestHelper.getSourceViewer(fEditor), 100, 1000000, 1000);
fAnnotationModel = fEditor.getDocumentProvider().getAnnotationModel(fEditor.getEditorInput());
fAnnotationModelLockObject = getLockObject(fAnnotationModel);
synchronized (fAnnotationModelLockObject) {
for (Iterator<Annotation> iter = fAnnotationModel.getAnnotationIterator(); iter.hasNext();) {
Annotation anotation = iter.next();
if (anotation != null && (testedAnnotationId.equals(anotation.getType()))) {
annotations = ArrayUtil.append(Annotation.class, annotations, anotation);
}
}
}
annotations = ArrayUtil.trim(Annotation.class, annotations);
} catch (Exception e) {
fail(e.getMessage());
}
}
private Object getLockObject(IAnnotationModel annotationModel) {
if (annotationModel instanceof ISynchronizable) {
Object lock = ((ISynchronizable) annotationModel).getLockObject();
if (lock != null)
return lock;
}
return annotationModel;
}
private CEditor openCEditor(IFile file) {
assertNotNull(file);
assertTrue(file.exists());
try {
return (CEditor) EditorTestHelper.openInEditor(file, true);
} catch (PartInitException e) {
fail();
return null;
}
}
}