/*******************************************************************************
* Copyright (c) 2008, 2010 Symbian Software Systems 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:
* Andrew Ferguson (Symbian) - Initial implementation
*******************************************************************************/
package org.eclipse.cdt.ui.tests.text.doctools;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Assert;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.texteditor.AbstractTextEditor;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.cdt.ui.testplugin.Accessor;
import org.eclipse.cdt.ui.testplugin.EditorTestHelper;
import org.eclipse.cdt.ui.testplugin.ResourceTestHelper;
import org.eclipse.cdt.ui.tests.BaseUITestCase;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.text.doctools.DocCommentOwnerManager;
/**
*
*/
public class DocCommentHighlightingTest extends BaseUITestCase {
private static final DocCommentOwnerManager DCMAN= DocCommentOwnerManager.getInstance();
private static final String LINKED_FOLDER= "resources/docComments";
private static final String PROJECT= "DocCommentTests";
// ordered by occurrence
private static final int[] normal0= {114, 13};
private static final int[] comment1= {129, 18};
private static final int[] comment2= {149, 17};
private static final int[] comment3= {168, 16};
private static final int[] comment4= {184, 18};
private static final int[] comment5= {204, 19};
private static final int[] comment6= {223, 16};
private static final int[] comment7= {241, 17};
private static final int[] comment8= {258, 16};
private static final int[] comment9= {274, 17};
private static final int[] comment10= {293, 18};
private static final int[] snormal0= {315, 13};
private static final int[] scomment1= {328, 17};
private static final int[] scomment2= {345, 16};
private static final int[] scomment3= {361, 17};
private static final int[] scomment4= {378, 16};
private static final int[] scomment5= {394, 18};
private static final int[] comment11= {414, 18};
private static final int[] scomment6= {433, 16};
private static final int[] comment12= {449, 19};
private static final int[] scomment7= {469, 17};
private ICProject fCProject;
private final String fTestFilename= "/"+PROJECT+"/src/this.cpp";
private static SourceViewer fSourceViewer;
public static Test suite() {
return new TestSuite(DocCommentHighlightingTest.class);
}
public DocCommentHighlightingTest(String name) {
super(name);
}
@Override
protected void setUp() throws Exception {
super.setUp();
fCProject= EditorTestHelper.createCProject(PROJECT, LINKED_FOLDER);
CUIPlugin.getDefault().getPreferenceStore().setValue(PreferenceConstants.REMOVE_TRAILING_WHITESPACE, false);
AbstractTextEditor fEditor= (CEditor) EditorTestHelper.openInEditor(ResourceTestHelper.findFile(fTestFilename), true);
fSourceViewer= EditorTestHelper.getSourceViewer(fEditor);
// source positions depend on Windows line separator
adjustLineSeparator(fSourceViewer.getDocument(), "\r\n");
fEditor.doSave(new NullProgressMonitor());
assertTrue(EditorTestHelper.joinReconciler(fSourceViewer, 0, 10000, 100));
}
@Override
protected void tearDown () throws Exception {
EditorTestHelper.closeAllEditors();
if (fCProject != null)
CProjectHelper.delete(fCProject);
CUIPlugin.getDefault().getPreferenceStore().setToDefault(PreferenceConstants.REMOVE_TRAILING_WHITESPACE);
super.tearDown();
}
/**
* Make the document use the given line separator.
*
* @param document
* @param lineSeparator
*/
private void adjustLineSeparator(IDocument document, String lineSeparator) throws BadLocationException {
for (int i= 0; i < document.getNumberOfLines(); i++) {
String delimiter= document.getLineDelimiter(i);
if (delimiter != null && !delimiter.equals(lineSeparator)) {
IRegion lineRegion= document.getLineInformation(i);
document.replace(lineRegion.getOffset() + lineRegion.getLength(), delimiter.length(), lineSeparator);
}
}
}
protected List<Position> findRangesColored(RGB rgb) {
List<Position> result= new ArrayList<Position>();
IEditorPart p= get();
ISourceViewer vw= ((CEditor)p).getViewer();
Accessor a= new Accessor(vw, TextViewer.class);
StyledText st= (StyledText) a.get("fTextWidget");
StyleRange[] rgs= st.getStyleRanges();
for(int i=0; i<rgs.length; i++) {
if(rgs[i].foreground != null && rgs[i].foreground.getRGB().equals(rgb)) {
result.add(new Position(rgs[i].start, rgs[i].length));
}
}
return result;
}
protected IEditorPart get(){
IWorkbenchWindow window= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if(window!=null) {
if(window.getActivePage()!=null) {
IEditorReference[] es= window.getActivePage().getEditorReferences();
for(int i=0; i<es.length; i++) {
IEditorPart part= es[i].getEditor(false);
if(part != null)
return part;
}
}
}
return null;
}
private List<Position> mkPositions(int[][] raw) {
List<Position> result= new ArrayList<Position>();
for(int i=0; i<raw.length; i++) {
Assert.assertEquals(2, raw[i].length);
result.add(new Position(raw[i][0], raw[i][1]));
}
return result;
}
public void testDCOM_A() throws BadLocationException, InterruptedException {
DCMAN.setCommentOwner(fCProject.getProject(), DCMAN.getOwner("org.cdt.test.ownerA"), true);
runEventQueue(1000);
List<Position> expected= mkPositions(new int[][] {comment1, scomment1});
assertEquals(expected, findRangesColored(TestGenericTagConfiguration.DEFAULTRGB));
}
public void testDCOM_B() throws BadLocationException, InterruptedException {
DCMAN.setCommentOwner(fCProject.getProject(), DCMAN.getOwner("org.cdt.test.ownerB"), true);
runEventQueue(1000);
List<Position> expected= mkPositions(new int[][] {comment2, scomment2});
assertEquals(expected, findRangesColored(TestGenericTagConfiguration.DEFAULTRGB));
}
public void testDCOM_C() throws BadLocationException, InterruptedException {
DCMAN.setCommentOwner(fCProject.getProject(), DCMAN.getOwner("org.cdt.test.ownerC"), true);
runEventQueue(1000);
List<Position> expected= mkPositions(new int[][] {comment3, scomment3});
assertEquals(expected, findRangesColored(TestGenericTagConfiguration.DEFAULTRGB));
}
public void testDCOM_ABC() throws BadLocationException, InterruptedException {
DCMAN.setCommentOwner(fCProject.getProject(), DCMAN.getOwner("org.cdt.test.ownerABC"), true);
runEventQueue(1000);
List<Position> expected= mkPositions(new int[][] {comment1, comment2, comment3, scomment1, scomment2, scomment3});
assertEquals(expected, findRangesColored(TestGenericTagConfiguration.DEFAULTRGB));
}
public void testDCOM_BDFG() throws BadLocationException, InterruptedException {
DCMAN.setCommentOwner(fCProject.getProject(), DCMAN.getOwner("org.cdt.test.ownerBDFG"), true);
runEventQueue(1000);
List<Position> expected= mkPositions(new int[][] {comment2, comment4, comment6, comment7, comment8, scomment2});
assertEquals(expected, findRangesColored(TestGenericTagConfiguration.DEFAULTRGB));
}
public void testDCOM_PUNC() throws BadLocationException, InterruptedException {
DCMAN.setCommentOwner(fCProject.getProject(), DCMAN.getOwner("org.cdt.test.ownerPUNC"), true);
runEventQueue(1000);
List<Position> expected= mkPositions(new int[][] {comment9, comment10, scomment4, scomment5, comment11, comment12, scomment7});
assertEquals(expected, findRangesColored(TestGenericTagConfiguration.DEFAULTRGB));
}
}