/*******************************************************************************
* Copyright (c) 2015 Wei Li
* 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:
* Wei Li - initial implementation
*******************************************************************************/
package org.eclipse.cdt.ui.tests.search;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.search.ui.ISearchResult;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.index.IIndex;
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.ui.CUIPlugin;
import org.eclipse.cdt.ui.tests.BaseUITestCase;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.search.CSearchResult;
import org.eclipse.cdt.internal.ui.search.CSearchTextSelectionQuery;
import junit.framework.TestSuite;
public class SearchReferencesAcrossLanguagesTest extends BaseUITestCase {
protected ICProject fCProject;
protected IIndex fIndex;
public SearchReferencesAcrossLanguagesTest(String name) {
super(name);
}
public static TestSuite suite() {
return suite(SearchReferencesAcrossLanguagesTest.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
fCProject = CProjectHelper.createCCProject(getName() + System.currentTimeMillis(), "bin", IPDOMManager.ID_FAST_INDEXER);
waitForIndexer(fCProject);
fIndex= CCorePlugin.getIndexManager().getIndex(fCProject);
}
@Override
protected void tearDown() throws Exception {
closeAllEditors();
if (fCProject != null) {
CProjectHelper.delete(fCProject);
}
super.tearDown();
}
protected IProject getProject() {
return fCProject.getProject();
}
// typedef struct foo_s{
// int m1;
// } foo_t;
// #include "405678.h"
// void bar_c() {
// foo_t foo;
// foo.m1 = 2;
// }
// #include "405678.h"
// void bar_cpp() {
// foo_t foo;
// foo.m1 = 1;
// }
public void testSearchReferencesAcrossLangs_405678() throws Exception {
final StringBuilder[] contents = getContentsForTest(3);
final String hcontent = contents[0].toString();
final String ccontent = contents[1].toString();
final String cppcontent = contents[2].toString();
IFile f_h= createFile(getProject(), "405678.h", hcontent);
IFile f_c= createFile(getProject(), "405678.c", ccontent);
IFile f_cpp= createFile(getProject(), "405678.cpp", cppcontent);
IIndexManager indexManager = CCorePlugin.getIndexManager();
indexManager.update(new ICElement[] {fCProject}, IIndexManager.UPDATE_ALL);
waitForIndexer(fCProject);
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
assertNotNull(page);
IEditorPart editor = IDE.openEditor(page, f_h, CUIPlugin.EDITOR_ID);
assertNotNull(editor);
CEditor ceditor = (CEditor) editor.getAdapter(CEditor.class);
assertNotNull(ceditor);
ceditor.selectAndReveal(hcontent.indexOf("m1"), 2);
ISelection sel = ceditor.getSelectionProvider().getSelection();
// Now a query is created and executed.
CSearchTextSelectionQuery query = new CSearchTextSelectionQuery(null, ceditor.getInputCElement(), (ITextSelection) sel, IIndex.FIND_REFERENCES);
IStatus status = null;
long end_ms = System.currentTimeMillis() + 1000;
do {
status = query.run(npm());
if (status == Status.CANCEL_STATUS) {
Thread.sleep(100);
}
} while(!status.isOK() && System.currentTimeMillis() < end_ms);
assertTrue("query failed: " + status.getMessage(), status.isOK());
ISearchResult result = query.getSearchResult();
assertNotNull(result);
assertTrue(result instanceof CSearchResult);
// The query should have found two references, one in the c source file and another
// in the cpp source file
CSearchResult searchResult = (CSearchResult) result;
assertEquals(2, searchResult.getMatchCount());
}
}