Skip to content

Commit

Permalink
Added Test verifying regions
Browse files Browse the repository at this point in the history
  • Loading branch information
jakub-suliga committed Jan 29, 2025
1 parent 4670555 commit c69530a
Show file tree
Hide file tree
Showing 7 changed files with 774 additions and 125 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
*******************************************************************************/
package org.eclipse.jdt.text.tests.folding;


import java.util.List;

import org.junit.After;
Expand All @@ -25,14 +24,19 @@

import org.eclipse.core.runtime.CoreException;

import org.eclipse.jface.preference.IPreferenceStore;

import org.eclipse.jface.text.IRegion;

import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;

import org.eclipse.jdt.ui.PreferenceConstants;
import org.eclipse.jdt.ui.tests.core.rules.ProjectTestSetup;

import org.eclipse.jdt.internal.ui.JavaPlugin;

public class FoldingTest {
@Rule
public ProjectTestSetup projectSetup= new ProjectTestSetup();
Expand All @@ -51,7 +55,9 @@ public void setUp() throws CoreException {
sourceFolder= JavaProjectHelper.addSourceContainer(jProject, "src");
}
packageFragment= sourceFolder.createPackageFragment("org.example.test", false, null);
}
IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
store.setValue(PreferenceConstants.EDITOR_NEW_FOLDING_ENABLED, true);
}

@After
public void tearDown() throws CoreException {
Expand Down Expand Up @@ -229,21 +235,22 @@ class h {
*
*/
void b() { //here should be an annotation
/* //here should NOT be an annotation
/* //here should be an annotation
*
*/
int a;
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 5);
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 6);

List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 1, 3); // 1. Javadoc
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 4, 6); // 2. Javadoc
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 7, 9); // 3. Javadoc
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 12, 14); // 4. Javadoc
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 15, 19); // Methode b()
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 16, 18); // 5. Javadoc
}

@Test
Expand Down Expand Up @@ -276,4 +283,219 @@ void a() {
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 3); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 4, 5); // 2. Method
}

@Test
public void testIfStatementFolding() throws Exception {
String str= """
package org.example.test;
public class D {
void x() { //here should be an annotation
if (true) { //here should be an annotation
}
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 4); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 3); // if
}

@Test
public void testTryStatementFolding() throws Exception {
String str= """
package org.example.test;
public class E {
void x() { //here should be an annotation
try { //here should be an annotation
} catch (Exception e) { //here should be an annotation
}
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 3);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 7); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 4); // try
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 5, 6); // catch
}

@Test
public void testWhileStatementFolding() throws Exception {
String str= """
package org.example.test;
public class F {
void x() { //here should be an annotation
while (true) { //here should be an annotation
}
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 4); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 3); // while
}

@Test
public void testForStatementFolding() throws Exception {
String str= """
package org.example.test;
public class G {
void x() { //here should be an annotation
for(int i=0;i<1;i++){ //here should be an annotation
}
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 4); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 3); // for
}

@Test
public void testEnhancedForStatementFolding() throws Exception {
String str= """
package org.example.test;
public class H {
void x() { //here should be an annotation
for(String s: new String[0]){ //here should be an annotation
}
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 4); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 3); // for
}

@Test
public void testDoStatementFolding() throws Exception {
String str= """
package org.example.test;
public class I {
void x() { //here should be an annotation
do { //here should be an annotation
} while(false);
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 5); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 4); // do
}

@Test
public void testSynchronizedStatementFolding() throws Exception {
String str= """
package org.example.test;
public class K {
void x() { //here should be an annotation
synchronized(this) { //here should be an annotation
}
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 4); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 3); // synchronized
}

@Test
public void testLambdaExpressionFolding() throws Exception {
String str= """
package org.example.test;
import java.util.function.Supplier;
public class L {
void x() { //here should be an annotation
Supplier<String> s = () -> { //here should be an annotation
return "";
};
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 6); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 4, 5); // Supplier
}

@Test
public void testAnonymousClassDeclarationFolding() throws Exception {
String str= """
package org.example.test;
public class M {
Object o = new Object(){ //here should be an annotation
void y() { //here should be an annotation
}
};
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 5); // Object
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 4); // Method
}

@Test
public void testEnumDeclarationFolding() throws Exception {
String str= """
package org.example.test;
public enum N { //here should be an annotation
A,
B
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 1);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 1, 3); // enum
}

@Test
public void testInitializerFolding() throws Exception {
String str= """
package org.example.test;
public class O {
static { //here should be an annotation
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 1);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 2); // static
}

@Test
public void testNestedFolding() throws Exception {
String str= """
package org.example.test;
public class P {
void x() { //here should be an annotation
if (true) { //here should be an annotation
for(int i=0;i<1;i++){ //here should be an annotation
while(true) { //here should be an annotation
do { //here should be an annotation
} while(false);
}
}
}
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 5);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 10); // method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 9); // if
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 4, 8); // for
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 5, 7); // while
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 6, 6); // do
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,12 +79,14 @@ public static void assertContainsRegionUsingStartAndEndLine(List<IRegion> projec
", actual regions: " + projectionRanges
);
}

private static int getLengthIfNotFound(String input, int startLineEnd) {
if (startLineEnd == -1) {
startLineEnd= input.length();
}
return startLineEnd;
}

