/******************************************************************************* * Copyright (c) 2006, 2015 Wind River Systems, Inc. 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: * Anton Leherbauer (Wind River Systems) - initial API and implementation * Sergey Prigogin (Google) * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.ui.tests.text.doctools.doxygen; import java.util.HashMap; import junit.framework.Test; 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.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.model.CoreModel; 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.ui.CUIPlugin; import org.eclipse.cdt.ui.tests.text.AbstractAutoEditTest; import org.eclipse.cdt.ui.text.ICPartitions; import org.eclipse.cdt.ui.text.doctools.DefaultMultilineCommentAutoEditStrategy; import org.eclipse.cdt.ui.text.doctools.doxygen.DoxygenSingleAutoEditStrategy; import org.eclipse.cdt.internal.core.model.TranslationUnit; import org.eclipse.cdt.internal.ui.text.CAutoIndentStrategy; import org.eclipse.cdt.internal.ui.text.CTextTools; /** * Testing the auto indent strategies. */ public class DoxygenCCommentSingleAutoEditStrategyTest extends AbstractAutoEditTest { private HashMap<String, String> fOptions; protected ICProject fCProject; /** * @param name */ public DoxygenCCommentSingleAutoEditStrategyTest(String name) { super(name); } public static Test suite() { return suite(DoxygenCCommentSingleAutoEditStrategyTest.class); } @Override protected void setUp() throws Exception { super.setUp(); fOptions= CCorePlugin.getOptions(); fCProject= CProjectHelper.createCCProject("test" + System.currentTimeMillis(), null); } /* * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { CCorePlugin.setOptions(fOptions); CProjectHelper.delete(fCProject); 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; } // ///X // void foo() {} // /// // /// X // void foo() {} public void testAutoDocCommentContent1() throws CoreException { assertAutoEditBehaviour(); } // /// X // void foo() {} // /// // /// X // void foo() {} public void testAutoDocCommentContent2() throws CoreException { assertAutoEditBehaviour(); } // /// aXb // void foo() {} // /// a // /// Xb // void foo() {} public void testAutoDocCommentContent2b() throws CoreException { assertAutoEditBehaviour(); } // ///X // int foo_bar() {} // /// X@return // int foo_bar() {} public void testAutoDocCommentContent3() throws CoreException { assertAutoEditBehaviour(); } // /// X // int foo_bar() {} // /// X@return // int foo_bar() {} public void testAutoDocCommentContent4() throws CoreException { assertAutoEditBehaviour(); } // ///X // /// // /// // int foo_bar() {} // /// // /// X // /// // /// // int foo_bar() {} public void testAutoDocCommentContent5() throws CoreException { assertAutoEditBehaviour(); } // ///X // void foo_bar(int x) {} // /// X@param x // void foo_bar(int x) {} public void testAutoDocCommentContent6() throws CoreException { assertAutoEditBehaviour(); } // /// X // void foo_bar(int x) {} // /// X@param x // void foo_bar(int x) {} public void testAutoDocCommentContent6b() throws CoreException { assertAutoEditBehaviour(); } // class A {}; class B {}; // ///X // C* bar_baz(A a, B b, int c) {} // class A {}; class B {}; // /// X@param a // /// @param b // /// @param c // /// @return // C* bar_baz(A a, B b, int c) {} public void testAutoDocCommentContent7() throws CoreException { assertAutoEditBehaviour(); } // class A {}; class B {}; // /// X@param a // /// @param b // /// @param c // /// @return // C* bar_baz(A a, B b, int c) {} // class A {}; class B {}; // /// // /// X@param a // /// @param b // /// @param c // /// @return // C* bar_baz(A a, B b, int c) {} public void testAutoDocCommentContent7b() throws CoreException { assertAutoEditBehaviour(); } // /** // * namespace // */ // namespace NS { // class A { // private: // /* // * TODO // */ // /*! // * class // */ // class B { // public: // /// // /// // /// // void foo() {} // ///X // A bar(A as[], B bs[]) {} // }; // }; // } // /** // * namespace // */ // namespace NS { // class A { // private: // /* // * TODO // */ // /*! // * class // */ // class B { // public: // /// // /// // /// // void foo() {} // /// X@param as // /// @param bs // /// @return // A bar(A as[], B bs[]) {} // }; // }; // } public void testAutoDocCommentContent8() throws CoreException { assertAutoEditBehaviour(); } // void foo_bar(int x) // ///X // {} // void foo_bar(int x) // /// X@param x // {} public void testAutoDocCommentContent9() throws CoreException { assertAutoEditBehaviour(); } // void foo_bar(int x) // /// X@param x // {} // void foo_bar(int x) // /// // /// X@param x // {} public void testAutoDocCommentContent9b() throws CoreException { assertAutoEditBehaviour(); } // void foo_bar(int x) // /// X@param x // {} // void foo_bar(int x) // /// // /// X@param x // {} public void testAutoDocCommentContent9c() throws CoreException { assertAutoEditBehaviour(); } // /// // /// // /// // void foo_bar(int x) // ///X // {} // /// // /// // /// // void foo_bar(int x) // /// X@param x // {} public void testAutoDocCommentContent9d() throws CoreException { assertAutoEditBehaviour(); } // void foo_bar(int x) // { // ///X // } // void foo_bar(int x) // { // /// // /// X // } public void testAutoDocCommentContent9e() throws CoreException { assertAutoEditBehaviour(); } // void foo_bar(int x) // { // ///X // } // void foo_bar(int x) // { // /// // /// X // /// @param x // } public void _testAutoDocCommentContent10() throws CoreException { assertAutoEditBehaviour(); // TODO - desired behaviour when there is a comment preceding the declaration // or when there is a comment after the signature but before the brace, both need defining } // ///X // enum A { B, C }; // /// // /// X // enum A { B, C }; public void testAutoDocCommentContent11() throws CoreException { assertAutoEditBehaviour(); } // ///X // enum A { B, // C }; // /// // /// X // enum A { B,//!< B // C }; //!< C public void testAutoDocCommentContent13() throws CoreException { assertAutoEditBehaviour(); } // ///X // enum A { B, // C };//!< C // /// // /// X // enum A { B,//!< B // C };//!< C public void testAutoDocCommentContent14() throws CoreException { assertAutoEditBehaviour(); } // ///X // enum A { B,//!< B // C }; // /// // /// X // enum A { B,//!< B // C };//!< C public void testAutoDocCommentContent15() throws CoreException { assertAutoEditBehaviour(); } // ///X // enum A { B, // C }; // /// // /// X // enum A { B,//!< B // C }; //!< C public void _testAutoDocCommentContent16() throws CoreException { /* * Indenting in the presence of tabs is not handled at the moment. */ assertAutoEditBehaviour(); } // #define STATIC static // // class D { // public: // ///X // STATIC void D::foo(int x) { // // } // }; // #define STATIC static // // class D { // public: // /// X@param x // STATIC void D::foo(int x) { // // } // }; public void testAutoDocCommentContent17() throws CoreException { assertAutoEditBehaviour(); } // class D { // public: // ///X // virtual void foo(D x) = 0; // }; // class D { // public: // /// X@param x // virtual void foo(D x) = 0; // }; public void testAutoDocCommentContent18() throws CoreException { assertAutoEditBehaviour(); } // class D { // public: // ///X // virtual void foo(D x); // }; // class D { // public: // /// X@param x // virtual void foo(D x); // }; public void testAutoDocCommentContent19() throws CoreException { assertAutoEditBehaviour(); } // class A {}; // ///X // A baz; // class A {}; // /// // /// X // A baz; public void testAutoDocCommentContent20() throws CoreException { assertAutoEditBehaviour(); } // ///X // void foo(void) {} // /// // /// X // void foo(void) {} public void testAutoDocCommentContent21_238852_a() throws CoreException { assertAutoEditBehaviour(); } // ///X // void foo(void* x) {} // /// X@param x // void foo(void* x) {} public void testAutoDocCommentContent21_238852_b() throws CoreException { assertAutoEditBehaviour(); } // ///X // void foo(void (*fp)()) {} // /// X@param fp // void foo(void (*fp)()) {} public void testAutoDocCommentContent21_238852_c() throws CoreException { assertAutoEditBehaviour(); } // ///X // void foo(void vs[]) {} // /// X@param vs // void foo(void vs[]) {} public void testAutoDocCommentContent21_238852_d() throws CoreException { assertAutoEditBehaviour(); } /** Declarations **/ // ///X // int foo_bar(); // /// X@return // int foo_bar(); public void testAutoDocCommentContent3_Dec() throws CoreException { assertAutoEditBehaviour(); } // /// X // int foo_bar(); // /// X@return // int foo_bar(); public void testAutoDocCommentContent4_Dec() throws CoreException { assertAutoEditBehaviour(); } // /// abcX@return // int foo_bar(); // /// abc // /// X@return // int foo_bar(); public void testAutoDocCommentContent4b_Dec() throws CoreException { assertAutoEditBehaviour(); } // ///X // /// // int foo_bar(); // /// // /// X // /// // int foo_bar(); public void testAutoDocCommentContent5_Dec() throws CoreException { assertAutoEditBehaviour(); } // ///X // void foo_bar(int x); // /// X@param x // void foo_bar(int x); public void testAutoDocCommentContent6_Dec() throws CoreException { assertAutoEditBehaviour(); } // class A {}; class B {}; // ///X // C* bar_baz(A a, B b, int c); // class A {}; class B {}; // /// X@param a // /// @param b // /// @param c // /// @return // C* bar_baz(A a, B b, int c); public void testAutoDocCommentContent7_Dec() throws CoreException { assertAutoEditBehaviour(); } // #define STATIC static // // class D { // public: // ///X // STATIC void D::foo(int x); // }; // #define STATIC static // // class D { // public: // /// X@param x // STATIC void D::foo(int x); // }; public void testAutoDocCommentContent17_Dec() throws CoreException { assertAutoEditBehaviour(); } // ///X // extern "C" void foo(int x); // /// X@param x // extern "C" void foo(int x); public void testAutoDocCommentExternC1() throws CoreException { assertAutoEditBehaviour(); } // ///X // extern "C" { // void foo(int x); // } // /// // /// X // extern "C" { // void foo(int x); // } public void testAutoDocCommentExternC2() throws CoreException { assertAutoEditBehaviour(); } // extern "C" { // ///X // void foo(int x); // } // extern "C" { // /// X@param x // void foo(int x); // } public void testAutoDocCommentExternC3() throws CoreException { assertAutoEditBehaviour(); } // class Test { // public: // ///X // Test(); // }; // class Test { // public: // /// // /// X // Test(); // }; public void testAutoDocCommentConstructor1() throws CoreException { assertAutoEditBehaviour(); } // class Test { // public: // ///X // Test(int x); // }; // class Test { // public: // /// X@param x // Test(int x); // }; public void testAutoDocCommentConstructor2() throws CoreException { assertAutoEditBehaviour(); } // class Test { // public: // ///X // ~Test(); // }; // class Test { // public: // /// // /// X // ~Test(); // }; public void testAutoDocCommentDestructor() throws CoreException { assertAutoEditBehaviour(); } protected void assertAutoEditBehaviour() throws CoreException { CTextTools textTools = CUIPlugin.getDefault().getTextTools(); final 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", ""); DoxygenSingleAutoEditStrategy ds= new DoxygenSingleAutoEditStrategy() { @Override public IASTTranslationUnit getAST() { final IFile file= fCProject.getProject().getFile("testContent.cpp"); try { TestSourceReader.createFile(fCProject.getProject(), "testContent.cpp", doc.get()); String id = CoreModel.getRegistedContentTypeId(file.getProject(), file.getName()); return new TranslationUnit(fCProject, file, id).getAST(); } catch(CoreException ce) { assertTrue("Could not get test content AST", false); return null; } } }; 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); } }