blob: 06f7d13682d9786075272779a7f5d2141992125e [file] [log] [blame]
/**********************************************************************
* This file is part of "Object Teams Development Tooling"-Software
*
* Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
* for its Fraunhofer Institute and Computer Architecture and Software
* Technology (FIRST), Berlin, Germany and Technical University Berlin,
* Germany.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
* $Id$
*
* Please visit http://www.eclipse.org/objectteams for updates and contact.
*
* Contributors:
* Fraunhofer FIRST - Initial API and implementation
* Technical University Berlin - Initial API and implementation
**********************************************************************/
package org.eclipse.objectteams.otdt.ui.tests.refactoring.extractmethod;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
/**
* @author brcan
*
*/
import java.io.IOException;
import java.io.InputStream;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.ui.tests.refactoring.infra.AbstractJunit4CUTestCase;
import org.eclipse.jdt.ui.tests.refactoring.rules.RefactoringTestSetup;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.CheckConditionsOperation;
import org.eclipse.ltk.core.refactoring.IUndoManager;
import org.eclipse.ltk.core.refactoring.PerformRefactoringOperation;
import org.eclipse.ltk.core.refactoring.Refactoring;
import org.eclipse.ltk.core.refactoring.RefactoringCore;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.objectteams.otdt.ui.tests.refactoring.OTRefactoringTestPlugin;
import org.junit.Rule;
@SuppressWarnings({ "nls", "restriction" })
public abstract class AbstractSelectionTestCase extends AbstractJunit4CUTestCase
{
public static final String SQUARE_BRACKET_OPEN = "/*[*/";
public static final int SQUARE_BRACKET_OPEN_LENGTH = SQUARE_BRACKET_OPEN.length();
public static final String SQUARE_BRACKET_CLOSE = "/*]*/";
public static final int SQUARE_BRACKET_CLOSE_LENGTH = SQUARE_BRACKET_CLOSE.length();
protected static final int VALID_SELECTION = 1;
protected static final int INVALID_SELECTION = 2;
protected static final int COMPARE_WITH_OUTPUT = 3;
@Rule
public RefactoringTestSetup rts= new RefactoringTestSetup();
protected int[] getSelection(String source)
{
int start = -1;
int end = -1;
int includingStart = source.indexOf(SQUARE_BRACKET_OPEN);
int excludingStart = source.indexOf(SQUARE_BRACKET_CLOSE);
int includingEnd = source.lastIndexOf(SQUARE_BRACKET_CLOSE);
int excludingEnd = source.lastIndexOf(SQUARE_BRACKET_OPEN);
if (includingStart > excludingStart && excludingStart != -1)
{
includingStart = -1;
}
else if (excludingStart > includingStart && includingStart != -1)
{
excludingStart = -1;
}
if (includingEnd < excludingEnd)
{
includingEnd = -1;
}
else if (excludingEnd < includingEnd)
{
excludingEnd = -1;
}
if (includingStart != -1)
{
start = includingStart;
}
else
{
start = excludingStart + SQUARE_BRACKET_CLOSE_LENGTH;
}
if (excludingEnd != -1)
{
end = excludingEnd;
}
else
{
end = includingEnd + SQUARE_BRACKET_CLOSE_LENGTH;
}
assertTrue("Selection invalid", start >= 0 && end >= 0 && end >= start);
int[] result = new int[] { start, end - start };
// System.out.println("|"+ source.substring(result[0], result[0] + result[1]) + "|");
return result;
}
protected ITextSelection getTextSelection(String source)
{
int[] s = getSelection(source);
return new TextSelection(s[0], s[1]);
}
protected InputStream getFileInputStream(String fileName) throws IOException
{
return OTRefactoringTestPlugin.getDefault().getTestResourceStream(fileName);
}
//{ObjectTeams: fixing a JDT-problem: couldn't cope with package paths > 1
protected ICompilationUnit createCU(IPackageFragment pack, String name) throws Exception {
name= adaptName(name);
return createCU(pack, name, getFileInputStream(myGetFilePath(pack, name)));
}
protected String myGetFilePath(String path, String name) {
return getResourceLocation() + path + "/" + name;
}
protected String myGetFilePath(IPackageFragment pack, String name) {
return myGetFilePath(pack.getElementName().replace('.','/'), name); // <-- the patch: force the package path to use '/'
}
// SH}
protected void performTest(
final ICompilationUnit unit,
final Refactoring refactoring,
int mode,
final String out,
boolean doUndo) throws Exception
{
IProgressMonitor pm = new NullProgressMonitor();
switch (mode)
{
case VALID_SELECTION:
assertTrue(checkPreconditions(refactoring, pm).isOK());
break;
case INVALID_SELECTION:
assertTrue(!checkPreconditions(refactoring, pm).isOK());
break;
case COMPARE_WITH_OUTPUT:
IUndoManager undoManager = RefactoringCore.getUndoManager();
undoManager.flush();
String original = unit.getSource();
PerformRefactoringOperation op = new PerformRefactoringOperation(
refactoring, getCheckingStyle());
JavaCore.run(op, new NullProgressMonitor());
assertTrue("Precondition check failed", !op.getConditionStatus().hasFatalError());
assertTrue("Validation check failed", !op.getValidationStatus().hasFatalError());
assertNotNull("No Undo", op.getUndoChange());
compareSource(unit.getSource(), out);
Change undo = op.getUndoChange();
assertNotNull("Undo doesn't exist", undo);
assertTrue("Undo manager is empty", undoManager.anythingToUndo());
if (doUndo)
{
undoManager.performUndo(null, new NullProgressMonitor());
assertTrue("Undo manager still has undo", !undoManager.anythingToUndo());
assertTrue("Undo manager is empty", undoManager.anythingToRedo());
compareSource(original, unit.getSource());
}
break;
}
}
protected RefactoringStatus checkPreconditions(
Refactoring refactoring,
IProgressMonitor pm) throws CoreException
{
CheckConditionsOperation op =
new CheckConditionsOperation(refactoring, getCheckingStyle());
op.run(new NullProgressMonitor());
return op.getStatus();
}
protected int getCheckingStyle()
{
return CheckConditionsOperation.ALL_CONDITIONS;
}
}