private static int findLineStartIndex(String input, int lineNumber) {
int currentInputIndex= 0;
for (int i= 0; i < lineNumber; i++) {
Expand All @@ -95,6 +97,7 @@ private static int findLineStartIndex(String input, int lineNumber) {
}
return currentInputIndex;
}

private static int findNextLineStart(String input, int currentInputIndex) {
return input.indexOf('\n', currentInputIndex + 1);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;

import org.eclipse.jface.preference.IPreferenceStore;
Expand Down Expand Up @@ -75,7 +76,7 @@ private OverlayKey[] createKeys() {
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_METHODS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_IMPORTS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_HEADERS));

overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_NEW_FOLDING_ENABLED));
return overlayKeys.toArray(new OverlayKey[overlayKeys.size()]);
}

Expand All @@ -88,20 +89,36 @@ public Control createControl(Composite composite) {
fOverlayStore.start();

Composite inner= new Composite(composite, SWT.NONE);
GridLayout layout= new GridLayout(1, true);
layout.verticalSpacing= 3;
GridLayout layout= new GridLayout(1, false);
layout.verticalSpacing= 10;
layout.marginWidth= 0;
layout.marginHeight= 0;
inner.setLayout(layout);

Label label= new Label(inner, SWT.LEFT);
label.setText(FoldingMessages.DefaultJavaFoldingPreferenceBlock_title);

addCheckBox(inner, FoldingMessages.DefaultJavaFoldingPreferenceBlock_comments, PreferenceConstants.EDITOR_FOLDING_JAVADOC, 0);
addCheckBox(inner, FoldingMessages.DefaultJavaFoldingPreferenceBlock_headers, PreferenceConstants.EDITOR_FOLDING_HEADERS, 0);
addCheckBox(inner, FoldingMessages.DefaultJavaFoldingPreferenceBlock_innerTypes, PreferenceConstants.EDITOR_FOLDING_INNERTYPES, 0);
addCheckBox(inner, FoldingMessages.DefaultJavaFoldingPreferenceBlock_methods, PreferenceConstants.EDITOR_FOLDING_METHODS, 0);
addCheckBox(inner, FoldingMessages.DefaultJavaFoldingPreferenceBlock_imports, PreferenceConstants.EDITOR_FOLDING_IMPORTS, 0);

Group initialFoldGroup= new Group(inner, SWT.NONE);
GridLayout initialFoldLayout= new GridLayout(1, false);
initialFoldLayout.marginWidth= 10;
initialFoldLayout.marginHeight= 10;
initialFoldGroup.setLayout(initialFoldLayout);
initialFoldGroup.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
initialFoldGroup.setText(FoldingMessages.DefaultJavaFoldingPreferenceBlock_title);

addCheckBox(initialFoldGroup, FoldingMessages.DefaultJavaFoldingPreferenceBlock_comments, PreferenceConstants.EDITOR_FOLDING_JAVADOC, 0);
addCheckBox(initialFoldGroup, FoldingMessages.DefaultJavaFoldingPreferenceBlock_headers, PreferenceConstants.EDITOR_FOLDING_HEADERS, 0);
addCheckBox(initialFoldGroup, FoldingMessages.DefaultJavaFoldingPreferenceBlock_innerTypes, PreferenceConstants.EDITOR_FOLDING_INNERTYPES, 0);
addCheckBox(initialFoldGroup, FoldingMessages.DefaultJavaFoldingPreferenceBlock_methods, PreferenceConstants.EDITOR_FOLDING_METHODS, 0);
addCheckBox(initialFoldGroup, FoldingMessages.DefaultJavaFoldingPreferenceBlock_imports, PreferenceConstants.EDITOR_FOLDING_IMPORTS, 0);

Group extendedFoldingGroup= new Group(inner, SWT.NONE);
GridLayout extendedFoldingLayout = new GridLayout(1, false);
extendedFoldingLayout.marginWidth = 10;
extendedFoldingLayout.marginHeight = 10;
extendedFoldingGroup.setLayout(extendedFoldingLayout);
extendedFoldingGroup.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
extendedFoldingGroup.setText(FoldingMessages.DefaultJavaFoldingPreferenceBlock_New_Setting_Title);
Label label = new Label(extendedFoldingGroup,SWT.NONE);
label.setText(FoldingMessages.DefaultJavaFoldingPreferenceBlock_Warning_New_Feature);
addCheckBox(extendedFoldingGroup, FoldingMessages.DefaultJavaFoldingPreferenceBlock_New, PreferenceConstants.EDITOR_NEW_FOLDING_ENABLED, 0);
return inner;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,12 @@ private FoldingMessages() {
public static String DefaultJavaFoldingPreferenceBlock_innerTypes;
public static String DefaultJavaFoldingPreferenceBlock_methods;
public static String DefaultJavaFoldingPreferenceBlock_imports;
public static String DefaultJavaFoldingPreferenceBlock_New;
public static String DefaultJavaFoldingPreferenceBlock_headers;
public static String EmptyJavaFoldingPreferenceBlock_emptyCaption;
public static String JavaFoldingStructureProviderRegistry_warning_providerNotFound_resetToDefault;

public static String DefaultJavaFoldingPreferenceBlock_New_Setting_Title;
public static String DefaultJavaFoldingPreferenceBlock_Warning_New_Feature;
static {
NLS.initializeMessages(BUNDLE_NAME, FoldingMessages.class);
}
Expand Down
Loading

0 comments on commit c69530a

Please sign in to comment.