blob: d39051866890d00ed8edebe851b4a3e54e3a0b7f [file] [log] [blame]
/**
* Copyright (c) 2018 Angelo ZERR.
*
* 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:
* Angelo Zerr <angelo.zerr@gmail.com> - [generic editor] Default Code folding for generic editor should use IndentFoldingStrategy - Bug 520659
*/
package org.eclipse.ui.genericeditor.tests;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Collections;
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.core.commands.Command;
import org.eclipse.jface.text.ITextViewer;
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.source.projection.ProjectionAnnotation;
import org.eclipse.jface.text.source.projection.ProjectionViewer;
import org.eclipse.jface.text.tests.util.DisplayHelper;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.genericeditor.tests.contributions.EnabledPropertyTester;
import org.eclipse.ui.editors.text.IFoldingCommandIds;
public class FoldingTest extends AbstratGenericEditorTest {
@Override
protected void createAndOpenFile() throws Exception {
//leave editor creation to individual tests
}
@Test
public void testDefaultIndentFoldingOneFold() throws Exception {
createAndOpenFile("bar.xml", "<a>\n b</a>");
checkFolding(pos(0, 10));
}
@Test
public void testDefaultIndentFoldingTwoFold() throws Exception {
createAndOpenFile("bar.xml", "<a>\n <b>\n c\n </b>\n</a>");
checkFolding(pos(0, 19), pos(4, 9));
}
@Test
public void testCustomFoldingReconciler() throws Exception {
createAndOpenFile("bar.txt", "<a>\n <b>\n c\n </b>\n</a>\n");
checkFolding(pos(0, 24), pos(5, 14));
}
@Test
public void testEnabledWhenCustomFoldingReconciler() throws Exception {
EnabledPropertyTester.setEnabled(true);
createAndOpenFile("enabledWhen.txt", "<a>\n <b>\n c\n </b>\n</a>\n");
checkFolding(pos(0, 24), pos(5, 14));
cleanFileAndEditor();
EnabledPropertyTester.setEnabled(false);
createAndOpenFile("enabledWhen.txt", "<a>\n <b>\n c\n </b>\n</a>\n");
checkFolding();
}
private static Position pos(int offset, int length) {
return new Position(offset, length);
}
private void checkFolding(Position... expectedPositions) {
if (expectedPositions == null) {
expectedPositions= new Position[0];
}
waitForAnnotations(expectedPositions.length);
List<Annotation> folderAnnotations= getAnnotationsFromAnnotationModel();
Assert.assertEquals(expectedPositions.length, folderAnnotations.size());
List<Position> actualPositions= new ArrayList<>(expectedPositions.length);
for (int i= 0; i < expectedPositions.length; i++) {
Annotation folderAnnotation= folderAnnotations.get(i);
Position actualPosition= getProjectionAnnotationModel().getPosition(folderAnnotation);
actualPositions.add(actualPosition);
}
// Sort actual positions by offset
Collections.sort(actualPositions, (p1, p2) -> p1.offset - p2.offset);
Assert.assertArrayEquals(expectedPositions, actualPositions.toArray());
}
private IAnnotationModel getProjectionAnnotationModel() {
ProjectionViewer dp= (ProjectionViewer) editor.getAdapter(ITextViewer.class);
IAnnotationModel am= dp.getProjectionAnnotationModel();
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= getProjectionAnnotationModel().getAnnotationIterator();
while (annotationIterator.hasNext()) {
Annotation ann= annotationIterator.next();
if (ann.getType().equals(ProjectionAnnotation.TYPE)) {
annotationList.add(ann);
}
}
return annotationList;
}
@Test
public void testFoldingCommandsEnabled() throws Exception {
createAndOpenFile("bar.xml", "<a>\n b</a>");
ICommandService commandService = editor.getEditorSite().getService(ICommandService.class);
Command collapseAllCommand = commandService.getCommand(IFoldingCommandIds.FOLDING_COLLAPSE_ALL);
assertTrue(collapseAllCommand.isEnabled() && collapseAllCommand.isHandled());
}
}