/*******************************************************************************
* Copyright (c) 2005, 2010 Wind River Systems, Inc.
* 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.refactoring.rename;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.RefactoringStatusEntry;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.index.IIndexManager;
import org.eclipse.cdt.internal.ui.refactoring.rename.CRefactoringArgument;
import org.eclipse.cdt.internal.ui.refactoring.rename.CRefactory;
import org.eclipse.cdt.internal.ui.refactoring.rename.CRenameProcessor;
import org.eclipse.cdt.internal.ui.refactoring.rename.CRenameRefactoring;
import org.eclipse.cdt.internal.ui.refactoring.rename.TextSearchWrapper;
/**
* @author markus.schorn@windriver.com
*/
public class RenameTests extends RefactoringTests {
private static final IProgressMonitor NPM = new NullProgressMonitor();
public RenameTests(String name) {
super(name);
}
public RenameTests() {
}
/**
* @param element The CElement to rename
* @param newName The new name for the element
* @return
* @throws Exception
*/
public Change getRefactorChanges(IFile file, int offset, String newName) throws Exception {
CRenameRefactoring proc = createRefactoring(file, offset, newName);
((CRenameProcessor) proc.getProcessor()).lockIndex();
try {
RefactoringStatus rs = checkConditions(proc);
if (!rs.hasError()) {
Change change = proc.createChange( new NullProgressMonitor() );
return change;
}
fail ("Input check on "+ newName + " failed. "+rs.getEntryMatchingSeverity(RefactoringStatus.ERROR) ); //$NON-NLS-1$ //$NON-NLS-2$
//rs.getFirstMessage(RefactoringStatus.ERROR) is not the message displayed in
//the UI for renaming a method to a constructor, the first message which is only
//a warning is shown in the UI. If you click preview, then the error and the warning
//is shown.
return null;
} finally {
((CRenameProcessor) proc.getProcessor()).unlockIndex();
}
}
private CRenameRefactoring createRefactoring(IFile file, int offset, String newName) {
CRefactoringArgument arg= new CRefactoringArgument(file, offset, 0);
CRenameProcessor proc= new CRenameProcessor(CRefactory.getInstance(), arg);
proc.setReplacementText( newName );
proc.setSelectedOptions(-1);
proc.setExhaustiveSearchScope(TextSearchWrapper.SCOPE_WORKSPACE);
return new CRenameRefactoring(proc);
}
public String[] getRefactorMessages(IFile file, int offset, String newName) throws Exception {
String[] result;
CRenameRefactoring proc = createRefactoring(file, offset, newName);
((CRenameProcessor) proc.getProcessor()).lockIndex();
try {
RefactoringStatus rs = checkConditions(proc);
if (!rs.hasWarning()){
fail ("Input check on "+ newName + " passed. There should have been warnings or errors. ") ; //$NON-NLS-1$ //$NON-NLS-2$
return null;
}
RefactoringStatusEntry[] rse = rs.getEntries();
result = new String[rse.length];
for (int i=0; i< rse.length; i++){
RefactoringStatusEntry entry = rse[i];
result[i]=entry.getMessage();
}
return result;
} finally {
((CRenameProcessor) proc.getProcessor()).unlockIndex();
}
}
public RefactoringStatus checkConditions(IFile file, int offset, String newName) throws Exception {
CRenameRefactoring proc = createRefactoring(file, offset, newName);
((CRenameProcessor) proc.getProcessor()).lockIndex();
try {
return checkConditions(proc);
} finally {
((CRenameProcessor) proc.getProcessor()).unlockIndex();
}
}
private RefactoringStatus checkConditions(CRenameRefactoring proc) throws CoreException {
RefactoringStatus rs =proc.checkInitialConditions(new NullProgressMonitor() );
if (!rs.hasError()){
rs= proc.checkFinalConditions(new NullProgressMonitor());
}
return rs;
}
public int getRefactorSeverity(IFile file, int offset, String newName) throws Exception {
CRenameRefactoring proc = createRefactoring(file, offset, newName);
((CRenameProcessor) proc.getProcessor()).lockIndex();
try {
RefactoringStatus rs = checkConditions(proc);
return rs.getSeverity();
} finally {
((CRenameProcessor) proc.getProcessor()).unlockIndex();
}
}
protected int countOccurrences(String contents, String lookup) {
int idx= contents.indexOf(lookup);
int count= 0;
while (idx >= 0) {
count++;
idx= contents.indexOf(lookup, idx+lookup.length());
}
return count;
}
protected void waitForIndexer() throws InterruptedException {
final IIndexManager im = CCorePlugin.getIndexManager();
assertTrue(im.joinIndexer(10000, NPM));
int sleep= 1;
while (im.isIndexerSetupPostponed(cproject)) {
Thread.sleep(sleep);
sleep *= 2;
assertTrue(sleep < 2000);
}
assertTrue(im.joinIndexer(10000, NPM));
}
@Override
protected IFile importFile(String fileName, String contents)
throws Exception {
IFile result= super.importFile(fileName, contents);
waitForIndexer();
return result;
}
}