diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java index 56bb4b2890c..304c4100a8c 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java @@ -80,6 +80,7 @@ import org.eclipse.cdt.core.dom.ast.c.ICASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.c.ICASTPointer; import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTForStatement; @@ -88,8 +89,11 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionTryBlockDeclarator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTPointerToMember; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTReferenceOperator; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration; @@ -244,6 +248,7 @@ public class CodeFormatterVisitor extends CPPASTVisitor { IASTDeclaration declaration = decls[i]; try { declaration.accept(this); + scribe.printNewLine(); } catch (ASTProblemException e) { if (i < decls.length - 1) { exitAlignments(); @@ -291,12 +296,12 @@ public class CodeFormatterVisitor extends CPPASTVisitor { // return visit((ICPPASTUsingDirective)declaration); } else if (node instanceof ICPPASTLinkageSpecification) { return visit((ICPPASTLinkageSpecification)node); + } else if (node instanceof ICPPASTTemplateDeclaration) { + return visit((ICPPASTTemplateDeclaration)node); } else if (node instanceof ICPPASTTemplateSpecialization) { - formatNode(node); - // return visit((ICPPASTTemplateSpecialization)declaration); + return visit((ICPPASTTemplateSpecialization)node); } else if (node instanceof ICPPASTExplicitTemplateInstantiation) { - formatNode(node); - // return visit((ICPPASTExplicitTemplateInstantiation)declaration); + return visit((ICPPASTExplicitTemplateInstantiation)node); } else if (node instanceof IASTProblemDeclaration) { return visit((IASTProblemDeclaration)node); } else { @@ -327,6 +332,8 @@ public class CodeFormatterVisitor extends CPPASTVisitor { } else if (node instanceof ICPPASTQualifiedName) { visit((ICPPASTQualifiedName)node); + } else if (node instanceof ICPPASTTemplateId) { + visit((ICPPASTTemplateId)node); } else { formatNode(node); } @@ -365,9 +372,7 @@ public class CodeFormatterVisitor extends CPPASTVisitor { skipNode(node); return PROCESS_SKIP; } else if (node instanceof ICPPASTFunctionDeclarator) { - visit((IASTStandardFunctionDeclarator)node); - skipNode(node); - return PROCESS_SKIP; + return visit((ICPPASTFunctionDeclarator)node); } else if (node instanceof IASTStandardFunctionDeclarator) { visit((IASTStandardFunctionDeclarator)node); } else if (node instanceof ICASTKnRFunctionDeclarator) { @@ -621,6 +626,22 @@ public class CodeFormatterVisitor extends CPPASTVisitor { return PROCESS_SKIP; } + private int visit(ICPPASTConstructorChainInitializer node) { + final IASTName member= node.getMemberInitializerId(); + if (member!= null) { + member.accept(this); + scribe.printNextToken(Token.tLPAREN, false); + final IASTExpression value= node.getInitializerValue(); + if (value != null) { + value.accept(this); + } + scribe.printNextToken(Token.tRPAREN, false); + } else { + formatNode(node); + } + return PROCESS_SKIP; + } + private int visit(IASTFunctionDefinition node) { scribe.printComment(); final int line= scribe.line; @@ -648,26 +669,32 @@ public class CodeFormatterVisitor extends CPPASTVisitor { return PROCESS_SKIP; } + private int visit(ICPPASTFunctionDeclarator node) { + visit((IASTStandardFunctionDeclarator)node); + final ICPPASTConstructorChainInitializer[] constructorChain= node.getConstructorChain(); + if (constructorChain != null && constructorChain.length > 0) { + scribe.printNextToken(Token.tCOLON, true); + // TODO need special constructor chain alignment + scribe.printNewLine(); + scribe.indent(); + final ListAlignment align= new ListAlignment(Alignment.M_COMPACT_SPLIT); + formatList(Arrays.asList(constructorChain), align, false, false); + scribe.unIndent(); + } + // skip const, throw, etc. + skipNode(node); + return PROCESS_SKIP; + } + private int visit(IASTStandardFunctionDeclarator node) { scribe.printComment(); - IASTPointerOperator[] pointers= node.getPointerOperators(); - if (pointers.length > 0) { - for (int i = 0; i < pointers.length; i++) { - IASTPointerOperator pointer= pointers[i]; - if (pointer instanceof ICPPASTReferenceOperator) { - scribe.printNextToken(Token.tAMPER, false); - } else if (pointer instanceof ICASTPointer) { - scribe.printNextToken(Token.tSTAR, false); - } else { - formatNode(pointer); - } - } - } + formatPointers(node.getPointerOperators()); IASTName name= node.getName(); - name.accept(this); - + if (name != null) { + name.accept(this); + } IASTDeclarator nestedDecl= node.getNestedDeclarator(); if (nestedDecl != null) { scribe.printNextToken(Token.tLPAREN, false); @@ -686,24 +713,36 @@ public class CodeFormatterVisitor extends CPPASTVisitor { return PROCESS_SKIP; } + private void formatPointers(IASTPointerOperator[] pointers) { + for (int i = 0; i < pointers.length; i++) { + IASTPointerOperator pointer= pointers[i]; + scribe.printModifiers(); + if (pointer instanceof ICPPASTReferenceOperator) { + scribe.printNextToken(Token.tAMPER, false); + } else if (pointer instanceof ICASTPointer) { + scribe.printNextToken(Token.tSTAR, false); + } else if (pointer instanceof ICPPASTPointerToMember) { + final ICPPASTPointerToMember ptrToMember= (ICPPASTPointerToMember)pointer; + final IASTName name= ptrToMember.getName(); + if (name != null) { + name.accept(this); + } + scribe.printNextToken(Token.tSTAR, false); + } else { + skipNode(pointer); + } + } + } + private int visit(ICASTKnRFunctionDeclarator node) { scribe.printComment(); - IASTPointerOperator[] pointers= node.getPointerOperators(); - if (pointers.length > 0) { - for (int i = 0; i < pointers.length; i++) { - IASTPointerOperator pointer= pointers[i]; - if (pointer instanceof ICASTPointer) { - scribe.printNextToken(Token.tSTAR, false); - } else { - assert false : "Unhandled pointer operator"; - } - } - } + formatPointers(node.getPointerOperators()); IASTName name= node.getName(); - name.accept(this); - + if (name != null) { + name.accept(this); + } IASTDeclarator nestedDecl= node.getNestedDeclarator(); if (nestedDecl != null) { scribe.printNextToken(Token.tLPAREN, false); @@ -748,6 +787,30 @@ public class CodeFormatterVisitor extends CPPASTVisitor { return PROCESS_SKIP; } + private int visit(ICPPASTTemplateDeclaration node) { + scribe.printNextToken(Token.t_template, false); + scribe.printNextToken(Token.tLT, false); + final ICPPASTTemplateParameter[] templateParameters= node.getTemplateParameters(); + if (templateParameters.length > 0) { + final ListAlignment align= new ListAlignment(Alignment.M_COMPACT_SPLIT); + formatList(Arrays.asList(templateParameters), align, false, false); + } + scribe.printNextToken(Token.tGT, false); + scribe.space(); + node.getDeclaration().accept(this); + return PROCESS_SKIP; + } + + private int visit(ICPPASTTemplateSpecialization node) { + node.getDeclaration().accept(this); + return PROCESS_SKIP; + } + + private int visit(ICPPASTExplicitTemplateInstantiation node) { + node.getDeclaration().accept(this); + return PROCESS_SKIP; + } + private int visit(IASTSimpleDeclSpecifier node) { formatNode(node); scribe.space(); @@ -954,7 +1017,13 @@ public class CodeFormatterVisitor extends CPPASTVisitor { if (i > 0 && align.fSpaceAfterComma) { scribe.space(); } - ((IASTNode) elements.get(i)).accept(this); + final IASTNode node= (IASTNode) elements.get(i); + if (node instanceof ICPPASTConstructorChainInitializer) { + // this is a special case + visit((ICPPASTConstructorChainInitializer)node); + } else { + node.accept(this); + } } if (addEllipsis) { if (i > 0) { @@ -1271,7 +1340,7 @@ public class CodeFormatterVisitor extends CPPASTVisitor { private int visit(ICPPASTQualifiedName node) { IASTName[] names= node.getNames(); for (int i = 0; i < names.length-1; i++) { - scribe.printNextToken(Token.tIDENTIFIER, false); + names[i].accept(this); scribe.printNextToken(Token.tCOLONCOLON); } if (peekNextToken() == Token.tCOMPL) { @@ -1282,6 +1351,19 @@ public class CodeFormatterVisitor extends CPPASTVisitor { return PROCESS_SKIP; } + private int visit(ICPPASTTemplateId node) { + IASTName name= node.getTemplateName(); + name.accept(this); + scribe.printNextToken(Token.tLT, false); + final IASTNode[] templateArguments= node.getTemplateArguments(); + if (templateArguments.length > 0) { + final ListAlignment align= new ListAlignment(Alignment.M_COMPACT_SPLIT); + formatList(Arrays.asList(templateArguments), align, false, false); + } + scribe.printNextToken(Token.tGT, false); + return PROCESS_SKIP; + } + private int visit(IASTReturnStatement node) { scribe.printNextToken(Token.t_return); final IASTExpression expression = node.getReturnValue(); diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java index f828910f45f..9969855fc6b 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java @@ -1529,7 +1529,6 @@ public class Scribe { /** */ public void printModifiers() { - int modifiersIndex= 0; boolean isFirstModifier= true; int currentTokenStartPosition= scanner.getCurrentPosition(); boolean hasComment= false; @@ -1541,16 +1540,18 @@ public class Scribe { case Token.t_auto: case Token.t_register: case Token.t_const: + case Token.t_signed: + case Token.t_unsigned: case Token.t_volatile: case Token.t_virtual: case Token.t_mutable: case Token.t_explicit: case Token.t_friend: case Token.t_inline: + case Token.t_restrict: print(currentToken.getLength(), !isFirstModifier); isFirstModifier= false; currentTokenStartPosition= scanner.getCurrentPosition(); - modifiersIndex++; break; case Token.tBLOCKCOMMENT: printBlockComment(false); diff --git a/core/org.eclipse.cdt.ui.tests/resources/formatter/complex/After.cpp b/core/org.eclipse.cdt.ui.tests/resources/formatter/complex/After.cpp new file mode 100644 index 00000000000..8c3235d3a91 --- /dev/null +++ b/core/org.eclipse.cdt.ui.tests/resources/formatter/complex/After.cpp @@ -0,0 +1,26 @@ + +/* This is sample code to test the formatter */ + +class Complex { +private: + float re; + float im; +public: + Complex(float re, float im) : + re(re), im(im) { + } + float GetRe() { + return re; + } + float GetIm() { + return im; + } + void Set(float r, float i); + /* Set real part */ + void SetRe(float r); + /* + * Set imaginary part + */ + void SetIm(float i); + void Print(); +}; diff --git a/core/org.eclipse.cdt.ui.tests/resources/formatter/complex/Before.cpp b/core/org.eclipse.cdt.ui.tests/resources/formatter/complex/Before.cpp new file mode 100644 index 00000000000..7a307a77d04 --- /dev/null +++ b/core/org.eclipse.cdt.ui.tests/resources/formatter/complex/Before.cpp @@ -0,0 +1,24 @@ + + + /* This is sample code to test the formatter */ + + + + class Complex { + private : + float re ; float im; + public: + Complex(float re, float im) : + re(re), im(im) {} + float GetRe() { return re;} +float GetIm() { + return im; + } + void Set(float r, float i); + /* Set real part */ + void SetRe(float r) ; + /* + * Set imaginary part + */ + void SetIm(float i);void Print(); + }; diff --git a/core/org.eclipse.cdt.ui.tests/resources/formatter/preview/After.cpp b/core/org.eclipse.cdt.ui.tests/resources/formatter/preview/After.cpp new file mode 100644 index 00000000000..d595123b02e --- /dev/null +++ b/core/org.eclipse.cdt.ui.tests/resources/formatter/preview/After.cpp @@ -0,0 +1,43 @@ +/* + * Indentation + */ +#include +class Point { +public: + Point(double xc, double yc) : + x(xc), y(yc) { + } + double distance(const Point& other) const; + int compareX(const Point& other) const; + double x; + double y; +}; +double Point::distance(const Point& other) const { + double dx = x - other.x; + double dy = y - other.y; + return sqrt(dx * dx + dy * dy); +} +int Point::compareX(const Point& other) const { + if (x < other.x) { + return -1; + } else if (x > other.x) { + return 1; + } else { + return 0; + } +} +namespace FOO { +int foo(int bar) const { + switch (bar) { + case 0: + ++bar; + break; + case 1: + --bar; + default: { + bar += bar; + break; + } + } +} +} // end namespace FOO diff --git a/core/org.eclipse.cdt.ui.tests/resources/formatter/preview/Before.cpp b/core/org.eclipse.cdt.ui.tests/resources/formatter/preview/Before.cpp new file mode 100644 index 00000000000..a48488347f2 --- /dev/null +++ b/core/org.eclipse.cdt.ui.tests/resources/formatter/preview/Before.cpp @@ -0,0 +1,5 @@ +/* + * Indentation + */ +#include +class Point {public:Point(double xc, double yc) : x(xc), y(yc) {}double distance(const Point& other) const;int compareX(const Point& other) const;double x;double y;};double Point::distance(const Point& other) const {double dx = x - other.x;double dy = y - other.y;return sqrt(dx * dx + dy * dy);}int Point::compareX(const Point& other) const {if (x < other.x) {return -1;} else if (x > other.x) {return 1;} else {return 0;}}namespace FOO {int foo(int bar) const {switch (bar) {case 0:++bar;break;case 1:--bar;default: {bar += bar;break;}}}} // end namespace FOO diff --git a/core/org.eclipse.cdt.ui.tests/resources/formatter/sample/After.cpp b/core/org.eclipse.cdt.ui.tests/resources/formatter/sample/After.cpp new file mode 100644 index 00000000000..4fac3784e72 --- /dev/null +++ b/core/org.eclipse.cdt.ui.tests/resources/formatter/sample/After.cpp @@ -0,0 +1,55 @@ +#include + +const SimpleStruct simpleStruct = + { + 1 + , "mySimple" + , 0.1232 +}; + +#define SIZEOF( A, B ) sizeof( A.B ) + +#define FOREVER \ + for(;;)\ +{\ + \ + } + +const OtherStruct array[] = + { + { +#if FOO + "foo" +# else + "bar" +#endif + , SIZEOF( simpleStruct, num ) + , &t_int + , 0 + } + , { + "name" + , SIZEOF( simpleStruct, floatnum ) + , &t_float + , 1 + } +}; + +// single line outside scope + +void SimpleStruct_construct( + struct SimpleStruct * const this ) + { + // single line + this->num = 1; + this->name = "boo"; + this->floatNum = 1.5; +} + +int ConnectParams_doSomething(const struct SimpleStruct * const this ) + { +/* + * multiline + */ + return 1; + } diff --git a/core/org.eclipse.cdt.ui.tests/resources/formatter/sample/Before.cpp b/core/org.eclipse.cdt.ui.tests/resources/formatter/sample/Before.cpp new file mode 100644 index 00000000000..e1578fe118a --- /dev/null +++ b/core/org.eclipse.cdt.ui.tests/resources/formatter/sample/Before.cpp @@ -0,0 +1,55 @@ +#include + +const SimpleStruct simpleStruct = +{ + 1 + , "mySimple" + , 0.1232 +}; + +#define SIZEOF( A, B ) sizeof( A.B ) + + #define FOREVER \ + for(;;)\ +{\ + \ + } + +const OtherStruct array[] = +{ + { +#if FOO + "foo" + # else + "bar" +#endif + , SIZEOF( simpleStruct, num ) + , &t_int + , 0 + } + , { + "name" + , SIZEOF( simpleStruct, floatnum ) + , &t_float + , 1 + } +}; + +// single line outside scope + +void SimpleStruct_construct( +struct SimpleStruct * const this ) + { +// single line +this->num = 1; +this->name = "boo"; +this->floatNum = 1.5; + } + +int ConnectParams_doSomething( const struct SimpleStruct * const this ) + { +/* + * multiline + */ + return 1; + } diff --git a/core/org.eclipse.cdt.ui.tests/resources/formatter/templates/After.cpp b/core/org.eclipse.cdt.ui.tests/resources/formatter/templates/After.cpp new file mode 100644 index 00000000000..fdfe7fe0d5a --- /dev/null +++ b/core/org.eclipse.cdt.ui.tests/resources/formatter/templates/After.cpp @@ -0,0 +1,74 @@ +class Key; +class Value; +class SortAlgorithm; +class DefaultSort; +class T; +class X; +class Y; +class Bar; +class Foo { + template void fum(int i); +}; + +// TEMPLATE_STRUCT +template struct Map { + Key * keys; + Value * values; + SortAlgorithm * sortAlgorithm; + Map(); +}; + +// TEMPLATE_CLASS +template class nonVector { +private: + T * head; + +public: + nonVector() { + head =new T(); + } + int length() { + return 1; + } + const T &first() const; +}; + +// TEMPLATE_UNION +template union ArrayOverlay { +public: + X x[size]; + Y y[size]; + + static int numArrays; +}; + +// TEMPLATE_METHODS +class TemplateContainer { + // these are in an enclosing class + template void fum(int i); + template void scrum(void) { + } + ; +}; + +// TEMPLATE_FUNCTION +template const T &nonVector::first() const { + return *head; +} + +template bool IsGreaterThan(X, X); + +template void Foo::fum(int i) { +} + +// TEMPLATE_VARIABLES +template char + * default_alloc_template::S_start_free = 0; + +// an instantiation, not a template: +complex + cf(0,0); +//template > +//Dictionary* TheSpellCheckDictionary; + +int success; diff --git a/core/org.eclipse.cdt.ui.tests/resources/formatter/templates/Before.cpp b/core/org.eclipse.cdt.ui.tests/resources/formatter/templates/Before.cpp new file mode 100644 index 00000000000..10e180dc5fd --- /dev/null +++ b/core/org.eclipse.cdt.ui.tests/resources/formatter/templates/Before.cpp @@ -0,0 +1,70 @@ +class Key; +class Value; +class SortAlgorithm; +class DefaultSort; +class T; +class X; +class Y; +class Bar; +class Foo { + template void fum(int i); +}; + +// TEMPLATE_STRUCT +template +struct Map +{ + Key* keys; + Value* values; + SortAlgorithm* sortAlgorithm; + Map(); +}; + +// TEMPLATE_CLASS +template class nonVector { +private: T* head; + +public: + nonVector() {head =new T();} + int length() {return 1;} + const T& first() const; +}; + +// TEMPLATE_UNION +template +union ArrayOverlay { +public: + X x[size]; Y y[size]; + + static int numArrays; +}; + +// TEMPLATE_METHODS +class TemplateContainer { + // these are in an enclosing class + template void fum(int i); + template + void scrum(void) {} + ; +}; + +// TEMPLATE_FUNCTION +template const T& nonVector::first() const + { + return *head; +} + +template bool IsGreaterThan(X,X); + +template void Foo::fum(int i) {} + +// TEMPLATE_VARIABLES +template char* default_alloc_template::S_start_free = 0; + +// an instantiation, not a template: +complex + cf(0,0); +//template > +//Dictionary* TheSpellCheckDictionary; + +int success; diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/FormatActionTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/FormatActionTest.java new file mode 100644 index 00000000000..5c0732260ad --- /dev/null +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/FormatActionTest.java @@ -0,0 +1,134 @@ +/******************************************************************************* + * Copyright (c) 2005, 2006 IBM Corporation 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: + * IBM Corporation - initial API and implementation + * Anton Leherbauer (Wind River Systems) + *******************************************************************************/ +package org.eclipse.cdt.ui.tests.text; + +import java.util.ListResourceBundle; + +import junit.extensions.TestSetup; +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.source.SourceViewer; + +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.formatter.DefaultCodeFormatterConstants; +import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.testplugin.CProjectHelper; + +import org.eclipse.cdt.internal.ui.editor.CEditor; + +/** + * Test the Formatter. + */ +public class FormatActionTest extends TestCase { + private static final String PROJECT= "FormatTests"; + + private static final class EmptyBundle extends ListResourceBundle { + protected Object[][] getContents() { + return new Object[0][]; + } + } + + protected static class IndentTestSetup extends TestSetup { + + private ICProject fCProject; + + public IndentTestSetup(Test test) { + super(test); + } + + protected void setUp() throws Exception { + super.setUp(); + + fCProject= EditorTestHelper.createCProject(PROJECT, "resources/formatter"); + fCProject.setOption(DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR, CCorePlugin.TAB); + } + + protected void tearDown () throws Exception { + if (fCProject != null) + CProjectHelper.delete(fCProject); + + super.tearDown(); + } + } + + private static final Class THIS= FormatActionTest.class; + public static Test suite() { + return new IndentTestSetup(new TestSuite(THIS)); + } + + private CEditor fEditor; + private SourceViewer fSourceViewer; + private IDocument fDocument; + + /* + * @see junit.framework.TestCase#setUp() + */ + protected void setUp() throws Exception { + String filename= createFileName("Before"); + fEditor= (CEditor) EditorTestHelper.openInEditor(ResourceTestHelper.findFile(filename), true); + fSourceViewer= EditorTestHelper.getSourceViewer(fEditor); + fDocument= fSourceViewer.getDocument(); + } + + /* + * @see junit.framework.TestCase#tearDown() + */ + protected void tearDown() throws Exception { + EditorTestHelper.closeEditor(fEditor); + } + + private void assertFormatResult() throws Exception { + String afterFile= createFileName("After"); + String expected= ResourceTestHelper.read(afterFile).toString(); + + IAction formatAction= fEditor.getAction("Format"); + assertNotNull("No format action", formatAction); + formatAction.run(); + + assertEquals(expected, fDocument.get()); + } + + private String createFileName(String qualifier) { + String name= getName(); + name= name.substring(4, 5).toLowerCase() + name.substring(5); + return "/" + PROJECT + "/src/" + name + "/" + qualifier + ".cpp"; + } + + private void selectAll() { + fSourceViewer.setSelectedRange(0, fDocument.getLength()); + } + + public void testTemplates() throws Exception { + selectAll(); + assertFormatResult(); + } + + public void testPreview() throws Exception { + selectAll(); + assertFormatResult(); + } + + public void testSample() throws Exception { + selectAll(); + assertFormatResult(); + } + + public void testComplex() throws Exception { + selectAll(); + assertFormatResult(); + } + +} diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/TextTestSuite.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/TextTestSuite.java index ea307d0e0f8..6bea8b483cd 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/TextTestSuite.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/TextTestSuite.java @@ -31,6 +31,7 @@ public class TextTestSuite extends TestSuite { addTest(CHeuristicScannerTest.suite()); addTest(BracketInserterTest.suite()); addTest(IndentActionTest.suite()); + addTest(FormatActionTest.suite()); // Break iterator tests. addTest(CBreakIteratorTest.suite());