package org.testng.eclipse.launch.tester;
import org.eclipse.core.expressions.PropertyTester;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jdt.core.IJavaElement;
import java.util.HashSet;
import java.util.Set;
/**
* The generic property tester used by TestNG. Supports various properties:
* - isTest: TestNG class or test method
* - isSuite: suite file (XML or YAML)
* - isXmlSuite: suite file (XML only)
*
* @author Cedric Beust <cedric@beust.com>
*/
public class TestNGPropertyTester extends PropertyTester {
private static final Set<String> PROPERTIES = new HashSet<String>() {{
add("isTest");
add("isSuite");
add("isXmlSuite");
}};
private static final boolean VERBOSE = false;
private JavaTypeExtender m_typeExtender= new JavaTypeExtender();
private FileExtender m_fileExtender= new FileExtender();
public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
p("Testing property:" + property + " receiver:" + receiver);
boolean result = false;
if (!(receiver instanceof IAdaptable)) {
throw new IllegalArgumentException("Element must be of type 'IAdaptable', is "
+ receiver == null ? "null" : receiver.getClass().getName()); //$NON-NLS-1$ //$NON-NLS-2$
}
if (! PROPERTIES.contains(property)) {
throw new IllegalArgumentException("Unknown test property '" + property +"'");
}
if ("isTest".equals(property)) {
result = isTestClass(receiver, property, args, expectedValue);
} else {
boolean xmlOnly = "isXmlSuite".equals(property);
result = isTestSuite(receiver, property, args, expectedValue, xmlOnly);
}
return result;
}
private boolean isTestClass(Object receiver, String property, Object[] args,
Object expectedValue) {
if (receiver instanceof IJavaElement) {
return m_typeExtender.test(receiver, property, args, expectedValue);
}
else {
IAdaptable adaptable= (IAdaptable) receiver;
IJavaElement element= (IJavaElement) adaptable.getAdapter(IJavaElement.class);
if(null != element) {
return m_typeExtender.test(element, property, args, expectedValue);
}
}
return false;
}
private boolean isTestSuite(Object receiver, String property, Object[] args,
Object expectedValue, boolean xmlOnly) {
if(receiver instanceof IFile) {
return m_fileExtender.test(receiver, property, args, expectedValue, xmlOnly);
}
else {
IAdaptable adaptable= (IAdaptable) receiver;
IFile file= (IFile) adaptable.getAdapter(IFile.class);
if(null != file) {
return m_fileExtender.test(file, property, args, expectedValue, xmlOnly);
}
}
return false;
}
private static void p(String s) {
if (VERBOSE) {
System.out.println("[TestNGPropertyTester] " + s);
}
}
}