blob: 374c180f14c5a624174b549d50cd8a5e6d9a8586 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2014 Wind River Systems, Inc. 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:
* Anton Leherbauer (Wind River Systems) - initial API and implementation
* Sergey Prigogin (Google)
* Andrew Ferguson (Symbian)
*******************************************************************************/
package org.eclipse.cdt.ui.tests.text;
import java.util.HashMap;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
import org.eclipse.cdt.internal.ui.text.CAutoIndentStrategy;
import org.eclipse.cdt.internal.ui.text.CTextTools;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.text.ICPartitions;
import org.eclipse.cdt.ui.text.doctools.DefaultMultilineCommentAutoEditStrategy;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.junit.Ignore;
import junit.framework.Test;
/**
* Testing the auto indent strategies.
*/
@Ignore("Some tests fail and this class was not included through AutomatedIntegrationSuite. See bug 564002")
public class DefaultCCommentAutoEditStrategyTest extends AbstractAutoEditTest {
private HashMap<String, String> fOptions;
/**
* @param name
*/
public DefaultCCommentAutoEditStrategyTest(String name) {
super(name);
}
public static Test suite() {
return suite(DefaultCCommentAutoEditStrategyTest.class);
}
/*
* @see org.eclipse.cdt.core.testplugin.util.BaseTestCase#setUp()
*/
@Override
protected void setUp() throws Exception {
super.setUp();
fOptions = CCorePlugin.getOptions();
}
/*
* @see junit.framework.TestCase#tearDown()
*/
@Override
protected void tearDown() throws Exception {
CCorePlugin.setOptions(fOptions);
super.tearDown();
}
private AutoEditTester createAutoEditTester() {
CTextTools textTools = CUIPlugin.getDefault().getTextTools();
IDocument doc = new Document();
textTools.setupCDocument(doc);
AutoEditTester tester = new AutoEditTester(doc, ICPartitions.C_PARTITIONING);
tester.setAutoEditStrategy(IDocument.DEFAULT_CONTENT_TYPE,
new CAutoIndentStrategy(ICPartitions.C_PARTITIONING, null));
tester.setAutoEditStrategy(ICPartitions.C_MULTI_LINE_COMMENT, new DefaultMultilineCommentAutoEditStrategy());
tester.setAutoEditStrategy(ICPartitions.C_PREPROCESSOR,
new CAutoIndentStrategy(ICPartitions.C_PARTITIONING, null));
return tester;
}
public void testIsMultilineNew() throws BadLocationException {
DefaultMultilineCommentAutoEditStrategy ds = new DefaultMultilineCommentAutoEditStrategy();
CTextTools textTools = CUIPlugin.getDefault().getTextTools();
IDocument doc = new Document();
textTools.setupCDocument(doc);
doc.set(" /* ");
assertTrue(ds.shouldCloseMultiline(doc, 3));
doc.set(" /* \n");
assertTrue(ds.shouldCloseMultiline(doc, 3));
assertTrue(ds.shouldCloseMultiline(doc, 5));
doc.set(" /* \n ");
assertTrue(ds.shouldCloseMultiline(doc, 3));
assertTrue(ds.shouldCloseMultiline(doc, 6));
doc.set(" /* */");
assertFalse(ds.shouldCloseMultiline(doc, 5));
doc.set(" /* */ ");
assertFalse(ds.shouldCloseMultiline(doc, 5));
doc.set(" /* \n\n */ ");
assertFalse(ds.shouldCloseMultiline(doc, 5));
doc.set(" /* \n\n */ \n /*");
assertTrue(ds.shouldCloseMultiline(doc, 14));
doc.set(" /* \n\n */ \n /* ");
assertTrue(ds.shouldCloseMultiline(doc, 14));
doc.set(" /* \n\n */ \n /* \n");
assertTrue(ds.shouldCloseMultiline(doc, 14));
doc.set(" /* /* \n\n */ \n /* \n");
assertTrue(ds.shouldCloseMultiline(doc, 3));
doc.set(" /* \n/* \n\n */ \n /* \n");
assertTrue(ds.shouldCloseMultiline(doc, 3));
doc.set(" /* \n\n/* \n\n */ \n /* \n");
assertTrue(ds.shouldCloseMultiline(doc, 3));
doc.set(" /* \n\n/* \n\n */ \n /* \n");
assertTrue(ds.shouldCloseMultiline(doc, 3));
doc.set(" /* \n\n */ /* \n\n */ \n /* \n");
assertFalse(ds.shouldCloseMultiline(doc, 3));
doc.set(" /*\n /*\n * \n * \n */\n");
assertFalse(ds.shouldCloseMultiline(doc, 8));
}
// /*X
// /*
// * X
// */
public void testInsertNewLine1() {
assertNewLineBehaviour();
}
// /*X
// /*
// * X
// */
public void testInsertNewLine2() {
assertNewLineBehaviour();
}
// class A {}; /*X
// class A {}; /*
// X
public void testInsertNewLine3() {
assertNewLineBehaviour();
}
// class A {
// /*X
// };
// class A {
// /*
// * X
// */
// };
public void testInsertNewLine4() {
assertNewLineBehaviour();
}
// class A {
// /* X
// };
// class A {
// /*
// * X
// */
// };
public void testInsertNewLine5() {
assertNewLineBehaviour();
}
// class A {
// /*X
// *
// */
// };
// class A {
// /*
// * X
// *
// */
// };
public void testInsertNewLine6() {
assertNewLineBehaviour();
}
// class A {
// /*
// *X
// */
// };
// class A {
// /*
// *
// *X
// */
// };
public void testInsertNewLine7() {
assertNewLineBehaviour();
}
// class A {
// /*
// *X
// */
// };
// class A {
// /*
// *
// *X
// */
// };
public void testInsertNewLine8() {
assertNewLineBehaviour();
}
// class A {
// /*
// * abcd def ghiX
// */
// };
// class A {
// /*
// * abcd def ghi
// * X
// */
// };
public void testInsertNewLine9() {
assertNewLineBehaviour();
}
// class A {
// /*
// * abcd deXf ghi
// */
// };
// class A {
// /*
// * abcd de
// * Xf ghi
// */
// };
public void testInsertNewLine10() {
assertNewLineBehaviour();
}
// class A {
// /*
// *
// */X
// };
// class A {
// /*
// *
// */
// X
// };
public void _testInsertNewLine11() { // this is correct - we're not in a dccaes partition
assertNewLineBehaviour();
}
// /*X*/
// /*
// * X
// */
public void _testInsertNewLine12() {
assertNewLineBehaviour();
}
// class A {
// /*Xfoo
// };
// class A {
// /*
// * X
// */foo
// };
public void testInsertNewLine13() {
assertNewLineBehaviour();
}
// class A {
// /*fooX
// };
// class A {
// /*foo
// * X
// */
// };
public void testInsertNewLine14() {
assertNewLineBehaviour();
}
// /*
// *
// *X
// /*
// *
// *
// *X
public void testInsertNewLine15() {
assertNewLineBehaviour();
}
// /*
// *
// *Xxx
// /*
// *
// *
// *Xxx
public void testInsertNewLine16() {
assertNewLineBehaviour();
}
// /*
// X
// /*
//
// X
public void testInsertNewLine17() {
assertNewLineBehaviour();
}
// /*
// X
// */
// /*
//
// X
// */
public void testInsertNewLine18() {
assertNewLineBehaviour();
}
// /*
// *
// */ /*X
// /*
// *
// */ /*
// * X
// */
public void _testInsertNewLine19() {
assertNewLineBehaviour();
}
// /*
// /*X
// *
// */
// /*
// /*
// * X
// *
// */
public void testInsertNewLine20() {
assertNewLineBehaviour();
}
//
// X
//
// void foo() {}
public void testFollowingDeclaration1() {
assertDeclarationFollowingX("void foo() {}");
}
// X
//
// void foo() {}
// void bar() {}
public void testFollowingDeclaration1b() {
assertDeclarationFollowingX("void foo() {}");
}
//
// X
// class C {
// void foo() {}
// };
public void testFollowingDeclaration2() {
assertDeclarationFollowingX("class C {\n void foo() {}\n };");
}
// class C {
// X
// void foo() {}
// };
public void testFollowingDeclaration3() {
assertDeclarationFollowingX("void foo() {}");
}
// class C {
// void foo() {X}
// void bar(int x);
// };
public void testFollowingDeclaration4() {
assertDeclarationFollowingX(null);
}
// class C {
// void foo() {} X
// void bar(int x);
// };
public void testFollowingDeclaration4a() {
assertDeclarationFollowingX("void bar(int x);");
}
// class C {
// void foo()X{}
// void bar(int x);
// };
public void _testFollowingDeclaration4b() { // TODO - this is likely invalid anyhow
assertDeclarationFollowingX("void foo(){}"); // (X is just the cursor position)
}
// class C {
// void foo()
// X
// {
// int x;
// }
// void bar(int x);
// };
public void _testFollowingDeclaration4c() { // TODO - this is likely invalid anyhow
assertDeclarationFollowingX("void foo()\n {\n int x;\n }\n"); // (X is just the cursor position)
}
// namespace n1 { X
// namespace n2 {
// void foo() {}
// void bar(int x) {}
// class C {
// int y;
// void baz(int x) {}
// };
// }
// }
public void _testFollowingDeclaration5() {
assertDeclarationFollowingX(
"namespace n2 {\n void foo() {}\n void bar(int x) {}\n class C {\n int y;\n void baz(int x) {}\n };\n }");
}
// namespace n1 {
// namespace n2 {X
// void foo() {}
// void bar(int x) {}
// class C {
// int y;
// void baz(int x) {}
// };
// }
// }
public void testFollowingDeclaration6() {
assertDeclarationFollowingX("void foo() {}");
}
// namespace n1 {
// namespace n2 {
// void foo() {}X
// void bar(int x) {}
// class C {
// int y;
// void baz(int x) {}
// };
// }
// }
public void testFollowingDeclaration7() {
assertDeclarationFollowingX("void bar(int x) {}");
}
// namespace n1 {
// namespace n2 {
// void foo() {}
// void bar(int x) {}
// class C {X
// int y;
// void baz(int x) {}
// };
// }
// }
public void testFollowingDeclaration8() {
assertDeclarationFollowingX("int y;");
}
// namespace n1 {
// namespace n2 {
// void foo() {}
// void bar(int x) {}
// class C {
// int y;X
// void baz(int x) {}
// };
// }
// }
public void testFollowingDeclaration9() {
assertDeclarationFollowingX("void baz(int x) {}");
}
// #define STATIC static
//
// class D {
// public:
// X
// STATIC void D::foo(int x) {
//
// }
// };
public void testFollowingDeclaration13() throws CoreException {
assertDeclarationFollowingX("STATIC void D::foo(int x) {\n \n }");
}
// #define MM void foo()
// X
// MM {}
public void testFollowingDeclaration10() {
assertDeclarationFollowingX("MM {}");
}
// #define NAME foo
// #define MM(V) void V(int y)
// X
// MM(NAME) {}
public void testFollowingDeclaration11() {
assertDeclarationFollowingX("MM(NAME) {}");
}
// #define MAKEFUNC(V) void V()
// #define B(V) V
// #define C(V) foo ## x
// X
// MAKEFUNC(B(C(y))) {}
public void testFollowingDeclaration12() {
assertDeclarationFollowingX("MAKEFUNC(B(C(y))) {}");
}
/**
* @param rs - the raw signature of the declaration that should be returned
* or <code>null</code> if no declaration should be returned.
*/
protected void assertDeclarationFollowingX(String rs) {
try {
ICProject cproject = CProjectHelper.createCCProject("test" + System.currentTimeMillis(), "bin");
try {
String init = getTestContents1()[0].toString();
int caretInit = init.indexOf('X');
init = init.replaceFirst("X", "");
IFile file = TestSourceReader.createFile(cproject.getProject(), "this.cpp", init);
IASTTranslationUnit ast = TestSourceReader.createIndexBasedAST(null, cproject, file);
assertNotNull(ast);
IASTDeclaration decl = DefaultMultilineCommentAutoEditStrategy.findFollowingDeclaration(ast, caretInit);
if (rs != null) {
assertNotNull(decl);
assertEquals(rs, decl.getRawSignature());
} else {
assertNull(decl);
}
} finally {
if (cproject != null) {
cproject.getProject().delete(true, npm());
}
}
} catch (CoreException ce) {
fail(ce.getMessage());
}
}
protected void assertNewLineBehaviour() {
DefaultMultilineCommentAutoEditStrategy ds = new DefaultMultilineCommentAutoEditStrategy();
CTextTools textTools = CUIPlugin.getDefault().getTextTools();
IDocument doc = new Document();
textTools.setupCDocument(doc);
CharSequence[] raw = getTestContents();
String init = raw[0].toString(), expected = raw[1].toString();
int caretInit = init.indexOf('X');
init = init.replaceFirst("X", "");
int caretExpected = expected.indexOf('X');
expected = expected.replaceFirst("X", "");
doc.set(init);
int caretActual = -1;
try {
TestDocumentCommand dc = new TestDocumentCommand(caretInit, 0, "\n");
ds.customizeDocumentCommand(doc, dc);
caretActual = dc.exec(doc);
} catch (BadLocationException ble) {
fail(ble.getMessage());
}
String actual = doc.get();
assertEquals(expected, actual);
assertEquals(caretExpected, caretActual);
}
}