From e31d51988d8474ff0fe186346062a4739c08e181 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Mon, 5 Dec 2016 16:33:52 -0500 Subject: [PATCH] Bug 491343 - Find references with only polymorphic results This commit also adds infrastructure for testing 'Find References'. Change-Id: Ibe33dd00dd178587b202a9ebb1dd29315711f6fb --- .../cdt/ui/tests/search/BasicSearchTest.java | 38 +--------- .../ui/tests/search/FindReferencesTest.java | 73 +++++++++++++++++++ .../cdt/ui/tests/search/SearchTestBase.java | 64 ++++++++++++++++ .../cdt/ui/tests/search/SearchTestSuite.java | 1 + .../cdt/internal/ui/search/CSearchQuery.java | 2 +- 5 files changed, 140 insertions(+), 38 deletions(-) create mode 100644 core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/FindReferencesTest.java create mode 100644 core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/SearchTestBase.java diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/BasicSearchTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/BasicSearchTest.java index 5db08148128..c99a0039a06 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/BasicSearchTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/BasicSearchTest.java @@ -35,55 +35,25 @@ import org.eclipse.search.ui.ISearchResult; import org.eclipse.search.ui.ISearchResultPage; import org.eclipse.search.ui.ISearchResultViewPart; import org.eclipse.search.ui.NewSearchUI; -import org.osgi.framework.Bundle; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IPDOMManager; import org.eclipse.cdt.core.index.IIndexManager; import org.eclipse.cdt.core.model.ICElement; -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.core.testplugin.util.TestSourceReader; -import org.eclipse.cdt.ui.testplugin.CTestPlugin; -import org.eclipse.cdt.ui.tests.BaseUITestCase; import org.eclipse.cdt.internal.ui.search.CSearchPatternQuery; import org.eclipse.cdt.internal.ui.search.CSearchQuery; import org.eclipse.cdt.internal.ui.search.CSearchResult; import org.eclipse.cdt.internal.ui.search.CSearchViewPage; -public class BasicSearchTest extends BaseUITestCase { - ICProject fCProject; - CharSequence[] testData; +public class BasicSearchTest extends SearchTestBase { public static TestSuite suite() { return suite(BasicSearchTest.class); } - - @Override - protected void setUp() throws Exception { - super.setUp(); - fCProject = CProjectHelper.createCCProject(getName() + System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER); - Bundle b = CTestPlugin.getDefault().getBundle(); - testData = TestSourceReader.getContentsForTest(b, "ui", this.getClass(), getName(), 2); - assertEquals("Incomplete test data", 2, testData.length); - - IFile file = TestSourceReader.createFile(fCProject.getProject(), new Path("header.h"), testData[0].toString()); - CCorePlugin.getIndexManager().setIndexerId(fCProject, IPDOMManager.ID_FAST_INDEXER); - waitForIndexer(fCProject); - - IFile cppfile= TestSourceReader.createFile(fCProject.getProject(), new Path("references.cpp"), testData[1].toString()); - waitForIndexer(fCProject); - } - - @Override - protected void tearDown() throws Exception { - if (fCProject != null) { - fCProject.getProject().delete(true, npm()); - } - super.tearDown(); - } // // empty @@ -307,12 +277,6 @@ public class BasicSearchTest extends BaseUITestCase { return new CSearchPatternQuery(new ICElement[] {fCProject}, scope1, pattern, true, CSearchQuery.FIND_ALL_OCCURRENCES | CSearchPatternQuery.FIND_ALL_TYPES); } - private void assertOccurrences(CSearchQuery query, int expected) { - query.run(npm()); - CSearchResult result= (CSearchResult) query.getSearchResult(); - assertEquals(expected, result.getMatchCount()); - } - // void foo() {} // void bar() { diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/FindReferencesTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/FindReferencesTest.java new file mode 100644 index 00000000000..b2b61ce9aed --- /dev/null +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/FindReferencesTest.java @@ -0,0 +1,73 @@ +/******************************************************************************* + * Copyright (c) 2016 Nathan Ridge. + * 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 + *******************************************************************************/ +package org.eclipse.cdt.ui.tests.search; + +import org.eclipse.jface.text.TextSelection; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.part.FileEditorInput; + +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.cdt.ui.testplugin.EditorTestHelper; + +import org.eclipse.cdt.internal.ui.editor.CEditor; +import org.eclipse.cdt.internal.ui.search.CSearchQuery; +import org.eclipse.cdt.internal.ui.search.CSearchTextSelectionQuery; + +import junit.framework.TestSuite; + +/** + * Test the "Find References" source navigation feature. The code implementing + * this feature is org.eclipse.cdt.internal.ui.search.actions.FindRefsAction, + * although this test operates one level lower, creating a + * CSearchTextSelectionQuery directly. + */ +public class FindReferencesTest extends SearchTestBase { + public static TestSuite suite() { + return suite(FindReferencesTest.class); + } + + private CSearchQuery makeProjectQuery(int offset, int length) { + IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + IEditorPart part = null; + try { + part = page.openEditor(new FileEditorInput(fHeaderFile), "org.eclipse.cdt.ui.editor.CEditor"); //$NON-NLS-1$ + } catch (PartInitException e) { + assertFalse(true); + } + assertInstance(part, CEditor.class); + CEditor editor = (CEditor) part; + EditorTestHelper.joinReconciler(EditorTestHelper.getSourceViewer(editor), 100, 5000, 10); + ITranslationUnit tu = editor.getInputCElement(); + return new CSearchTextSelectionQuery(new ICElement[] { fCProject }, tu, new TextSelection(offset, length), + CSearchQuery.FIND_REFERENCES); + } + + // struct A { + // virtual void waldo(); + // }; + // + // struct B : public A { + // virtual void waldo() override; + // }; + // + // int main() { + // A* a = new B(); + // a->waldo(); + // } + + // // empty file + public void testOnlyPolymorphicMatches_bug491343() throws Exception { + int offset = fHeaderContents.indexOf("waldo() override"); + CSearchQuery query = makeProjectQuery(offset, 5); + assertOccurrences(query, 1); + } +} diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/SearchTestBase.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/SearchTestBase.java new file mode 100644 index 00000000000..272706458a3 --- /dev/null +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/SearchTestBase.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2016 Nathan Ridge 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 + *******************************************************************************/ +package org.eclipse.cdt.ui.tests.search; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.Path; +import org.osgi.framework.Bundle; + +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.util.TestSourceReader; +import org.eclipse.cdt.ui.testplugin.CTestPlugin; +import org.eclipse.cdt.ui.tests.BaseUITestCase; + +import org.eclipse.cdt.internal.ui.search.CSearchQuery; +import org.eclipse.cdt.internal.ui.search.CSearchResult; + +/** + * Base class for tests that test functionality based on CSearchQuery. + */ +public abstract class SearchTestBase extends BaseUITestCase { + ICProject fCProject; + String fHeaderContents; + IFile fHeaderFile; + CharSequence[] testData; + + @Override + protected void setUp() throws Exception { + super.setUp(); + fCProject = CProjectHelper.createCCProject(getName() + System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER); + Bundle b = CTestPlugin.getDefault().getBundle(); + testData = TestSourceReader.getContentsForTest(b, "ui", this.getClass(), getName(), 2); + assertEquals("Incomplete test data", 2, testData.length); + + fHeaderContents = testData[0].toString(); + fHeaderFile = TestSourceReader.createFile(fCProject.getProject(), new Path("header.h"), fHeaderContents); + CCorePlugin.getIndexManager().setIndexerId(fCProject, IPDOMManager.ID_FAST_INDEXER); + waitForIndexer(fCProject); + + IFile cppfile= TestSourceReader.createFile(fCProject.getProject(), new Path("references.cpp"), testData[1].toString()); + waitForIndexer(fCProject); + } + + @Override + protected void tearDown() throws Exception { + if (fCProject != null) { + fCProject.getProject().delete(true, npm()); + } + super.tearDown(); + } + + protected void assertOccurrences(CSearchQuery query, int expected) { + query.run(npm()); + CSearchResult result= (CSearchResult) query.getSearchResult(); + assertEquals(expected, result.getMatchCount()); + } +} diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/SearchTestSuite.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/SearchTestSuite.java index ea14cb7095b..d9687469a7b 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/SearchTestSuite.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/SearchTestSuite.java @@ -22,5 +22,6 @@ public class SearchTestSuite extends TestSuite { addTest(BasicSearchTest.suite()); addTest(LinkedNamesFinderTest.suite()); addTest(SearchReferencesAcrossLanguagesTest.suite()); + addTest(FindReferencesTest.suite()); } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchQuery.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchQuery.java index a29539c667e..541a3ed87b8 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchQuery.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchQuery.java @@ -392,7 +392,7 @@ public abstract class CSearchQuery implements ISearchQuery { } } - if (!names.isEmpty()) { + if (!(names.isEmpty() && (polymorphicNames == null || polymorphicNames.isEmpty()))) { collectNames(index, names, polymorphicNames); } }