/******************************************************************************* * Copyright (c) 2006, 2010 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: * Markus Schorn - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.ui.tests.callhierarchy; import junit.framework.Test; import org.eclipse.core.resources.IFile; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IPDOMManager; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.testplugin.CProjectHelper; import org.eclipse.cdt.core.testplugin.TestScannerProvider; import org.eclipse.cdt.internal.ui.editor.CEditor; public class CallHierarchyAcrossProjectsTest extends CallHierarchyBaseTest { private ICProject fCProject2; public CallHierarchyAcrossProjectsTest(String name) { super(name); } public static Test suite() { return suite(CallHierarchyAcrossProjectsTest.class); } @Override protected void setUp() throws Exception { super.setUp(); fCProject2= CProjectHelper.createCCProject("__chTest_2__", "bin", IPDOMManager.ID_NO_INDEXER); CCorePlugin.getIndexManager().setIndexerId(fCProject2, IPDOMManager.ID_FAST_INDEXER); CCorePlugin.getIndexManager().joinIndexer(INDEXER_WAIT_TIME, npm()); fIndex= CCorePlugin.getIndexManager().getIndex(new ICProject[] {fCProject, fCProject2}); TestScannerProvider.sIncludes= new String[]{fCProject.getProject().getLocation().toOSString(), fCProject2.getProject().getLocation().toOSString()}; } @Override protected void tearDown() throws Exception { if (fCProject2 != null) { CProjectHelper.delete(fCProject2); } super.tearDown(); } // // testMethods.h // class MyClass { // public: // void method(); // void inline_method() { // method(); // r1 // inline_method(); // r1 // } // }; // // testMethods.cpp // #include "testMethods.h" // void MyClass::method() { // method(); // r2 // inline_method(); // r2 // } // // void func() { // MyClass m, *n; // m.method(); // r3 // n->inline_method(); // r3 // } public void testMethods() throws Exception { StringBuilder[] content= getContentsForTest(2); String header= content[0].toString(); String source = content[1].toString(); IFile headerFile= createFile(fCProject.getProject(), "testMethods.h", header); waitForIndexer(fIndex, headerFile, CallHierarchyBaseTest.INDEXER_WAIT_TIME); IFile sourceFile= createFile(fCProject2.getProject(), "testMethods.cpp", source); waitForIndexer(fIndex, sourceFile, CallHierarchyBaseTest.INDEXER_WAIT_TIME); IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); CEditor editor= openEditor(sourceFile); editor.selectAndReveal(source.indexOf("method"), 2); openCallHierarchy(editor, true); Tree tree = getCHTreeViewer().getTree(); checkTreeNode(tree, 0, "MyClass::method() : void"); checkTreeNode(tree, 0, 0, "func() : void"); checkTreeNode(tree, 0, 1, "MyClass::inline_method() : void"); checkTreeNode(tree, 0, 2, "MyClass::method() : void"); editor.selectAndReveal(source.indexOf("method(); // r2"), 2); openCallHierarchy(editor); checkTreeNode(tree, 0, "MyClass::method() : void"); checkTreeNode(tree, 0, 0, "func() : void"); checkTreeNode(tree, 0, 1, "MyClass::inline_method() : void"); checkTreeNode(tree, 0, 2, "MyClass::method() : void"); editor.selectAndReveal(source.indexOf("inline_method(); // r2"), 2); openCallHierarchy(editor); checkTreeNode(tree, 0, "MyClass::inline_method() : void"); checkTreeNode(tree, 0, 0, "func() : void"); checkTreeNode(tree, 0, 1, "MyClass::inline_method() : void"); checkTreeNode(tree, 0, 2, "MyClass::method() : void"); editor.selectAndReveal(source.indexOf("method(); // r3"), 2); openCallHierarchy(editor); checkTreeNode(tree, 0, "MyClass::method() : void"); checkTreeNode(tree, 0, 0, "func() : void"); checkTreeNode(tree, 0, 1, "MyClass::inline_method() : void"); checkTreeNode(tree, 0, 2, "MyClass::method() : void"); editor.selectAndReveal(source.indexOf("inline_method(); // r3"), 2); openCallHierarchy(editor); checkTreeNode(tree, 0, "MyClass::inline_method() : void"); checkTreeNode(tree, 0, 0, "func() : void"); checkTreeNode(tree, 0, 1, "MyClass::inline_method() : void"); checkTreeNode(tree, 0, 2, "MyClass::method() : void"); } // // testMethods.h // class MyClass { // public: // void method1(); // void method2(); // void method3(); // }; // // testMethods1.cpp // #include "testMethods.h" // void MyClass::method1() { // method2(); // } // void MyClass::method3() { // } // // testMethods2.cpp // #include "testMethods.h" // void MyClass::method2() { // method3(); // } public void testMethodsInMultipleFiles() throws Exception { StringBuilder[] content= getContentsForTest(3); String header= content[0].toString(); String source1 = content[1].toString(); String source2 = content[2].toString(); IFile headerFile= createFile(fCProject.getProject(), "testMethods.h", header); IFile sourceFile1= createFile(fCProject.getProject(), "testMethods1.cpp", source1); IFile sourceFile2= createFile(fCProject2.getProject(), "testMethods2.cpp", source2); CEditor editor= openEditor(sourceFile1); waitForIndexer(fIndex, sourceFile2, CallHierarchyBaseTest.INDEXER_WAIT_TIME); editor.selectAndReveal(source1.indexOf("method3"), 2); openCallHierarchy(editor); TreeViewer tv = getCHTreeViewer(); checkTreeNode(tv.getTree(), 0, "MyClass::method3() : void"); TreeItem item= checkTreeNode(tv.getTree(), 0, 0, "MyClass::method2() : void"); checkTreeNode(tv.getTree(), 0, 1, null); tv.setExpandedState(item.getData(), true); TreeItem nextItem= checkTreeNode(item, 0, "MyClass::method1() : void"); checkTreeNode(item, 1, null); item= nextItem; tv.setExpandedState(item.getData(), true); checkTreeNode(item, 0, null); } // // testMethods.h // class MyClass { // public: // void method1(); // void method2(); // void method3(); // }; // // testMethods1.cpp // #include "testMethods.h" // void MyClass::method1() { // method2(); // } // void MyClass::method3() { // } // // testMethods2.cpp // #include "testMethods.h" // void MyClass::method2() { // method3(); // } // void MyClass::method1() { // method3(); // } public void testMultipleImplsForMethod() throws Exception { StringBuilder[] content= getContentsForTest(3); String header= content[0].toString(); String source1 = content[1].toString(); String source2 = content[2].toString(); IFile headerFile= createFile(getProject(), "testMethods.h", header); IFile sourceFile1= createFile(fCProject2.getProject(), "testMethods1.cpp", source1); IFile sourceFile2= createFile(getProject(), "testMethods2.cpp", source2); CEditor editor= openEditor(sourceFile1); waitForIndexer(fIndex, sourceFile1, CallHierarchyBaseTest.INDEXER_WAIT_TIME); waitForIndexer(fIndex, sourceFile2, CallHierarchyBaseTest.INDEXER_WAIT_TIME); editor.selectAndReveal(source1.indexOf("method3"), 2); openCallHierarchy(editor); TreeViewer tv = getCHTreeViewer(); checkTreeNode(tv.getTree(), 0, "MyClass::method3() : void"); TreeItem item0= checkTreeNode(tv.getTree(), 0, 0, "MyClass::method1() : void"); TreeItem item1= checkTreeNode(tv.getTree(), 0, 1, "MyClass::method2() : void"); checkTreeNode(tv.getTree(), 0, 2, null); // method 1 tv.setExpandedState(item0.getData(), true); checkTreeNode(item0, 0, null); // method 2 tv.setExpandedState(item1.getData(), true); TreeItem nextItem= checkTreeNode(item1, 0, "MyClass::method1() : void"); checkTreeNode(item1, 1, null); item1= nextItem; tv.setExpandedState(item1.getData(), true); checkTreeNode(item1, 0, null); } // // testMethods.h // class MyClass { // public: // void method1(); // void method2(); // void method3(); // }; // // testMethods1.cpp // #include "testMethods.h" // void MyClass::method1() { // method2(); // } // void MyClass::method3() { // } // // testMethods2.cpp // #include "testMethods.h" // void MyClass::method1() { // method3(); // } // void MyClass::method2() { // } // void main() { // MyClass mc; // mc.method1(); // } public void testReverseMultipleImplsForMethod() throws Exception { StringBuilder[] content= getContentsForTest(3); String header= content[0].toString(); String source1 = content[1].toString(); String source2 = content[2].toString(); IFile headerFile= createFile(getProject(), "testMethods.h", header); IFile sourceFile1= createFile(getProject(), "testMethods1.cpp", source1); IFile sourceFile2= createFile(getProject(), "testMethods2.cpp", source2); CEditor editor= openEditor(sourceFile2); waitForIndexer(fIndex, sourceFile2, CallHierarchyBaseTest.INDEXER_WAIT_TIME); editor.selectAndReveal(source2.indexOf("main"), 2); openCallHierarchy(editor, false); TreeViewer tv = getCHTreeViewer(); final Tree tree = tv.getTree(); checkTreeNode(tree, 0, "main() : void"); TreeItem item= checkTreeNode(tree, 0, 0, "MyClass::method1() : void"); checkTreeNode(tree, 0, 1, null); tv.setExpandedState(item.getData(), true); TreeItem item0= checkTreeNode(item, 0, "MyClass::method1() : void"); TreeItem item1= checkTreeNode(item, 1, "MyClass::method1() : void"); checkTreeNode(item, 2, null); item= null; try { tv.setExpandedState(item0.getData(), true); checkTreeNode(item0, 0, "MyClass::method2() : void"); } catch (Throwable e) { TreeItem tmp= item0; item0= item1; item1= tmp; } // method 1 tv.setExpandedState(item0.getData(), true); TreeItem nextItem= checkTreeNode(item0, 0, "MyClass::method2() : void"); checkTreeNode(item0, 1, null); item0= nextItem; tv.setExpandedState(item0.getData(), true); checkTreeNode(item0, 0, null); // method 2 tv.setExpandedState(item1.getData(), true); nextItem= checkTreeNode(item1, 0, "MyClass::method3() : void"); checkTreeNode(item1, 1, null); item1= nextItem; tv.setExpandedState(item1.getData(), true); checkTreeNode(item1, 0, null); } }