blob: 6d41aa89df66c53eaf62ba67a6088c03ea46b32b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2020 IBM Corporation and others.
*
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.text.tests;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.text.rules.FastPartitioner;
import org.eclipse.jdt.ui.text.IJavaPartitions;
import org.eclipse.jdt.internal.ui.text.FastJavaPartitionScanner;
import org.eclipse.jdt.internal.ui.text.java.SmartSemicolonAutoEditStrategy;
/**
* SmartSemicolonAutoEditStrategyTest
* @since 3.0
*/
public class SmartSemicolonAutoEditStrategyTest {
private static final boolean BUG_EXISTING_CHARACTERS_HANDLED_BY_FRAMEWORK= true;
private static final boolean BUG_UNWANTED_FUNCTIONALITY= true;
/**
* Testclass exposing the method to be tested
*/
private static class SmartSemicolon extends SmartSemicolonAutoEditStrategy {
public SmartSemicolon() {
super("");
}
public static int computeCharacterPosition(IDocument document, ITextSelection line, int offset, char character, String partitioning) {
return SmartSemicolonAutoEditStrategy.computeCharacterPosition(document, line, offset, character, partitioning);
}
}
private FastPartitioner fPartitioner;
private static final char SEMI= ';';
private static final char BRACE= '{';
private Document fDocument;
public SmartSemicolonAutoEditStrategyTest() {
fDocument= new Document();
String[] types= new String[] {
IJavaPartitions.JAVA_DOC,
IJavaPartitions.JAVA_MULTI_LINE_COMMENT,
IJavaPartitions.JAVA_SINGLE_LINE_COMMENT,
IJavaPartitions.JAVA_STRING,
IJavaPartitions.JAVA_CHARACTER,
IDocument.DEFAULT_CONTENT_TYPE
};
fPartitioner= new FastPartitioner(new FastJavaPartitionScanner(), types);
fPartitioner.connect(fDocument);
fDocument.setDocumentPartitioner(IJavaPartitions.JAVA_PARTITIONING, fPartitioner);
}
private void verifySemicolonPosition(int caret, int expected) throws BadLocationException {
IRegion region= fDocument.getLineInformation(0);
ITextSelection selection= new TextSelection(fDocument, region.getOffset(), region.getLength());
int pos= SmartSemicolon.computeCharacterPosition(fDocument, selection, caret, SEMI, IJavaPartitions.JAVA_PARTITIONING);
assertEquals(expected, pos);
}
private void verifyBracePosition(int caret, int expected) throws BadLocationException {
IRegion region= fDocument.getLineInformation(0);
ITextSelection selection= new TextSelection(fDocument, region.getOffset(), region.getLength());
int pos= SmartSemicolon.computeCharacterPosition(fDocument, selection, caret, BRACE, IJavaPartitions.JAVA_PARTITIONING);
if (pos == -1) pos= caret;
assertEquals(expected, pos);
}
/* semicolon tests */
@Test
public void testGoToEOL() throws BadLocationException {
fDocument.set("public void foobar()");
verifySemicolonPosition(5, 20);
}
@Test
public void testGoToExisting() throws BadLocationException {
if (BUG_UNWANTED_FUNCTIONALITY) {
System.out.println("testGoToExisting disabled - unwanted functionality");
return;
}
fDocument.set("public void; foobar()");
verifySemicolonPosition(5, 11);
}
@Test
public void testFor() throws BadLocationException {
fDocument.set("for (int i= 0)");
verifySemicolonPosition(13, -1);
}
@Test
public void testWithExistingBefore() throws BadLocationException {
fDocument.set("public void; foobar()");
verifySemicolonPosition(12, 21);
}
@Test
public void testWithExistingBeforeWithComment() throws BadLocationException {
fDocument.set("public void; foobar() // comment\r\n ");
verifySemicolonPosition(12, 21);
}
@Test
public void testWithExistingAtInsertPosition() throws BadLocationException {
if (BUG_EXISTING_CHARACTERS_HANDLED_BY_FRAMEWORK) {
System.out.println("testWithExistingAtInsertPosition disabled - existing characters handled by framework");
return;
}
fDocument.set("public void foobar(); // comment\r\n");
verifySemicolonPosition(12, 12);
}
@Test
public void testEndLineComment() throws BadLocationException {
fDocument.set("private string foo= \"foobar\" // comment\r\n");
verifySemicolonPosition(12, 28);
}
@Test
public void testFakeEndLineComment() throws BadLocationException {
fDocument.set("private string foo= \"foobar\" /* comment */ \r\n");
verifySemicolonPosition(12, 28);
}
@Test
public void testBlockComment() throws BadLocationException {
fDocument.set("doStuff(arg1 /* comment */, args) ");
verifySemicolonPosition(5, 33);
}
@Test
public void testMultiLineComment() throws BadLocationException {
fDocument.set("private string foo= \"foobar\" /* comment1 \r\n comment2 */");
verifySemicolonPosition(12, 28);
}
@Test
public void testEndLineCommentWithFor() throws BadLocationException {
fDocument.set("for (int i= 0; i < 2; i++) // comment");
verifySemicolonPosition(13, -1);
}
@Test
public void testFakeEndLineCommentWithFor() throws BadLocationException {
fDocument.set("for (int i= 0; i < 2; i++) /* comment */ ");
verifySemicolonPosition(13, -1);
}
@Test
public void testMultiLineCommentWithFor() throws BadLocationException {
fDocument.set("for (int i= 0; i < 2; i++) /* comment\r\n comment2 */ ");
verifySemicolonPosition(13, -1);
}
@Test
public void testSemicolonInEmptyMethodBody() throws BadLocationException {
fDocument.set("void foobar(int param) {}");
verifySemicolonPosition(24, 24);
}
@Test
public void testSemicolonInString() throws BadLocationException {
fDocument.set(" new Thread(\"\")");
verifySemicolonPosition(14, -1);
}
/* brace tests */
@Test
public void testBraceClassDef() throws BadLocationException {
fDocument.set("public static final class Main ");
verifyBracePosition(31, 31);
}
@Test
public void testBraceMethodDef() throws BadLocationException {
fDocument.set("void bla(int p1, int p2) // comment");
verifyBracePosition(8, 24);
}
@Test
public void testBraceMethodDef2() throws BadLocationException {
fDocument.set("void bla(int p1, int p2) // comment");
verifyBracePosition(12, 24);
}
@Test
public void testBraceIf() throws BadLocationException {
fDocument.set("if (condition && condition()) // comment");
verifyBracePosition(12, 29);
}
@Test
public void testBraceIf2() throws BadLocationException {
fDocument.set("if (value == expected) // comment");
verifyBracePosition(12, 22);
}
@Test
public void testBraceMethodCall() throws BadLocationException {
fDocument.set("call(param1, param2) // comment");
verifyBracePosition(12, 12);
}
@Test
public void testBraceElse() throws BadLocationException {
fDocument.set(" } else somecode();");
verifyBracePosition(4, 7);
}
@Test
public void testBraceArray() throws BadLocationException {
fDocument.set("int[] arr= bla, bli, blu;");
verifyBracePosition(10, 10);
verifyBracePosition(11, 11);
}
@Test
public void testBraceArray2() throws BadLocationException {
fDocument.set("arr= bla, bli, blu;");
verifyBracePosition(4, 4);
verifyBracePosition(5, 5);
}
@Test
public void testBraceAnonymousClassDef() throws BadLocationException {
fDocument.set("this.addListener(blu, new Listener(), bla)");
verifyBracePosition(34, 36);
}
@Test
public void testBraceAnonymousClassDef2() throws BadLocationException {
fDocument.set("this.addListener(blu, \"new\", Listener(), bla)");
verifyBracePosition(41, 41);
}
@Test
public void testBraceIfAnonymousClassDef() throws BadLocationException {
fDocument.set(" if addListener(blu, new Listener(), bla)");
verifyBracePosition(34, 36);
verifyBracePosition(37, 42);
}
@Test
public void testBraceIfAnonymousClassDef2() throws BadLocationException {
fDocument.set(" if addListener(blu, \"new\", Listener(), bla)");
verifyBracePosition(20, 45);
verifyBracePosition(39, 45);
}
@Test
public void testBraceAnonymousClassInstantiation() throws BadLocationException {
fDocument.set(" Object object=new Object();");
verifyBracePosition(27, 28);
verifyBracePosition(28, 28);
}
@Test
public void testBraceLambdaBlock() throws BadLocationException {
fDocument.set(" new Thread(() -> );");
verifyBracePosition(18, 18);
verifyBracePosition(19, 19);
verifyBracePosition(20, 20);
}
@Test
public void testBraceInString() throws BadLocationException {
fDocument.set(" new Thread(\"\")");
verifyBracePosition(14, 14);
}
@Test
public void testBraceInString2() throws BadLocationException {
fDocument.set(" System.out.write(\"((?\\\"{\\\\\\\"\\\\\\\":\\\"+()+\\\",\\\":\\\"ss\\\").());try {\");");
verifyBracePosition(50, 50);
}
}