package org.testng.eclipse.launch;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.AssertionFailedException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.testng.eclipse.TestNGPlugin;
import org.testng.eclipse.launch.components.ITestContent;
import org.testng.eclipse.ui.util.TypeParser;
import org.testng.eclipse.util.JDTUtil;
import org.testng.eclipse.util.LaunchUtil;
import org.testng.eclipse.util.SuiteFileValidator;
/**
* Base class for Run/Debug contextual actions. Handles TestNG tests, but no
* suites yet.
*
* @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru Popescu</a>
*/
public abstract class AbstractTestNGLaunchDelegate implements IEditorActionDelegate {
private IAction m_action;
private IEditorPart m_editorPart;
private IProject m_project;
private ICompilationUnit m_compilationUnit;
private Map m_launchAttributes= new HashMap();
private String m_configName;
private String m_actionText= "";
private boolean m_isSuite= false;
private boolean m_enabled= false;
protected abstract String getLaunchMode();
protected abstract String getCommandPrefix();
protected abstract String getTestShortcut();
protected abstract String getSuiteShortcut();
public void setActiveEditor(IAction action, IEditorPart targetEditor) {
m_action= action;
m_editorPart= targetEditor;
update();
}
public void selectionChanged(IAction action, ISelection selection) {
}
private void update() {
if(null == m_action || null == m_editorPart) {
return;
}
m_enabled= false;
m_launchAttributes.clear();
IEditorInput editorInput= m_editorPart.getEditorInput();
if(editorInput instanceof IFileEditorInput) {
IFile file= ((IFileEditorInput) editorInput).getFile();
m_project= file.getProject();
m_actionText= getCommandPrefix();
if("java".equals(file.getFileExtension())) {
m_actionText+= " test";
m_compilationUnit= JDTUtil.getJavaElement(file);
IType[] types= getTypes(m_compilationUnit);
IType mainType= getMainType(m_compilationUnit, types);
if(null == types || null == mainType || !hasSource(mainType)) {
return;
}
ITestContent testContent = TypeParser.parseType(mainType);
if(testContent.isTestNGClass()) {
m_enabled= true;
m_configName= mainType.getElementName();
m_launchAttributes= LaunchUtil.createClassLaunchConfigurationMap(mainType, types, testContent.getAnnotationType());
}
}
// else if("xml".equals(file.getFileExtension())) {
// m_actionText+= " suite";
//
// if(isSuiteDefinition(file)) {
// m_launchAttributes.put(TestNGLaunchConfigurationConstants.TYPE, SUITE_TYPE);
// m_launchAttributes.put(TestNGLaunchConfigurationConstants.SUITE_TEST_LIST,
// Utils.stringToList(file.getProjectRelativePath().toOSString()));
// m_configName= file.getProjectRelativePath().toString().replace('/', '.');
// m_isSuite= true;
// isTestNGenabled= true;
// }
// }
m_action.setEnabled(m_enabled);
m_action.setText(m_actionText);
}
}
/**
* @param compilationUnit
* @param types
* @return
*/
private IType getMainType(ICompilationUnit compilationUnit, IType[] types) {
IType mainType= null;
try {
mainType= compilationUnit.findPrimaryType();
}
catch(AssertionFailedException failure) {
; //ignore
}
if(null == mainType && null != types && types.length > 0) {
mainType= types[0];
}
return mainType;
}
public void run(IAction action) {
if(!m_enabled) return;
LaunchUtil.launchMapConfiguration(m_project, m_configName, m_launchAttributes, m_compilationUnit, getLaunchMode());
}
protected IType[] getTypes(ICompilationUnit compilationUnit) {
try {
return compilationUnit.getTypes();
}
catch(JavaModelException jme) {
TestNGPlugin.log(jme);
}
return null;
}
/* protected IType[] getTypes(IFile file) {
try {
ICompilationUnit compilationUnit= JDTUtil.getJavaElement(file);
return compilationUnit.getTypes();
}
catch(JavaModelException jme) {
TestNGPlugin.log(jme);
}
return null;
}*/
private boolean hasSource(IType type) {
try {
return type.getSource() != null;
}
catch(JavaModelException jme) {
TestNGPlugin.log(jme);
}
return false;
}
protected boolean isSuiteDefinition(IFile file) {
try {
return SuiteFileValidator.isSuiteDefinition(file);
}
catch(CoreException ce) {
TestNGPlugin.log(ce);
}
return false;
}
}